確定裝置寫入類型
一旦您知道裝置的協定類型,您可能仍需要確定使用哪個特定的寫入函式。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 控制傳輸。當您需要通過相同的功能報告機制回讀設定時使用它。
先嘗試哪一個
Section titled “先嘗試哪一個”如果您不確定,從 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; // 命令packet[1] = 0x40;device.write(packet, 64);
// 使用零填充(封包大小 65)packet[0] = 0x00; // 填充位元組——被 HID 驅動程式消耗packet[1] = 0xEC; // 命令現在在偏移量 1packet[2] = 0x40;device.write(packet, 65);經驗法則:如果您的 Wireshark 擷取顯示 64 位元組的封包,但 device.write(packet, 64) 不起作用,請嘗試將 packet[0] = 0x00 和所有其他位元組向上移動一個位置,並使用 device.write(packet, 65)。
讀取端的對應函式遵循相同的分割:
| 寫入方法 | 對應的讀取方法 | 傳輸類型 |
|---|---|---|
device.write() | device.read() | 批量/中斷 |
device.send_report() | device.get_report() | 控制(GET_REPORT) |
要專門讀取輸入報告(而非功能報告),請使用 device.input_report()。有關詳細資訊,請參閱進階通訊。