模仿特定的USB设备

时间:2018-03-13 10:01:42

标签: linux windows usb

我最近开始使用具有USB到PC接口的锻炼设备,并在糟糕的Windows应用程序上记录锻炼。我的目的是读出USB并构建一个自定义应用程序来呈现该数据。

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

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

我想做的是模仿锻炼设备并将这41个字节自己发送到PC界面,以便了解PC端在启动时的作用。有没有办法模仿设备,以便PC软件识别它?

1 个答案:

答案 0 :(得分:1)

if the device is /dev/ttyUSB0 it is very likel implementing a virtual COM port, this is USB Communication Device class CDC (ACM).

the operating system knows what driver / kernel module it has to load because when you plug in the device in USB protocol descriptors are exchanged ( the device sends its device descriptor to the host, according to this the host loads the driver / kernel module ), you can see this information with lsusb -v. Specifically the device sends the following descriptors to the host : device descriptor, configuration descriptor, interface descriptor, endpoint descriptor : http://www.beyondlogic.org/usbnutshell/usb1.shtml

for imitating a device you have to write a firmware on a MCU with exaclty these descriptors and additionally with identic VID ( vendor id ) and PID ( product id )

the 41 bytes you receive flow over the virtual COM port and so in RS-232 protocol ( you are able to receive them with minicom ) and so they are above USB level, however they are part of the payload in USB packets. if you have a proprietary driver in windows of your device in windows these 41 bytes are very likely addressed to the driver ( whichs source code you very likely do not have ...). this is very common there are multimeters with RS-232 interface and one has to send a D = 44 (hex) = 01000100 (bin) to receive any data

so you can try to sniff the virtual COM port ( RS-232 protocol ) directly using a RS-232 sniffer, i.e. https://www.eltima.com/rs232-sniffer.html

alternatively you can try is to sniff the underlying USB traffic with wireshark ( or usbmon in linux ) and extract the payload from the USB packets to record the communication between the windows driver and ther device

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

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

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

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