将勾选的 USB Android 设备转为 Wi-Fi ADB #25

Closed
opened 2026-08-07 14:33:20 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:3. Admin Mock/Gateway 闭环
  • 当前状态:验收通过

要解决什么

同一台手机通过 USB 搜索成功后,用户目前必须在终端手工读取 Wi-Fi IP、执行 adb tcpip 5555、拔掉数据线并重新执行 adb connect。设置页缺少把已勾选 USB 设备安全转换为稳定 Wi-Fi ADB 连接的引导流程。

已通过真机确认:该手机需要先开启 5555,拔掉 USB 数据线后再次执行 adb connect IP:5555,Wi-Fi 连接才能在拔线后保持。

做什么 / 不做什么

  • 做:
    • Android 设备命令区增加“转为 Wi-Fi”按钮;
    • 仅当勾选状态正常的 USB 设备时启用;
    • 后台读取该设备的 Wi-Fi IPv4 地址;
    • 对指定 USB 序列号执行 adb tcpip 5555;
    • 首次连接 Wi-Fi 地址并提示用户拔掉 USB;
    • 等待 USB 通道消失后再次执行 adb connect;
    • 验证 Wi-Fi 设备状态为 device,刷新列表并勾选 Wi-Fi 设备;
    • 各阶段通过现有状态区反馈,防止重复提交并安全处理页面关闭;
    • 增加服务层和离屏 Qt 自动测试。
  • 不做:
    • 转换成功后不自动保存 android.selected_serial,仍由用户点击“保存”确认;
    • 不合并 USB 与 Wi-Fi 两条临时搜索记录;
    • 不修改 SQLite、Admin 接口、PDD 自动化或采购流程;
    • 不实现 Android 11 配对码流程;
    • 不实现“关闭 Wi-Fi 调试”;
    • 不增加第三方依赖;
    • 不顺带实现现有无线地址输入框的“连接”信号。

怎么做

  1. 在 AndroidDeviceService 增加独立的 USB 转 Wi-Fi 方法:
    • 校验 USB 序列号;
    • 从 adb -s <serial> shell ip route 的 src 字段解析 IPv4;
    • 执行 adb -s <serial> tcpip 5555;
    • 尝试首次 adb connect <ip>:5555;
    • 轮询 adb devices 等待 USB 通道消失;
    • 拔线后重新连接并验证目标 Wi-Fi 通道状态。
  2. 阻塞 ADB、等待和轮询全部放入 QObject + moveToThread Worker;Worker 只发进度、成功、失败和完成信号,不访问 QWidget。
  3. 在设置页现有命令行增加 PushButton,使用 Fluent 图标和可访问名称;不调整页面整体布局,因此跳过 HTML 原型。
  4. 以“未开始、正在准备、等待拔线、正在重连、成功、失败、关闭取消”管理状态;执行期间禁用相冲突的设备命令。
  5. 成功后用服务返回的最新设备列表刷新表格并勾选 IP:5555;用户仍需点击“保存”才持久化。
  6. 失败信息说明发生阶段、已保留内容和下一步重试方式;在可信局域网使用 5555 的安全提醒写入成功提示和归档。

预计修改:

  • client/src/android_device_service.py
  • client/src/settings_ui.py
  • client/src/settings_ui_event.py
  • client/test/test_android_device_service.py
  • client/test/test_settings_ui_event.py

验收标准

  • 未勾选设备、勾选 Wi-Fi 设备或异常状态设备时,“转为 Wi-Fi”不可用;
  • 勾选正常 USB 设备时按钮可用;
  • 能从路由输出解析 Wi-Fi IPv4,缺失或非法地址给出可恢复错误;
  • 所有 ADB 命令都显式指定勾选的 USB 序列号或目标 Wi-Fi 地址;
  • 能开启 5555、提示拔线、检测 USB 消失并在拔线后重新连接;
  • 转换成功前必须验证 IP:5555 状态为 device;
  • 成功后刷新设备列表并自动勾选 Wi-Fi 设备;
  • 转换成功不自动写入当前设备设置;
  • 失败时保留原列表、原配置,并允许重新搜索或重试;
  • 转换期间防止重复提交且 Qt 主线程保持响应;
  • 页面关闭后的迟到结果不访问已销毁控件;
  • 不修改数据库、Admin 接口、PDD 自动化和第三方依赖;
  • 全量 unittest、语法检查和 git diff --check 通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/android_device_service.py src/settings_ui.py src/settings_ui_event.py test/test_android_device_service.py test/test_settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
Remove-Item Env:QT_QPA_PLATFORM

真机验收:

  1. USB 连接手机,点击“搜索”并勾选 USB 设备;
  2. 点击“转为 Wi-Fi”,确认状态区提示拔掉 USB;
  3. 拔线,确认程序重新连接并只勾选 IP:5555;
  4. 再次搜索确认 Wi-Fi 设备仍存在;
  5. 重复测试未连 Wi-Fi、无法获取 IP、未拔线超时和页面中途关闭;
  6. 在可信局域网内测试,不在公共网络暴露 ADB 5555。

实施记录

  • 已按方案增加 Fluent“转为 Wi-Fi”按钮和后台转换 Worker。
  • IP 解析优先使用默认路由对应接口,不写死网卡名。
  • 为避免把 adbd 短暂重启误判为物理拔线,USB 序列号连续两次从设备列表消失后才继续。
  • 默认等待拔线 60 秒;超时后保留界面列表、勾选和 SQLite 配置。
  • 转换成功只刷新并勾选 Wi-Fi 设备,不自动保存。
  • 代码提交:d478e69
  • 归档提交:ec7705f
  • 本地归档:docs/task/25-usb-android-设备转-wifi-adb.md
  • Client 全量 85 项测试、语法检查、离屏窗口冒烟和差异检查通过。
  • 真机只读确认当前 Wi-Fi 设备在线,实际路由输出可正确解析为 192.168.0.173。
  • 未执行完整真机转换流程,等待用户可见窗口验收。

验收关闭

  • 用户于 2026-08-07 确认验收通过。
  • 本地归档状态已更新为“已完成”。
  • 验收归档提交:a6e3fe0。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:3. Admin Mock/Gateway 闭环 - 当前状态:验收通过 ## 要解决什么 同一台手机通过 USB 搜索成功后,用户目前必须在终端手工读取 Wi-Fi IP、执行 `adb tcpip 5555`、拔掉数据线并重新执行 `adb connect`。设置页缺少把已勾选 USB 设备安全转换为稳定 Wi-Fi ADB 连接的引导流程。 已通过真机确认:该手机需要先开启 5555,拔掉 USB 数据线后再次执行 `adb connect IP:5555`,Wi-Fi 连接才能在拔线后保持。 ## 做什么 / 不做什么 - 做: - Android 设备命令区增加“转为 Wi-Fi”按钮; - 仅当勾选状态正常的 USB 设备时启用; - 后台读取该设备的 Wi-Fi IPv4 地址; - 对指定 USB 序列号执行 `adb tcpip 5555`; - 首次连接 Wi-Fi 地址并提示用户拔掉 USB; - 等待 USB 通道消失后再次执行 `adb connect`; - 验证 Wi-Fi 设备状态为 `device`,刷新列表并勾选 Wi-Fi 设备; - 各阶段通过现有状态区反馈,防止重复提交并安全处理页面关闭; - 增加服务层和离屏 Qt 自动测试。 - 不做: - 转换成功后不自动保存 `android.selected_serial`,仍由用户点击“保存”确认; - 不合并 USB 与 Wi-Fi 两条临时搜索记录; - 不修改 SQLite、Admin 接口、PDD 自动化或采购流程; - 不实现 Android 11 配对码流程; - 不实现“关闭 Wi-Fi 调试”; - 不增加第三方依赖; - 不顺带实现现有无线地址输入框的“连接”信号。 ## 怎么做 1. 在 `AndroidDeviceService` 增加独立的 USB 转 Wi-Fi 方法: - 校验 USB 序列号; - 从 `adb -s <serial> shell ip route` 的 `src` 字段解析 IPv4; - 执行 `adb -s <serial> tcpip 5555`; - 尝试首次 `adb connect <ip>:5555`; - 轮询 `adb devices` 等待 USB 通道消失; - 拔线后重新连接并验证目标 Wi-Fi 通道状态。 2. 阻塞 ADB、等待和轮询全部放入 `QObject + moveToThread` Worker;Worker 只发进度、成功、失败和完成信号,不访问 QWidget。 3. 在设置页现有命令行增加 `PushButton`,使用 Fluent 图标和可访问名称;不调整页面整体布局,因此跳过 HTML 原型。 4. 以“未开始、正在准备、等待拔线、正在重连、成功、失败、关闭取消”管理状态;执行期间禁用相冲突的设备命令。 5. 成功后用服务返回的最新设备列表刷新表格并勾选 `IP:5555`;用户仍需点击“保存”才持久化。 6. 失败信息说明发生阶段、已保留内容和下一步重试方式;在可信局域网使用 5555 的安全提醒写入成功提示和归档。 预计修改: - `client/src/android_device_service.py` - `client/src/settings_ui.py` - `client/src/settings_ui_event.py` - `client/test/test_android_device_service.py` - `client/test/test_settings_ui_event.py` ## 验收标准 - [x] 未勾选设备、勾选 Wi-Fi 设备或异常状态设备时,“转为 Wi-Fi”不可用; - [x] 勾选正常 USB 设备时按钮可用; - [x] 能从路由输出解析 Wi-Fi IPv4,缺失或非法地址给出可恢复错误; - [x] 所有 ADB 命令都显式指定勾选的 USB 序列号或目标 Wi-Fi 地址; - [x] 能开启 5555、提示拔线、检测 USB 消失并在拔线后重新连接; - [x] 转换成功前必须验证 `IP:5555` 状态为 `device`; - [x] 成功后刷新设备列表并自动勾选 Wi-Fi 设备; - [x] 转换成功不自动写入当前设备设置; - [x] 失败时保留原列表、原配置,并允许重新搜索或重试; - [x] 转换期间防止重复提交且 Qt 主线程保持响应; - [x] 页面关闭后的迟到结果不访问已销毁控件; - [x] 不修改数据库、Admin 接口、PDD 自动化和第三方依赖; - [x] 全量 unittest、语法检查和 `git diff --check` 通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/android_device_service.py src/settings_ui.py src/settings_ui_event.py test/test_android_device_service.py test/test_settings_ui_event.py $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" Remove-Item Env:QT_QPA_PLATFORM ``` 真机验收: 1. USB 连接手机,点击“搜索”并勾选 USB 设备; 2. 点击“转为 Wi-Fi”,确认状态区提示拔掉 USB; 3. 拔线,确认程序重新连接并只勾选 `IP:5555`; 4. 再次搜索确认 Wi-Fi 设备仍存在; 5. 重复测试未连 Wi-Fi、无法获取 IP、未拔线超时和页面中途关闭; 6. 在可信局域网内测试,不在公共网络暴露 ADB 5555。 ## 实施记录 - 已按方案增加 Fluent“转为 Wi-Fi”按钮和后台转换 Worker。 - IP 解析优先使用默认路由对应接口,不写死网卡名。 - 为避免把 `adbd` 短暂重启误判为物理拔线,USB 序列号连续两次从设备列表消失后才继续。 - 默认等待拔线 60 秒;超时后保留界面列表、勾选和 SQLite 配置。 - 转换成功只刷新并勾选 Wi-Fi 设备,不自动保存。 - 代码提交:`d478e69` - 归档提交:`ec7705f` - 本地归档:`docs/task/25-usb-android-设备转-wifi-adb.md` - Client 全量 85 项测试、语法检查、离屏窗口冒烟和差异检查通过。 - 真机只读确认当前 Wi-Fi 设备在线,实际路由输出可正确解析为 `192.168.0.173`。 - 未执行完整真机转换流程,等待用户可见窗口验收。 ## 验收关闭 - 用户于 2026-08-07 确认验收通过。 - 本地归档状态已更新为“已完成”。 - 验收归档提交:`a6e3fe0`。
Author
Owner

工单已创建并同步到 #1、#2,现开始实施。工作区中现有 Admin、PDD UI 和未跟踪文件修改不纳入本工单提交。

工单已创建并同步到 #1、#2,现开始实施。工作区中现有 Admin、PDD UI 和未跟踪文件修改不纳入本工单提交。
Author
Owner

#25 已实现,等待人工验收。

  • 代码提交:d478e69 feat: 支持 USB 设备转 Wi-Fi ADB (#25)
  • 文档提交:ec7705f docs: 归档任务 #25
  • 自动验证:Client 全量 85 项 unittest、相关文件语法检查、离屏窗口冒烟和 git diff --check 均通过。
  • 真机只读核对:当前 192.168.0.173:5555 在线,实际路由可解析出 192.168.0.173。
  • 未改变当前真机连接;请按工单步骤重新插 USB,在可见窗口验收完整转换和拔线重连。
  • 工作区中现有 Admin、PDD UI 和其他未跟踪修改未纳入提交。

验收通过前工单保持打开,#1、#2 中的 #25 仍保持未勾选。

#25 已实现,等待人工验收。 - 代码提交:`d478e69 feat: 支持 USB 设备转 Wi-Fi ADB (#25)` - 文档提交:`ec7705f docs: 归档任务 #25` - 自动验证:Client 全量 85 项 unittest、相关文件语法检查、离屏窗口冒烟和 `git diff --check` 均通过。 - 真机只读核对:当前 `192.168.0.173:5555` 在线,实际路由可解析出 `192.168.0.173`。 - 未改变当前真机连接;请按工单步骤重新插 USB,在可见窗口验收完整转换和拔线重连。 - 工作区中现有 Admin、PDD UI 和其他未跟踪修改未纳入提交。 验收通过前工单保持打开,#1、#2 中的 #25 仍保持未勾选。
ila closed this issue 2026-08-07 15:21:05 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#25