Cihaz Yazma Türünü Belirleme
Cihazınızın protokol türünü öğrendikten sonra, hangi özel yazma fonksiyonunu kullanacağınızı belirlemeniz gerekebilir. HID cihazları özellikle farklı USB aktarım mekanizmalarını hedefleyen iki farklı yazma yöntemine sahiptir.
device.write
Section titled “device.write”device.write(), verileri cihazın şu anda seçili HID uç noktasında bulk veya interrupt aktarımı kullanarak gönderir. Bu standart yazma yoludur ve cihazların büyük çoğunluğu için çalışır.
device.write() kullanım durumları:
- Cihaz interrupt aktarımı üzerinden sabit uzunluklu raporlar gönderip alıyorsa
- Wireshark yakalama dosyası URB_INTERRUPT aktarımları gösteriyorsa
- Cihaz seçili uç noktada HID Rapor Kimliği kullanmıyorsa (sıfır doldurma gerektirir — aşağıya bakın)
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(), HID SET_REPORT kontrol aktarımı kullanarak veri gönderir. Bu, interrupt uç noktası yerine HID özellik raporu mekanizmasını hedefler.
device.send_report() kullanım durumları:
- Wireshark yakalama dosyası SET_REPORT isteğiyle (istek kodu
0x09) URB_CONTROL aktarımları gösteriyorsa device.write()tüm uç noktalarda “incorrect function” hatası döndürüyorsa- Cihaz komut arayüzü için açıkça HID Özellik raporları kullanıyorsa
device.send_report([0x07, 0x03, 0x06, 0x01, 0x00], 65);Özellik raporları için eşleşen okuma fonksiyonu, GET_REPORT kontrol aktarımı gerçekleştiren device.get_report()’tur. Aynı özellik raporu mekanizması üzerinden yapılandırma okumaya ihtiyaç duyduğunuzda kullanın.
Hangisini Önce Denemeli
Section titled “Hangisini Önce Denemeli”Emin değilseniz device.write() ile başlayın. HID cihazlarının büyük çoğunluğu için çalışır. “incorrect function” hatası alırsanız device.send_report()’a geçin. Her ikisi de başarısız olursa doğru uç noktayı seçip seçmediğinizi doğrulayın.
| Belirti | Deneyeceğiniz |
|---|---|
| Beklendiği gibi çalışıyor | İşlem tamamlandı |
| ”Incorrect function” hatası | device.send_report()’a geçin |
| ”Access is denied” hatası | Yanlış uç nokta — bkz. Uç Noktaları Seçme |
| Hata yok ama cihaz yanıt vermiyor | Yanlış uç nokta veya yanlış cihaz türü |
Sıfır Doldurma
Section titled “Sıfır Doldurma”Bazı HID cihazları her paketin ilk baytının 0x00 olmasını gerektirir. Bu, cihazın seçili uç noktaya atanmış Rapor Kimliği olmadığında gerçekleşir — HID sürücüsü, veriyi cihaza iletmeden önce 0. baytı soyar; bu nedenle telafi etmek için her şeyi bir konum ileriye kaydırmanız gerekir.
Sıfır doldurmaya ihtiyaç duyduğunuzun belirtileri:
- Wireshark yakalama dosyası ilk anlamlı komut baytını 0. ofset yerine 1. ofsette gösteriyorsa
- Sıfır bayt olmadan cihaz paketi yok sayıyor veya hatalı çıktı üretiyorsa
Nasıl uygulanır:
// Sıfır doldurma olmadan (paket boyutu 64)packet[0] = 0xEC; // komutpacket[1] = 0x40;device.write(packet, 64);
// Sıfır doldurma ile (paket boyutu 65)packet[0] = 0x00; // dolgu baytı — HID sürücüsü tarafından tüketilirpacket[1] = 0xEC; // komut artık 1. ofstepacket[2] = 0x40;device.write(packet, 65);Genel kural: Wireshark yakalama dosyanız 64 baytlık paket gösteriyorsa ama device.write(packet, 64) çalışmıyorsa, packet[0] = 0x00 ve diğer tüm baytlar bir yukarı kaydırılmış şekilde device.write(packet, 65) deneyin.
Veri Okuma
Section titled “Veri Okuma”Okuma tarafındaki eşdeğerleri aynı ayrımı izler:
| Yazma yöntemi | Eşleşen okuma yöntemi | Aktarım türü |
|---|---|---|
device.write() | device.read() | Bulk / Interrupt |
device.send_report() | device.get_report() | Control (GET_REPORT) |
Özellikle girdi raporlarını okumak için (özellik raporları değil) device.input_report() kullanın. Ayrıntılar için Gelişmiş İletişim sayfasına bakın.