嵌入式现场运维常遇到这样的问题:客户设备往往只暴露一个 USB 口,远程调试需要携带笔记本电脑到现场;平板和手机无法运行 J-Link 调试软件,也无法读取 U 盘。现有的 USB/IP 命令行或商业 USB 重定向方案需要安装驱动、开启测试模式并输入命令,普通用户难以使用。
WebUSB 将 USB/IP 做成面向普通用户的产品:现场只需一块 ESP32-S3 开发板和一部手机,USB 设备插入后即可出现在远程 Linux 电脑上,被官方软件识别为本地设备,全程无需命令行。
| ESP32-S3 固件 | ESP-IDF 5.2 + FreeRTOS:USB Host 枚举、USB/IP 服务端、NimBLE 自定义 GATT 配网、Wi-Fi STA、WebSocket 隧道客户端;全局"软状态机"由事件队列驱动,镜像到 0.96 寸 LCD 状态屏 |
|---|---|
| 中转 Relay | Node.js + ws:只做 Token 配对撮合(三态 Session)与字节透明转发,不解析 USB/IP 内容;两端都主动拨出,绕开 NAT 与端口映射 |
| 手机 App | Flutter + Riverpod:扫远程电脑上的二维码取 Token,经 BLE 把 {Wi-Fi 凭据, Relay 地址, Token} 写入 ESP32;BLE 层抽象成接口,真机与 Mock 两套实现 |
| 桌面 Agent | Flutter Desktop:生成二维码、维持隧道;本地代理监听 127.0.0.1:3240 桥接内核 vhci 的 TCP 流与 WebSocket;attach 后自动 mount 并打开文件管理器。Linux 版完整可用,Windows 版目前只有骨架 |
| 内核 vhci_hcd | Linux 虚拟 USB 主机控制器,把网络传来的 URB 还原成本地 USB 请求 |
-ENOMEM 让内核重试,避免 URB 悬挂 30 秒卡死| L1 BLE 配网包 | 手机写入 GATT 0xFF02 的 UTF-8 JSON:版本、Wi-Fi 凭据、Relay 端点、Token、公钥指纹 |
|---|---|
| L2 隧道帧 | WebSocket 二进制帧,1 字节类型 + 载荷,共 7 类:HELLO / HELLO_ACK / PEER_READY / PEER_GONE / PING / USB_CHANGE / USBIP_DATA |
| L3 USB/IP PDU | 遵循 Linux 内核线格式、大端序;ESP32 是小端,多字节字段逐字节读写 |
| L4 本地 usbip | Agent 调用 usbip attach / detach 与 vhci_hcd 内核模块 |
已知限制:BLE 配网与 WebSocket 目前是明文,产品化前要上 wss 与 protocomm Security v2;Windows Agent 待集成 usbip-win2。
白水队:程千和、石渊博、俞帅波。
仓库:github.com/QFcattail/webusb(仓库许可证仍为赛期"保留所有权利"声明,正式开源许可发布前本站不提供源码包下载)
由 RoboMaster 电控经验延伸出的产品化实践,将竞赛中积累的嵌入式能力应用于面向普通用户的完整产品。