模仿特定的 USB 设备

Imitating specific USB device

我最近得到了一个锻炼设备,它有一个 USB 到 PC 接口,并在一个糟糕的 Windows 应用程序上记录锻炼。我的目的是读出 USB 并构建一个自定义应用程序来显示该数据。

当连接到 linux 机器时,设备在 /dev/ttyUSB0 中注册,可以看到 lsusbstty 报告波特率等信息。我使用 stty 设置启动 minicom,一旦启动锻炼,设备就会发送一系列 41 字节

我假设这些字节表示对 PC 接口的通知。

我想做的是模仿健身器,自己将这41个字节发送到PC接口,看看PC端在启动时做了什么。有没有办法模仿设备让PC端软件识别?

如果设备是 /dev/ttyUSB0,则很可能实现虚拟 COM 端口,这是 USB 通信设备 class CDC (ACM)。

操作系统知道它必须加载什么驱动程序/内核模块,因为当你插入设备时,USB 协议描述符被交换(设备将其设备描述符发送给主机,主机根据此加载驱动程序/内核模块),你可以用lsusb -v看到这个信息。具体来说,设备向主机发送以下描述符:设备描述符、配置描述符、接口描述符、端点描述符http://www.beyondlogic.org/usbnutshell/usb1.shtml

为了模仿设备,您必须在 MCU 上编写固件,其中包含这些描述符,另外还有相同的 VID(供应商 ID)和 PID(产品 ID)

您收到的 41 个字节流经虚拟 COM 端口,因此采用 RS-232 协议(您可以使用 minicom 接收它们),因此它们高于 USB 级别,但它们是 USB 中有效负载的一部分数据包。如果您在 windows 中的设备的 windows 中有专有驱动程序,那么这 41 个字节很可能是针对驱动程序的(您很可能没有源代码……)。这是很常见的,有带 RS-232 接口的万用表,必须发送 D = 44 (hex) = 01000100 (bin) 才能接收任何 data

因此您可以尝试直接使用 RS-232 嗅探器 嗅探虚拟 COM 端口(RS-232 协议),即 https://www.eltima.com/rs232-sniffer.html

或者您可以尝试使用 wireshark(或 linux 中的 usbmon)嗅探底层 USB 流量,并从 USB 数据包中提取有效负载以记录windows 驱动程序和其他设备

https://ask.wireshark.org/question/36/how-to-capture-usb-packets-please/

https://www.youtube.com/watch?v=EfkC7kmIMt8(Wireshark 中的 USB)

https://www.kernel.org/doc/Documentation/usb/usbmon.txt

( https://www.kernel.org/doc/html/v4.13/driver-api/usb/URB.html )