장치 쓰기 유형 결정
장치의 프로토콜 유형을 알고 나서도 어떤 쓰기 함수를 사용할지 결정해야 할 수 있습니다. HID 장치의 경우 서로 다른 USB 전송 메커니즘을 대상으로 하는 두 가지 쓰기 방법이 있습니다.
device.write
섹션 제목: “device.write”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
섹션 제목: “device.send_report”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; // 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)가 작동하지 않는다면, packet[0] = 0x00과 나머지 바이트를 한 위치씩 위로 이동한 device.write(packet, 65)를 시도하십시오.
데이터 읽기
섹션 제목: “데이터 읽기”읽기 측 동등 함수는 동일한 분리를 따릅니다:
| 쓰기 방법 | 매칭 읽기 방법 | 전송 유형 |
|---|---|---|
device.write() | device.read() | 벌크 / 인터럽트 |
device.send_report() | device.get_report() | 제어 (GET_REPORT) |
특히 기능 보고서가 아닌 입력 보고서를 읽으려면 device.input_report()를 사용하십시오. 자세한 내용은 고급 통신을 참조하십시오.