dsh-scrcpy-mirror
把安卓手机画面投到电脑的 DSH 插件 —— 基于 scrcpy。 装好之后,你只要在对话里说一句「帮我开手机投屏」,模型就会调用
phone_mirror工具。
平台:仅 Windows(依赖 scrcpy.exe / adb.exe)
依赖:本机已安装 scrcpy(winget install --id Genymobile.scrcpy)
宿主:DeepSeek Harness >=0.2.0-rc.1 <0.3.0-0
它解决什么问题
scrcpy 本身是命令行工具,每次都要记参数、查 IP、判断 USB 还是无线、手机重启后还要重新 adb tcpip。
这个插件把这些判断全部封装进一个工具:
| action | 做什么 |
|---|---|
status |
查看 scrcpy/adb 路径、当前网关、5555 端口是否开放、已授权设备、正在运行的投屏进程 |
start |
启动投屏:USB 优先,没有 USB 就自动读网关走无线 |
stop |
结束投屏进程 |
connect |
开启 5555 并连上无线(手机重启后必须跑一次) |
screenshot |
通过 adb exec-out screencap 截一张手机屏幕,返回 PNG 路径 |
/mirror 命令
除了给模型用的工具,插件还注册了一个会话命令,在输入框直接敲即可,不经过模型:
/mirror 启动投屏(等同 start)
/mirror stop 停止投屏
/mirror status 查看设备与连接状态
/mirror connect 手机重启后重连无线
/mirror screenshot 截一张手机屏幕
命令走 Host 侧的 ctx.commands.register,结果是纯文本,直接显示在会话里。
关于侧边栏按钮:曾尝试用客户端插件在侧边栏加图标按钮,但 DSH 的自定义 Host 服务需要 Typert 编译器生成的
./typert入口才能被remote.xxx访问;手写 bundle 没有该产物, 客户端注入会一直等待并拖垮整个前端启动。因此本插件不包含客户端部分,只提供工具与命令。
安装
方式一:本地目录(开发调试)
dsh plugin --profile desktop add "D:\path\to\dsh-scrcpy-mirror"
装完重启 DSH,或在插件页启用 phone-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 点击安装即可。
发布流程见
docs/PUBLISH.md,本地一键脚本:.\publish.ps1 -DryRun先自检,去掉-DryRun正式发布。
使用
安装后在对话里直接说:
帮我看看手机投屏状态 开一下手机投屏 手机重启了,无线连不上了 截一张手机屏幕给我
模型会调用:
{ "action": "status" }
{ "action": "start" }
{ "action": "connect" }
{ "action": "screenshot" }
返回示例(status):
scrcpy: C:\Users\...\scrcpy.exe
adb: C:\Users\...\adb.exe
网关(连着手机热点时即手机 IP): 10.99.177.119
网关 5555 端口: 开放
设备:
- VCJFK7WSLNS8TOEQ(USB)
- 10.99.177.119:5555(无线)
投屏进程: 127224
配置
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: ""
前置条件
- 电脑装好 scrcpy:
winget install --id Genymobile.scrcpy - 手机开启「开发者选项 → USB 调试」
- 首次插线时在手机上点「允许 USB 调试」
- 想无线投屏:电脑连手机热点(或同一 WiFi),跑一次
connect
实现说明(沙箱安全)
插件调用外部命令(adb / ipconfig / tasklist / taskkill / scrcpy)时不使用管道,
而是用 spawn + 文件句柄直写临时文件再读取。原因:DSH 宿主可能在受限沙箱里运行插件工具,
管道式 stdio 会被直接拒绝(spawn EPERM),表现为「命令静默失败、设备永远查不到」。
手机 IP 的推断也不是只靠 IPv4 默认网关 —— 实测小米/澎湃热点常常只下发 IPv6 网关, 所以回退顺序是:IPv4 网关 → DHCP 服务器(就是手机)→ 同网段 .1。
已知限制
- 仅 Windows:
taskkill/ipconfig/ winget 路径都按 Windows 实现。 - 手机重启后无线必然失效:这是 adb 的限制,需要插一次线跑
connect。 - 小米/澎湃机型:scrcpy 自带的「点亮屏幕」快捷键常被系统拦掉,插件不提供唤醒,请按手机电源键。
- 投屏窗口是 scrcpy 自己的窗口,不在 DSH 界面内。
许可证
MIT。插件本身原创;投屏能力来自 Apache-2.0 的 scrcpy,本项目不打包其二进制,仅调用本机已安装版本。
No comments yet. Be the first to write one.