Menentukan Tipe Penulisan Perangkat
Setelah Anda mengetahui tipe protokol perangkat Anda, Anda mungkin masih perlu menentukan fungsi penulisan spesifik mana yang akan digunakan. Perangkat HID khususnya memiliki dua metode penulisan berbeda yang menarget mekanisme transfer USB yang berbeda.
device.write
Section titled “device.write”device.write() mengirim data menggunakan transfer bulk atau interrupt pada endpoint HID perangkat yang saat ini dipilih. Ini adalah jalur penulisan standar dan berfungsi untuk sebagian besar perangkat.
Gunakan device.write() ketika:
- Perangkat mengirim dan menerima laporan dengan panjang tetap melalui transfer interrupt
- Tangkapan Wireshark menampilkan transfer URB_INTERRUPT
- Perangkat tidak menggunakan HID Report ID di endpoint yang dipilih (memerlukan padding nol — lihat di bawah)
var packet = [];packet[0] = 0xEC;packet[1] = 0x40;packet[2] = channel;packet = packet.concat(RGBData);
device.write(packet, 65);device.send_report
Section titled “device.send_report”device.send_report() mengirim data menggunakan transfer kontrol HID SET_REPORT. Ini menarget mekanisme laporan fitur HID daripada endpoint interrupt.
Gunakan device.send_report() ketika:
- Tangkapan Wireshark menampilkan transfer URB_CONTROL dengan permintaan SET_REPORT (kode permintaan
0x09) device.write()mengembalikan error “incorrect function” di semua endpoint- Perangkat secara eksplisit menggunakan laporan Fitur HID untuk antarmuka perintahnya
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);Fungsi baca yang sesuai untuk laporan fitur adalah device.get_report(), yang mengeluarkan transfer kontrol GET_REPORT. Gunakan ini ketika Anda perlu membaca kembali konfigurasi melalui mekanisme laporan fitur yang sama.
Mana yang Harus Dicoba Pertama
Section titled “Mana yang Harus Dicoba Pertama”Jika Anda tidak yakin, mulailah dengan device.write(). Ini berfungsi untuk sebagian besar perangkat HID. Jika Anda mendapatkan error “incorrect function”, beralih ke device.send_report(). Jika keduanya gagal, verifikasi Anda memiliki endpoint yang benar yang dipilih.
| Gejala | Coba |
|---|---|
| Bekerja seperti yang diharapkan | Selesai |
| Error “Incorrect function” | Beralih ke device.send_report() |
| Error “Access is denied” | Endpoint salah — lihat Selecting Endpoints |
| Tidak ada error, tetapi perangkat tidak merespons | Endpoint salah, atau tipe perangkat salah |
Zero Padding
Section titled “Zero Padding”Beberapa perangkat HID memerlukan byte pertama dari setiap paket adalah 0x00. Ini terjadi ketika perangkat tidak memiliki Report ID yang ditetapkan ke endpoint yang dipilih — driver HID menghapus byte 0 sebelum meneruskan data ke perangkat, sehingga Anda perlu menggeser semuanya satu posisi untuk mengkompensasi.
Tanda-tanda Anda memerlukan zero padding:
- Tangkapan Wireshark menampilkan byte perintah yang bermakna pertama di offset 1, bukan offset 0
- Tanpa byte nol, perangkat mengabaikan paket atau menghasilkan output sampah
Cara menerapkannya:
// 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);Aturan praktisnya: jika tangkapan Wireshark Anda menampilkan paket 64 byte tetapi device.write(packet, 64) tidak berfungsi, coba device.write(packet, 65) dengan packet[0] = 0x00 dan semua byte lainnya digeser satu ke atas.
Membaca Data Kembali
Section titled “Membaca Data Kembali”Fungsi baca sisi-read mengikuti pembagian yang sama:
| Metode tulis | Metode baca yang sesuai | Tipe transfer |
|---|---|---|
device.write() | device.read() | Bulk / Interrupt |
device.send_report() | device.get_report() | Control (GET_REPORT) |
Untuk membaca laporan input secara khusus (bukan laporan fitur), gunakan device.input_report(). Lihat Advanced Communication untuk detailnya.