使用hid库读取无线设备电量失败,寻求技术排查帮助
问题排查与解决方案
你的代码没找到设备,核心原因是多数外设(如罗技G502、Actris 7)并不遵循标准HID电池用法页协议,再加上可能的权限或枚举过滤限制,具体解决步骤如下:
1. 先确认设备是否被枚举到
先移除代码中的过滤逻辑,打印所有HID设备,确认目标设备是否在枚举列表内:
import hid devices = hid.enumerate() for device in devices: print(f"厂商ID: {hex(device['vendor_id'])}, 产品ID: {hex(device['product_id'])}, 用法页: {hex(device['usage_page'])}, 用法值: {hex(device['usage'])}, 设备名称: {device['product_string']}")
运行后找到罗技G502(厂商ID为0x046d)和Actris 7的条目,查看它们实际的usage_page和usage值——大概率不是你代码中设定的0x84和0x08,这类厂商普遍使用自定义HID接口。
2. 解决权限问题
- Linux:普通用户默认无HID设备访问权限,需添加udev规则。针对罗技设备,创建
/etc/udev/rules.d/99-logitech-hid.rules文件,内容如下:
执行SUBSYSTEM=="hidraw", ATTRS{idVendor}=="046d", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", MODE="0666"sudo udevadm control --reload-rules && sudo udevadm trigger后重新插拔设备。 - Windows:右键以管理员身份运行Python脚本,避免权限不足导致枚举失败。
- macOS:在系统偏好设置的「安全性与隐私」中,允许Python访问HID设备。
3. 适配厂商私有协议
罗技、Actris这类外设的电量查询不遵循标准HID协议,需使用厂商自定义指令:
- 罗技设备:需要发送特定的Feature Report获取电量。比如G系列鼠标通常要先发送初始化指令,再读取指定报告ID的数据。可参考罗技公开的HID文档或第三方逆向的协议信息,例如G502的电量查询可能需要发送
0x10开头的报告,再解析返回字节。 - Actris 7耳机:需查找其私有协议,或用Wireshark+USBPcap抓包分析配套软件的通信逻辑。
4. 简化替代方案
若不想深入逆向协议,可使用第三方封装库:
- 罗技设备可尝试基于罗技游戏软件的第三方Python库,或调用G HUB的CLI接口(若支持)。
- 跨平台场景可尝试
hidapi底层接口,结合抓包数据调试指令。
内容的提问来源于stack exchange,提问作者Karim
相关产品推荐
相关产品推荐

