Lewati ke konten

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() 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() 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.


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.

GejalaCoba
Bekerja seperti yang diharapkanSelesai
Error “Incorrect function”Beralih ke device.send_report()
Error “Access is denied”Endpoint salah — lihat Selecting Endpoints
Tidak ada error, tetapi perangkat tidak meresponsEndpoint salah, atau tipe perangkat salah

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; // 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);

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.


Fungsi baca sisi-read mengikuti pembagian yang sama:

Metode tulisMetode baca yang sesuaiTipe 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.