콘텐츠로 이동

장치 쓰기 유형 결정

장치의 프로토콜 유형을 알고 나서도 어떤 쓰기 함수를 사용할지 결정해야 할 수 있습니다. HID 장치의 경우 서로 다른 USB 전송 메커니즘을 대상으로 하는 두 가지 쓰기 방법이 있습니다.


device.write()는 장치의 현재 선택된 HID 엔드포인트에서 벌크 또는 인터럽트 전송을 사용하여 데이터를 전송합니다. 이것은 표준 쓰기 경로로 대부분의 장치에 작동합니다.

다음과 같은 경우 device.write()를 사용하십시오:

  • 장치가 인터럽트 전송을 통해 고정 길이 보고서를 보내고 받는 경우
  • Wireshark 캡처에 URB_INTERRUPT 전송이 표시되는 경우
  • 장치가 선택된 엔드포인트에 HID 보고서 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()가 모든 엔드포인트에서 “잘못된 함수” 오류를 반환하는 경우
  • 장치가 명령 인터페이스에 HID 기능 보고서를 명시적으로 사용하는 경우
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);

기능 보고서의 동반 읽기 함수는 device.get_report()이며, GET_REPORT 제어 전송을 발행합니다. 동일한 기능 보고서 메커니즘을 통해 설정을 읽어야 할 때 사용하십시오.


확실하지 않다면 device.write()부터 시작하십시오. 대부분의 HID 장치에서 작동합니다. “잘못된 함수” 오류가 발생하면 device.send_report()로 전환하십시오. 둘 다 실패하면 올바른 엔드포인트가 선택되었는지 확인하십시오.

증상시도할 것
정상 작동완료
”잘못된 함수” 오류device.send_report()로 전환
”액세스가 거부됨” 오류잘못된 엔드포인트 — 엔드포인트 선택 참조
오류 없음, 장치 무응답잘못된 엔드포인트 또는 잘못된 장치 유형

일부 HID 장치는 모든 패킷의 첫 번째 바이트가 0x00이어야 합니다. 이는 선택된 엔드포인트에 보고서 ID가 할당되지 않은 경우 발생합니다 — HID 드라이버가 데이터를 장치에 전달하기 전에 바이트 0을 제거하므로, 이를 보완하기 위해 모든 것을 한 위치씩 밀어야 합니다.

제로 패딩이 필요한 징후:

  • Wireshark 캡처에서 첫 번째 의미 있는 명령 바이트가 오프셋 0이 아닌 오프셋 1에 있는 경우
  • 제로 바이트 없이는 장치가 패킷을 무시하거나 잘못된 출력을 생성하는 경우

적용 방법:

// 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)가 작동하지 않는다면, packet[0] = 0x00과 나머지 바이트를 한 위치씩 위로 이동한 device.write(packet, 65)를 시도하십시오.


읽기 측 동등 함수는 동일한 분리를 따릅니다:

쓰기 방법매칭 읽기 방법전송 유형
device.write()device.read()벌크 / 인터럽트
device.send_report()device.get_report()제어 (GET_REPORT)

특히 기능 보고서가 아닌 입력 보고서를 읽으려면 device.input_report()를 사용하십시오. 자세한 내용은 고급 통신을 참조하십시오.