跳到內容

確定裝置寫入類型

一旦您知道裝置的協定類型,您可能仍需要確定使用哪個特定的寫入函式。HID 裝置特別有兩種不同的寫入方法,它們針對不同的 USB 傳輸機制。


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() 使用 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; // 命令
packet[1] = 0x40;
device.write(packet, 64);
// 使用零填充(封包大小 65)
packet[0] = 0x00; // 填充位元組——被 HID 驅動程式消耗
packet[1] = 0xEC; // 命令現在在偏移量 1
packet[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()。有關詳細資訊,請參閱進階通訊