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
Dział zatytułowany „device.write”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
Dział zatytułowany „device.send_report”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.
Który wypróbować jako pierwszy
Dział zatytułowany „Który wypróbować jako pierwszy”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.
| Objaw | Wypróbuj |
|---|---|
| Działa zgodnie z oczekiwaniami | Gotowe |
| 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 odpowiada | Zły punkt końcowy lub zły typ urządzenia |
Zero-padding
Dział zatytułowany „Zero-padding”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; // commandpacket[1] = 0x40;device.write(packet, 64);
// With zero padding (packet size 65)packet[0] = 0x00; // padding byte — consumed by HID driverpacket[1] = 0xEC; // command now at offset 1packet[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ę.
Odczytywanie danych
Dział zatytułowany „Odczytywanie danych”Odpowiedniki odczytu podążają za tym samym podziałem:
| Metoda zapisu | Pasująca metoda odczytu | Typ 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.