【问题标题】:Imitating specific USB device模仿特定的 USB 设备
【发布时间】:2018-03-13 10:01:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux windows usb


    【解决方案1】:

    如果设备是/dev/ttyUSB0,它很可能实现了一个虚拟 COM 端口,这是 USB 通信设备类 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)

    【讨论】:

    • 这是一些很棒的信息! rs232-sniffer 似乎可以完成这项工作。我可以看到函数调用和数据在虚拟端口上上下移动。我想知道的是我在 Linux 中是否需要所有这些。由于设备在 Linux 中弹出并且数据来自虚拟端口,所以我想我不需要“驱动程序”部分,我可以直接跳转到串行通信。对吗?
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2023-03-17
    • 2014-10-12
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多