Определение типа записи устройства
Зная тип протокола устройства, вам может потребоваться определить, какую конкретно функцию записи использовать. В частности, HID-устройства имеют два разных метода записи, ориентированных на разные механизмы USB-передачи.
device.write
Заголовок раздела «device.write»device.write() отправляет данные с использованием bulk- или interrupt-передачи на текущую выбранную конечную точку HID устройства. Это стандартный путь записи, работающий для большинства устройств.
Используйте device.write(), когда:
- Устройство отправляет и принимает отчёты фиксированной длины через interrupt-передачу
- В захвате 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
Заголовок раздела «device.send_report»device.send_report() отправляет данные с использованием управляющей передачи HID SET_REPORT. Это ориентировано на механизм feature report HID, а не на конечную точку interrupt.
Используйте device.send_report(), когда:
- В захвате Wireshark отображаются передачи URB_CONTROL с запросом SET_REPORT (код запроса
0x09) device.write()возвращает ошибку “incorrect function” на всех конечных точках- Устройство явно использует HID Feature reports для своего командного интерфейса
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);Функция чтения, соответствующая feature reports — это device.get_report(), которая выполняет управляющую передачу GET_REPORT. Используйте её, когда нужно прочитать конфигурацию через тот же механизм feature 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
- Без нулевого байта устройство игнорирует пакет или выдаёт некорректный результат
Как его применить:
// 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);Практическое правило: если в захвате Wireshark показан 64-байтный пакет, но device.write(packet, 64) не работает, попробуйте device.write(packet, 65) с packet[0] = 0x00 и всеми остальными байтами, сдвинутыми на одну позицию вверх.
Чтение данных обратно
Заголовок раздела «Чтение данных обратно»Соответствующие методы чтения следуют той же схеме разделения:
| Метод записи | Соответствующий метод чтения | Тип передачи |
|---|---|---|
device.write() | device.read() | Bulk / Interrupt |
device.send_report() | device.get_report() | Control (GET_REPORT) |
Для чтения input reports специально (не feature reports) используйте device.input_report(). Подробнее см. в разделе Расширенная связь.