我在获取 USB 设备的字符串描述符时遇到问题。 我正在寻找的是人性化的制造商和产品名称。 我正在使用 libusb-1.0 作为后端,并且能够使用提供的 libusb 测试程序获取制造商名称,所以我知道它存在。
PyUSB 帮助文件说您可以使用以下命令访问usb_get_string_simple
(从 libusb 后端):
get_string(dev, length, index, langid=None)
Retrieve a string descriptor from the device. dev is the Device object to which the request will be sent to. length is the length of string in number of characters. index is the string descriptor index and langid is the Language ID of the descriptor. If langid is omitted, the string descriptor of the first Language ID will be returned. The return value is the unicode string present in the descriptor.
import usb
#help(usb.core)
busses = usb.busses()
for bus in busses:
devices = bus.devices
for dev in devices:
_name = usb.util.get_string(dev.dev,256,0) #This is where I'm having trouble
print "device name=",_name
print "Device:", dev.filename
print " Device class:",dev.deviceClass
print " Device sub class:",dev.deviceSubClass
print " Device protocol:",dev.deviceProtocol
print " Max packet size:",dev.maxPacketSize
print " idVendor:",hex(dev.idVendor)
print " idProduct:",hex(dev.idProduct)
print " Device Version:",dev.deviceVersion
for config in dev.configurations:
print " Configuration:", config.value
print " Total length:", config.totalLength
print " selfPowered:", config.selfPowered
print " remoteWakeup:", config.remoteWakeup
print " maxPower:", config.maxPower
for intf in config.interfaces:
print " Interface:",intf[0].interfaceNumber
for alt in intf:
print " Alternate Setting:",alt.alternateSetting
print " Interface class:",alt.interfaceClass
print " Interface sub class:",alt.interfaceSubClass
print " Interface protocol:",alt.interfaceProtocol
for ep in alt.endpoints:
print " Endpoint:",hex(ep.address)
print " Type:",ep.type
print " Max packet size:",ep.maxPacketSize
print " Interval:",ep.interval
任何帮助将不胜感激。
索引进行硬编码不是一个好主意。
我建议使用这样的东西:
usb.util.get_string(dev, 256, dev.iSerialNumber)
usb.util.get_string(dev, 256, dev.iManufacturer)
正如您将在下面看到的,索引因设备而异。
lsusb -v 的输出:
device 1: #index #string_descriptor
iManufacturer 3 Linux 3.8.13 musb-hcd
iProduct 2 MUSB HDRC host driver
iSerial 1 musb-hdrc.1.auto
device 2:
iManufacturer 2 E-boda
iProduct 3 SUNNY V35
iSerial 4 0123456789ABCDEF
(2019年7月更新:请参阅下面的Teodor-Bogdan Barbieru的回答,以清楚地描述为什么您实际上不应该硬编码索引!
(2019 年 7 月的第二次更新:请参阅 gog 下面的评论,以获取指向 USB 规范的链接,其中包含列出所有设备描述符字段的表格。
代码中的以下行:
usb.util.get_string(dev.dev,256,0)
确实是问题所在。我不太确定USB规范的内容,但是在我当前的硬件项目中,我得到了以下索引选择:
- index=0(您的选择)返回单个 Unicode 字符
- 索引=1 发送制造商
- 索引 = 2 发送设备说明
- 索引 = 3 发送设备序列号
因此,请尝试:
usb.util.get_string(dev.dev, 256, 2)
祝你好运!
这将从设备中检索字符串:
dev = usb.core.find(idVendor=0x077d, idProduct=0x0410) # fill in your own device, of course
if dev is None:
print 'Our device is not connected'
else:
if dev._manufacturer is None:
dev._manufacturer = usb.util.get_string(dev, dev.iManufacturer)
print str(dev._manufacturer)
if dev._product is None:
dev._product = usb.util.get_string(dev, dev.iProduct)
print str(dev._product)
修改为usb.util.get_string(dev, dev.iSerialNumber)