遠程訪問工具-升級版

前言

來啦老鐵氛改!

前段時間寫了一篇文章:快看,這有一款遠程訪問工具比伏!

當時手搓了一個看起來很 cheap 的前端胜卤,實在上不了臺面!

于是抽空對其做了一次升級赁项,同時也在后端做了一點提升葛躏,先睹為快:

圖1
圖2
圖3
圖4

簡單做一下說明:

  1. 前端改用 vue3+element-plus+axios澈段;
  2. 前端頁面做了重構(gòu),分成主頁(圖1)跟設(shè)備實時瀏覽頁面(圖4)舰攒,這樣就能一邊執(zhí)行代碼败富,一邊實時查看被測對象的表現(xiàn)了;
  3. 首頁增加 Ping摩窃、Boot Up 入口兽叮,Ping 能對所有遠程服務(wù)進行 ping 操作,獲得遠程服務(wù)的狀態(tài)猾愿,Boot Up 入口能對掉線的遠程服務(wù)進行重啟操作(也可開放重啟遠程服務(wù)等操作)鹦聪;
  4. 首頁右側(cè)的電腦畫面更新頻率改為0.8秒一次(原 1秒一次),讓畫面更為實時蒂秘,同時具備隱藏畫面等功能入口泽本;
  5. 左側(cè)側(cè)邊欄,每個服務(wù) item 中有一個小小的手機 icon材彪,點擊打開另一個“被測對象實時查看器”頁面 tab,默認選擇所有設(shè)備進行展示琴儿,讓用戶能一次性知道所有發(fā)生的情況段化,能對每個設(shè)備進行一些基本的操作;
  6. 考慮到存在多個用戶打開同一服務(wù)的“被測對象實時查看器”造成,對后端服務(wù)帶來過分的壓力显熏,從而容易導(dǎo)致后端服務(wù)掛掉,因此在后端采用:減小圖片尺寸+降低圖片質(zhì)量+多線程+緩存策略(3 秒以內(nèi)晒屎,同一臺設(shè)備的截圖都一樣喘蟆,3 秒后會刷新截圖),目前就簡單緩存在后端服務(wù)的內(nèi)存中(多線程+緩存能解決 ADB I/O 阻塞問題鼓鲁,代價是沒那么“實時”)蕴轨。后端代碼如:
cache_duration = 3


@app.get("/bridge/adb_screenshot")
async def do_adb_screenshot(device_id: str):
    """
    do adb screenshot
    :param device_id: android device's serial number
    :return: screenshot of current android device
    """
    try:
        if device_id in device_screenshots:
            cached_img_stream, screenshot_time = device_screenshots[device_id]
            if (time.time() - screenshot_time) > cache_duration:
                thread = threading.Thread(target=ScreenshotUtil.get_adb_screenshot, args=(device_id,))
                thread.start()
            return StreamingResponse(BytesIO(cached_img_stream), media_type='image/jpeg')

        thread = threading.Thread(target=ScreenshotUtil.get_adb_screenshot, args=(device_id,))
        thread.start()
        return JSONResponse(status_code=200, content={"message": "Please wait..."})
    except Exception as e:
        return JSONResponse(status_code=500, content={"error": str(e)})

其中,使用 screenshots.py 文件進行圖片數(shù)據(jù)緩存骇吭,screenshots.py 內(nèi)的代碼就一行:

device_screenshots = {}

ScreenshotUtil 內(nèi)的 get_adb_screenshot 方法如下:

@staticmethod
    def get_adb_screenshot(device_id):
        try:
            print("Take screenshot...")
            result = subprocess.run(
                ["adb", "-s", device_id, "exec-out", "screencap", "-p"],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                timeout=5
            )

            if result.returncode != 0:
                return {"error": "Failed to capture screenshot by adb", "details": result.stderr.decode()}

            img = Image.open(BytesIO(result.stdout))
            new_width = int(img.width * 0.4)
            new_height = int(img.height * 0.4)
            img = img.resize((new_width, new_height))
            # set image's quality to 40% of original one
            output_stream = BytesIO()
            img.convert("RGB").save(output_stream, format='JPEG', quality=40)
            output_stream.seek(0)

            device_screenshots[device_id] = (output_stream.getvalue(), time.time())

            return {"message": "success", "device_id": device_id}
        except subprocess.TimeoutExpired:
            return {"error": "Timeout expired while trying to capture screenshot."}
        except Exception as e:
            return {"error": "An error occurred.", "details": str(e)}
  1. 前端代碼倉庫:由于內(nèi)含 ip橙弱,較為敏感,暫時不公開燥狰,有需要可以私信我棘脐;
  2. 后端代碼倉庫:https://github.com/dylanz666/debug-bridge-server.git

展望:

  1. 考慮加入截圖生成視頻的功能;
  2. 研究更為實時的“被測對象實時查看器”龙致;
    (原本想考慮使用 websocket 或者 SSE(Server-Sent Events)來更為實時同步設(shè)備畫面蛀缝,但是會卡在畫面無法渲染方面,后續(xù)可以考慮再調(diào)研調(diào)研目代。)

好了屈梁,今天就記錄到這里啦嗤练,下期再見嘍~

如果本文對您有幫助,麻煩動動手指點點贊俘闯?

謝謝潭苞!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市真朗,隨后出現(xiàn)的幾起案子此疹,更是在濱河造成了極大的恐慌,老刑警劉巖遮婶,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗碎,死亡現(xiàn)場離奇詭異,居然都是意外死亡旗扑,警方通過查閱死者的電腦和手機蹦骑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀防,“玉大人眠菇,你說我怎么就攤上這事「ぶ裕” “怎么了捎废?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長致燥。 經(jīng)常有香客問我登疗,道長,這世上最難降的妖魔是什么嫌蚤? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任辐益,我火速辦了婚禮,結(jié)果婚禮上脱吱,老公的妹妹穿的比我還像新娘智政。我一直安慰自己,他們只是感情好箱蝠,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布女仰。 她就那樣靜靜地躺著,像睡著了一般抡锈。 火紅的嫁衣襯著肌膚如雪疾忍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天床三,我揣著相機與錄音一罩,去河邊找鬼。 笑死撇簿,一個胖子當著我的面吹牛聂渊,可吹牛的內(nèi)容都是我干的差购。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汉嗽,長吁一口氣:“原來是場噩夢啊……” “哼欲逃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饼暑,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稳析,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弓叛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彰居,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年撰筷,在試婚紗的時候發(fā)現(xiàn)自己被綠了陈惰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毕籽,死狀恐怖抬闯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情关筒,我是刑警寧澤溶握,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站平委,受9級特大地震影響奈虾,放射性物質(zhì)發(fā)生泄漏夺谁。R本人自食惡果不足惜廉赔,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匾鸥。 院中可真熱鬧蜡塌,春花似錦、人聲如沸勿负。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奴愉。三九已至琅摩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锭硼,已是汗流浹背房资。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留檀头,地道東北人轰异。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓岖沛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搭独。 傳聞我的和親對象是個殘疾皇子婴削,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355