我正在尝试使用python和hidapi模块控制USB HID设备(气象站的射频收发器加密狗),但我无法打开该设备,也无法在使用hid.enumerate
时显示。
我能够使用pyusb找到并连接到设备,并查看描述符,我注意到接口类是0x03 (HID),但设备类也是0x03而不是0x00(在接口指定),因为我已经阅读了它应该是。
此设备是否不符合HID规格,是否仅此原因hidapi无法找到该设备?否则,据我所知,该设备似乎表现得像一个普通的HID设备,我能够使用pyusb和控制传输从接口读取HID描述符。
是否有一种方法可以让hidapi连接到设备并忽略错误的设备类(如果这是问题)?如果可能的话,我更愿意使用更专业的hidapi,而不是使用pyusb。
DEVICE ID 6666:5555 on Bus 001 Address 001 =================
bLength : 0x12 (18 bytes)
bDescriptorType : 0x1 Device
bcdUSB : 0x200 USB 2.0
bDeviceClass : 0x3
bDeviceSubClass : 0x0
bDeviceProtocol : 0xff
bMaxPacketSize0 : 0x40 (64 bytes)
idVendor : 0x6666
idProduct : 0x5555
bcdDevice : 0x100 Device 1.0
iManufacturer : 0x1 LA CROSSE TECHNOLOGY
iProduct : 0x2 Weather Direct Light Wireless Device
iSerialNumber : 0x3 0123456
bNumConfigurations : 0x1
CONFIGURATION 1: 30 mA ===================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x2 Configuration
wTotalLength : 0x22 (34 bytes)
bNumInterfaces : 0x1
bConfigurationValue : 0x1
iConfiguration : 0x0
bmAttributes : 0x80 Bus Powered
bMaxPower : 0xf (30 mA)
INTERFACE 0: Human Interface Device ====================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x0
bAlternateSetting : 0x0
bNumEndpoints : 0x1
bInterfaceClass : 0x3 Human Interface Device
bInterfaceSubClass : 0x0
bInterfaceProtocol : 0x0
iInterface : 0x0
ENDPOINT 0x81: Interrupt IN ==========================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x81 IN
bmAttributes : 0x3 Interrupt
wMaxPacketSize : 0x40 (64 bytes)
bInterval : 0x20
根据HID规范和USB定义的类代码列表-bDeviceClass
确实不应该是0x3
:
注意设备描述符中的bDeviceClass和bDeviceSubClass字段不应用于标识属于HID类的设备。在接口描述符中使用bInterfaceClass和bInterfaceSubClass字段。
这确实会导致操作系统对该设备的错误解释。我可以假设的唯一解决方案是自定义驱动程序,它将包装此设备并修补其USB设备描述符。下面是一个这样的驱动程序的例子:https://github.com/microsoft/Windows-driver-samples/tree/main/hid/hidusbfx2