Przejdź do głównej zawartości

Określanie typu zapisu urządzenia

Gdy znasz już typ protokołu swojego urządzenia, może być konieczne ustalenie, której konkretnej funkcji zapisu użyć. Urządzenia HID mają w szczególności dwie różne metody zapisu, które korzystają z różnych mechanizmów przesyłu USB.


device.write() wysyła dane przez przesył bulk lub interrupt na aktualnie wybranym punkcie końcowym HID urządzenia. To jest domyślna ścieżka zapisu i działa dla większości urządzeń.

Używaj device.write(), gdy:

  • Urządzenie wysyła i odbiera raporty o stałej długości przez przesył interrupt
  • Zapis Wireshark pokazuje przesyły URB_INTERRUPT
  • Urządzenie nie używa ID raportu HID na wybranym punkcie końcowym (co wymaga zero-paddingu — patrz poniżej)
var packet = [];
packet[0] = 0xEC;
packet[1] = 0x40;
packet[2] = channel;
packet = packet.concat(RGBData);
device.write(packet, 65);

device.send_report() wysyła dane przez przesył sterujący HID SET_REPORT. Celuje w mechanizm raportowania cech HID zamiast w punkt końcowy interrupt.

Używaj device.send_report(), gdy:

  • Zapis Wireshark pokazuje przesyły URB_CONTROL z żądaniem SET_REPORT (kod żądania 0x09)
  • device.write() zwraca błąd “nieprawidłowa funkcja” na wszystkich punktach końcowych
  • Urządzenie jawnie używa raportów cech HID dla swojego interfejsu poleceń
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);

Odpowiadającą funkcją odczytu dla raportów cech jest device.get_report(), która wydaje przesył sterujący GET_REPORT. Używaj jej, gdy musisz odczytać konfigurację przez ten sam mechanizm raportowania cech.


Jeśli nie jesteś pewien, zacznij od device.write(). Działa dla większości urządzeń HID. Jeśli pojawi się błąd “nieprawidłowa funkcja”, przełącz się na device.send_report(). Jeśli oba zawodzą, sprawdź, czy masz wybrany właściwy punkt końcowy.

ObjawWypróbuj
Działa zgodnie z oczekiwaniamiGotowe
Błąd “nieprawidłowa funkcja”Przełącz się na device.send_report()
Błąd “odmowa dostępu”Zły punkt końcowy — patrz Wybieranie punktów końcowych
Brak błędu, ale urządzenie nie odpowiadaZły punkt końcowy lub zły typ urządzenia

Niektóre urządzenia HID wymagają, aby pierwszy bajt każdego pakietu wynosił 0x00. Dzieje się tak, gdy urządzenie nie ma przypisanego ID raportu do wybranego punktu końcowego — sterownik HID usuwa bajt 0 przed przekazaniem danych do urządzenia, więc musisz przesunąć wszystko o jedną pozycję, aby to skompensować.

Oznaki, że potrzebujesz zero-paddingu:

  • Zapis Wireshark pokazuje pierwszy znaczący bajt polecenia na offsecie 1, nie 0
  • Bez bajtu zerowego urządzenie ignoruje pakiet lub generuje bezsensowne wyjście

Jak to zastosować:

// Without zero padding (packet size 64)
packet[0] = 0xEC; // command
packet[1] = 0x40;
device.write(packet, 64);
// With zero padding (packet size 65)
packet[0] = 0x00; // padding byte — consumed by HID driver
packet[1] = 0xEC; // command now at offset 1
packet[2] = 0x40;
device.write(packet, 65);

Ogólna zasada: jeśli twój zapis Wireshark pokazuje pakiet 64-bajtowy, ale device.write(packet, 64) nie działa, spróbuj device.write(packet, 65) z packet[0] = 0x00 i wszystkimi innymi bajtami przesuniętymi o jedną pozycję w górę.


Odpowiedniki odczytu podążają za tym samym podziałem:

Metoda zapisuPasująca metoda odczytuTyp przesyłu
device.write()device.read()Bulk / Interrupt
device.send_report()device.get_report()Sterujący (GET_REPORT)

Do odczytywania konkretnie raportów wejściowych (nie raportów cech) użyj device.input_report(). Zobacz Zaawansowana komunikacja dla szczegółów.