确定设备写入类型
一旦您了解了设备的协议类型,您可能仍然需要确定使用哪个具体的写入函数。HID 设备特别有两种不同的写入方法,针对不同的 USB 传输机制。
device.write
Section titled “device.write”device.write() 在设备当前选定的 HID 端点上使用批量或中断传输发送数据。这是标准写入路径,适用于大多数设备。
在以下情况下使用 device.write():
- 设备通过中断传输发送和接收固定长度的报告
- Wireshark 捕获显示 URB_INTERRUPT 传输
- 设备在选定端点上没有使用 HID Report ID(需要零填充——见下文)
var packet = [];packet[0] = 0xEC;packet[1] = 0x40;packet[2] = channel;packet = packet.concat(RGBData);
device.write(packet, 65);device.send_report
Section titled “device.send_report”device.send_report() 使用 HID SET_REPORT 控制传输发送数据。这针对 HID 功能报告机制,而不是中断端点。
在以下情况下使用 device.send_report():
- Wireshark 捕获显示带有 SET_REPORT 请求(请求代码
0x09)的 URB_CONTROL 传输 device.write()在所有端点上返回”incorrect function”错误- 设备明确使用 HID 功能报告作为其命令接口
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);功能报告的对应读取函数是 device.get_report(),它发出 GET_REPORT 控制传输。当您需要通过相同的功能报告机制读回配置时使用它。
如果您不确定,先从 device.write() 开始。它适用于大多数 HID 设备。如果出现”incorrect function”错误,切换到 device.send_report()。如果两者都失败,请验证您是否选择了正确的端点。
| 症状 | 尝试 |
|---|---|
| 按预期工作 | 已完成 |
| ”Incorrect function” 错误 | 切换到 device.send_report() |
| ”Access is denied” 错误 | 端点错误 — 参见选择端点 |
| 无错误,但设备无响应 | 端点错误,或设备类型错误 |
某些 HID 设备要求每个数据包的第一个字节为 0x00。当设备没有为所选端点分配 Report ID 时会发生这种情况——HID 驱动程序在将数据传递给设备之前去掉字节 0,因此您需要将所有内容向后移动一个位置来补偿。
需要零填充的迹象:
- Wireshark 捕获显示第一个有意义的命令字节在偏移 1 处,而不是偏移 0
- 没有零字节,设备忽略数据包或产生乱码输出
如何应用:
// 不带零填充(数据包大小 64)packet[0] = 0xEC; // commandpacket[1] = 0x40;device.write(packet, 64);
// 带零填充(数据包大小 65)packet[0] = 0x00; // padding byte — consumed by HID driverpacket[1] = 0xEC; // command now at offset 1packet[2] = 0x40;device.write(packet, 65);经验法则:如果您的 Wireshark 捕获显示 64 字节数据包,但 device.write(packet, 64) 不起作用,请尝试 device.write(packet, 65),并将 packet[0] = 0x00,所有其他字节向上移动一个位置。
读取端的对应函数遵循相同的分割:
| 写入方法 | 对应读取方法 | 传输类型 |
|---|---|---|
device.write() | device.read() | 批量 / 中断 |
device.send_report() | device.get_report() | 控制(GET_REPORT) |
对于专门读取输入报告(而非功能报告),请使用 device.input_report()。有关详细信息,请参阅高级通信。