Перейти к содержимому

Определение типа записи устройства

Зная тип протокола устройства, вам может потребоваться определить, какую конкретно функцию записи использовать. В частности, HID-устройства имеют два разных метода записи, ориентированных на разные механизмы USB-передачи.


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() отправляет данные с использованием управляющей передачи 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; // 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);

Практическое правило: если в захвате 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(). Подробнее см. в разделе Расширенная связь.