İçeriğe geç

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


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.

BelirtiDeneyeceğ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 vermiyorYanlış uç nokta veya yanlış cihaz türü

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; // komut
packet[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üketilir
packet[1] = 0xEC; // komut artık 1. ofste
packet[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.


Okuma tarafındaki eşdeğerleri aynı ayrımı izler:

Yazma yöntemiEşleşen okuma yöntemiAktarı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.