dsh-scrcpy-mirror:把安卓手機畫面投進 DSH 對話

前言

在 DSH 裏做自動化,經常需要「看一眼手機屏幕」。scrcpy 本身能把安卓畫面投到電腦,但它是命令行工具:要記參數、要判斷當前是 USB 還是無線、要查手機的 IP、手機重啓之後還要重新 adb tcpip。每一步都能做,每一步都要人手動判斷。

gem-gti/dsh-scrcpy-mirror 做的事情就是把這些判斷封裝成一個 DSH 插件,讓模型可以通過 phone_mirror 工具直接啓動投屏、查狀態、截圖。下面介紹它提供了哪些能力、怎麼裝、怎麼用。

這是什麼

由 gem-gti 維護的客戶端類插件,基於 scrcpy 把安卓手機畫面投到 Windows 電腦。它本身不含客戶端部分,只提供工具與命令:

  • 給模型用的 phone_mirror 工具,支持 status / start / stop / connect / screenshot
  • 給使用者用會話命令 /mirror,不經過模型,直接在輸入框執行

平臺與宿主要求

  • 僅 Windows(依賴 scrcpy.exe / adb.exe)
  • 宿主:DeepSeek Harness >=0.2.0-rc.1 <0.3.0-0
  • 本機需已安裝 scrcpy,package.json 裏 engines.node 要求 >=20

核心功能

phone_mirror 工具的各 action:

action 做什麼
status 查看 scrcpy/adb 路徑、當前網關、5555 端口是否開放、已授權設備、正在運行的投屏進程
start 啓動投屏:USB 優先,沒有 USB 就自動讀網關走無線
stop 結束投屏進程
connect 開啓 5555 並連上無線(手機重啓後必須跑一次)
screenshot 通過 adb exec-out screencap 截一張手機屏幕,返回 PNG 路徑

除了給模型用的工具,插件還註冊了一個會話命令,在輸入框直接敲即可:

/mirror              啓動投屏(等同 start)
/mirror stop         停止投屏
/mirror status       查看設備與連接狀態
/mirror connect      手機重啓後重連無線
/mirror screenshot   截一張手機屏幕

命令走 Host 側的 ctx.commands.register,結果以純文本顯示在會話裏。

安裝與啓用

以下命令來自插件 README,均爲 PowerShell。先選其中一種安裝方式,再重啓 DSH 或在插件頁啓用 phone-mirror。

本地目錄(開發調試):

dsh plugin --profile desktop add "D:\path\to\dsh-scrcpy-mirror"

本地 tarball:

npm pack
dsh plugin --profile desktop add ".\mu-dsh-scrcpy-mirror-0.2.0.tgz"

從 npm 安裝(發佈後):

dsh plugin --profile desktop add dsh-scrcpy-mirror

社區市場:發佈到 npm 並被目錄源(如 DSH 1024Store)收錄後,在 DSH 的「社區市場 → 可安裝」裏搜索 Phone Mirror 點擊安裝即可。

典型用法

安裝後在對話裏直接說「幫我看看手機投屏狀態」「開一下手機投屏」「手機重啓了,無線連不上了」「截一張手機屏幕給我」,模型會依次調用:

{ "action": "status" }
{ "action": "start" }
{ "action": "connect" }
{ "action": "screenshot" }

status 的返回示例(節選自 README):

scrcpy: C:\Users\...\scrcpy.exe
adb: C:\Users\...\adb.exe
網關(連着手機熱點時即手機 IP): 10.99.177.119
網關 5555 端口: 開放
設備:
  - VCJFK7WSLNS8TOEQ(USB)
  - 10.99.177.119:5555(無線)
投屏進程: 127224

這個例子本身說明了它將手機 IP 推斷成網關:連着手機熱點時,網關即手機地址。

配置

cordis.patch.yml 裏該行的 config 可以覆蓋默認值:

- insert:
    - id: phone-mirror
      name: dsh-scrcpy-mirror
      config:
        maxSize: "1280"        # 畫面最長邊,越大越清晰
        bitRate: "6M"          # 視頻碼率;USB 可 8M,無線建議 4M~6M
        audioSource: output    # output=抓全系統聲音且手機靜音 / playback / mic
        turnScreenOff: true    # 手機熄屏但投屏繼續
        alwaysOnTop: true      # 投屏窗口置頂
        shortcutMod: lctrl     # 快捷鍵修飾鍵:lctrl(推薦)/ lalt
        adbPort: 5555
        scrcpyPath: ""         # 留空則自動在 winget 目錄與 PATH 中查找
        adbPath: ""

前置條件

1、電腦裝好 scrcpy:

winget install --id Genymobile.scrcpy

2、手機開啓「開發者選項 → USB 調試」。
3、首次插線時在手機上點「允許 USB 調試」。
4、想無線投屏:電腦連手機熱點(或同一 WiFi),跑一次 connect。

實現說明

插件調用外部命令(adb / ipconfig / tasklist / taskkill / scrcpy)時不使用管道,而是用 spawn + 文件句柄直寫臨時文件再讀取。原因是 DSH 宿主可能在受限沙箱裏運行插件工具,管道式 stdio 會被直接拒絕(spawn EPERM),表現爲「命令靜默失敗、設備永遠查不到」。

手機 IP 的推斷也不是隻靠 IPv4 默認網關——README 提到小米/澎湃熱點常常只下發 IPv6 網關,所以回退順序是:IPv4 網關 → DHCP 服務器(就是手機)→ 同網段 .1。

適用場景與注意

適合在 Windows 上用 DSH 做 Android 相關自動化的開發者:需要讓模型能主動查看手機畫面、截圖,或讓使用者不經過模型也能一鍵投屏。

幾點需要注意:

  • 僅 Windows 可用,taskkill / ipconfig / winget 路徑都按 Windows 實現。
  • 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(本項目爲 MIT,投屏能力來自 Apache-2.0 的 scrcpy,本項目不打包其二進制,僅調用本機已安裝版本)。
  • 手機重啓後無線必然失效,這是 adb 的限制,需要插一次線跑 connect。
  • 小米/澎湃機型上,scrcpy 自帶的「點亮屏幕」快捷鍵常被系統攔掉,插件不提供喚醒,需要按手機電源鍵。
  • 投屏窗口是 scrcpy 自己的窗口,不在 DSH 界面內。
  • README 還說明了一點:該插件不含客戶端部分,原因是 DSH 的自定義 Host 服務需要 Typert 編譯器生成的 ./typert 入口才能被 remote.xxx 訪問,手寫 bundle 沒有該產物,客戶端注入會一直等待並拖垮整個前端啓動。所以本插件只提供工具與命令。

結尾

這個插件把 scrcpy 的命令行操作收斂成一個工具和一個命令,適合 Windows 上需要讓模型直接查看/操作 Android 畫面的場景。目錄頁見 https://www.skillhub.cn/plugins/gem-gti/dsh-scrcpy-mirror,源碼見 https://github.com/gem-gti/dsh-scrcpy-mirror。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜