Bla*_*ine 27 python usb libusb
我们如何在Python中查询连接的USB设备信息?我想获得UID设备名称(例如:SonyEricsson W660),设备路径(例如:/ dev/ttyACM0)
还有什么是上述信息中最好的参数,用于识别设备何时再次连接?(UID?)
我正在研究Ubuntu 11.04.
ATM我有这个代码(使用pyUSB)
busses = usb.busses()
for bus in busses:
devices = bus.devices
for dev in devices:
print repr(dev)
print "Device:", dev.filename
print " idVendor: %d (0x%04x)" % (dev.idVendor, dev.idVendor)
print " idProduct: %d (0x%04x)" % (dev.idProduct, dev.idProduct)
print "Manufacturer:", dev.iManufacturer
print "Serial:", dev.iSerialNumber
print "Product:", dev.iProduct
Run Code Online (Sandbox Code Playgroud)
问题是我没有得到所需的输出,会粘贴一个例子:
<usb.legacy.Device object at 0x1653990>
Device:
idVendor: 4046 (0x0fce)
idProduct: 53411 (0xd0a3)
Manufacturer: 1
Serial: 3
Product: 2
Run Code Online (Sandbox Code Playgroud)
首先我没有文件名,这对我来说最重要.我假设它是/ dev/ttyACM0等部分.其次,我猜每个USB设备都有一些UID,或者我应该同时使用Vendor或Product id?
编辑:显然我有一些设置问题,我想我使用错误的USB库.(使用libusb0.1)ATM.这就是我将Device(dev.filename)字符串设为空的原因.如果有人可以请告诉他在什么操作系统上他正在使用什么USB库以及我认为它将解决我的问题的哪个版本的PyUSB.
mes*_*n10 47
我可以想到像这样的快速代码.
由于可以通过/ dev/bus/usb/<bus>/<device>访问所有USB端口
对于生成的ID,即使您拔下设备并重新连接它[可能是其他端口].它会是一样的.
import re
import subprocess
device_re = re.compile("Bus\s+(?P<bus>\d+)\s+Device\s+(?P<device>\d+).+ID\s(?P<id>\w+:\w+)\s(?P<tag>.+)$", re.I)
df = subprocess.check_output("lsusb")
devices = []
for i in df.split('\n'):
if i:
info = device_re.match(i)
if info:
dinfo = info.groupdict()
dinfo['device'] = '/dev/bus/usb/%s/%s' % (dinfo.pop('bus'), dinfo.pop('device'))
devices.append(dinfo)
print devices
Run Code Online (Sandbox Code Playgroud)
此处的示例输出将是:
[
{'device': '/dev/bus/usb/001/009', 'tag': 'Apple, Inc. Optical USB Mouse [Mitsumi]', 'id': '05ac:0304'},
{'device': '/dev/bus/usb/001/001', 'tag': 'Linux Foundation 2.0 root hub', 'id': '1d6b:0002'},
{'device': '/dev/bus/usb/001/002', 'tag': 'Intel Corp. Integrated Rate Matching Hub', 'id': '8087:0020'},
{'device': '/dev/bus/usb/001/004', 'tag': 'Microdia ', 'id': '0c45:641d'}
]
Run Code Online (Sandbox Code Playgroud)
joa*_*uin 36
如果您正在使用Windows,则可以使用pywin32.
我在这里找到了一个例子:
import win32com.client
wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
print usb.DeviceID
Run Code Online (Sandbox Code Playgroud)
对于旧版 USB 回归和 libusb-1.0 的系统,此方法将有助于检索各种实际字符串。我以供应商和产品为例。它可能会导致一些 I/O,因为它实际上从设备读取信息(至少是第一次)。某些设备不提供此信息,因此在这种情况下假设它们会抛出异常;没关系,所以我们通过了。
import usb.core
import usb.backend.libusb1
busses = usb.busses()
for bus in busses:
devices = bus.devices
for dev in devices:
if dev != None:
try:
xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
if xdev._manufacturer is None:
xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
if xdev._product is None:
xdev._product = usb.util.get_string(xdev, xdev.iProduct)
stx = '%6d %6d: '+str(xdev._manufacturer).strip()+' = '+str(xdev._product).strip()
print stx % (dev.idVendor,dev.idProduct)
except:
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105707 次 |
| 最近记录: |