【问题标题】:Keyboard HID report键盘 HID 报告
【发布时间】:2021-03-30 18:20:18
【问题描述】:

在一些 github 项目中,我看到 HID 键盘报告使用如下 Python 结构:

        self.state = [ 
               0xA1, # This is an input report
               0x01, # Usage report = Keyboard
               # Bit array for Modifier keys (D7 being the first element, D0 being last)
               [0,   # Right GUI - (usually the Windows key) 
                0,   # Right ALT
                0,   # Right Shift
                0,   # Right Control
                0,   # Left GUI - (again, usually the Windows key)
                0,   # Left ALT
                0,   # Left Shift
                0],  # Left Control
               0x00, # Vendor reserved
               0x00, # Rest is space for 6 keys 
               0x00,
               0x00,
               0x00,
               0x00,
               0x00 ]

我对结构体中出现的前两个字节0xA1和0x01有些疑惑,因为剩下的就是带有键盘信息的数据。

HID 报告是否总是以 0xA1 开头?

如果第二个字节的值(0x01)表示“report usage = keyboard”,那么游戏手柄对应什么值?

感谢您的帮助。

【问题讨论】:

    标签: python keyboard hid


    【解决方案1】:

    看来这段代码是从here借来的。

    在这种情况下,Bluetooth HID Profile 与键盘设备的所谓“引导协议”一起使用(报告 ID = 0x1)。

    来自规范“3.3.2 蓝牙 HID 设备启动协议要求”:

    蓝牙 HID 设备支持三种报告类型:输入、输出和 特征。输入和输出报告通常包含低延迟 信息。输入报告由蓝牙 HID 设备生成 并发送到蓝牙 HID 主机。输出报告由 蓝牙 HID 主机并发送到蓝牙 HID 设备。特征 报告是双向的,通常包含以下信息 不打算由用户看到或生成,因此不是 时间紧迫。蓝牙 HID 设备应包含至少一个 报告描述符中的报告类型。创建了两个逻辑通道 蓝牙 HID 设备和蓝牙 HID 主机之间:控制 通道和中断通道。报告可以进行 中断通道或控制通道。进行的报告数据 中断通道是在没有请求的情况下发送的,并且不是 确认和这些传输被称为“异步 报道”。在控制通道上传输的报告数据总是 由 SET_REPORT 或 GET_REPORT 请求发起(参见第 3.1.2.3 节 和 3.1.2.4),这些传输被称为“同步 报告”

    蓝牙 HID 启动协议设备需要 1 个八位字节的报告 ID 附加到标准 HID 引导协议报告中。蓝牙 HID 启动 协议键盘报告为 9 个八位字节(1 个八位字节报告 ID + 标准 8 字节的键盘启动报告),鼠标启动报告为 4 字节 (1 字节报告 ID + 标准 3 字节鼠标启动报告)。 USB 每个蓝牙启动报告的标准启动报告部分 应符合相应引导报告定义的格式 USB HID 规范中的描述符,附录 B 以 要正确解释的数据。键盘的用法和指向 设备按钮和 XY 轴的使用应符合中的分配 USB HID 规范。

    在引导协议模式下,没有报告描述符,但报告 确实有第 3.3.2 节中定义的报告 ID,因此确实需要 GET_REPORT 请求八位字节的 ReportID 字段。

    0xA1 - 是二进制的 10100001,似乎是 HIDP-Hdr 格式。不知道为什么会在这里:

    Bits specifying characteristics of request.
    7..4 HIDP Message Type
      4 = GET_REPORT
    3 Size
      0 = The host has allocated a buffer equal to the size of the report.
      1 = A 2-octet BufferSize field follows the Report ID. This field indicates the size of the buffer allocated by the host. A device limits the returned payload size to BufferSize. Note that the BufferSize is increased by 1-octet for Boot Protocol Mode reports to include the Report ID imposed by the Bluetooth HID. See §3.3.2 more information on Boot Protocol Mode.
    2 Reserved (0)
    1..0 Report Type
      0 = Reserved
      1 = Input
      2 = Output
      3 = Feature
    

    结论:您无法通过蓝牙 HID 启动协议模拟游戏手柄,因为它不受支持。如果您想模拟 HID 游戏手柄 - 您需要在向主机发送任何数据之前提供完整的 HID 报告描述符,以便主机驱动程序对其进行解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 2021-04-26
      • 2015-08-28
      • 2020-05-14
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多