Простой способ запросить информацию о подключенных USB-устройствах в Python?
Как мы можем запросить информацию о подключенных USB-устройствах в Python?
Я хочу получить имя устройства 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
Проблема в том, что я не получаю желаемого вывода, вставьте один пример:
<usb.legacy.Device object at 0x1653990>
Device:
idVendor: 4046 (0x0fce)
idProduct: 53411 (0xd0a3)
Manufacturer: 1
Serial: 3
Product: 2
Сначала я не получаю имя файла, это самое важное для меня. Я предполагаю, что это часть /dev/ttyACM 0 и т.д. Во-вторых, я предполагаю, что на каждом USB-устройстве был UID, или я должен использовать идентификатор поставщика или продукта?
EDIT: По-видимому, у меня есть некоторые проблемы с настройкой, я думаю, что использую неправильную библиотеку USB. (используя libusb0.1) ATM. Поэтому я получаю строку Device (dev.filename) пустой. Если кто-то может просто сказать, что в какой операционной системе он использует какую-то USB-библиотеку и какую версию PyUSB я думаю, она решит мои проблемы.
Ответы
Ответ 1
Я могу придумать быстрый код, подобный этому.
Поскольку все порты USB могут быть доступны через /dev/bus/usb/ <bus> /< устройство >
Для генерируемого идентификатора, даже если вы отключите устройство от сети и снова подключите его [может быть какой-то другой порт]. Это будет то же самое.
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
Пример вывода здесь:
[
{'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'}
]
Ответ 2
Если вы работаете с окнами, вы можете использовать pywin32
.
Я нашел пример здесь:
import win32com.client
wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
print usb.DeviceID
Ответ 3
Для Linux я написал скрипт с именем find_port.py, который вы можете найти здесь: https://github.com/dhylands/usb-ser-mon/blob/master/usb_ser_mon/find_port.py
Он использует pyudev для перечисления всех tty-устройств и может соответствовать различным атрибутам.
Используйте опцию --list, чтобы показать все известные последовательные порты USB и их атрибуты. Вы можете фильтровать по VID, PID, серийному номеру или названию поставщика. Используйте --help, чтобы увидеть параметры фильтрации.
find_port.py печатает имя /dev/ttyXXX, а не /dev/usb/... имя.
Ответ 4
Вы можете попробовать привязки libusb
Ответ 5
Для системы с прежним возвратом usb и libusb-1.0 этот подход будет работать для извлечения различных фактических строк. В качестве примера я покажу поставщика и продукт. Это может привести к некоторым ввода-выводам, поскольку на самом деле он считывает информацию с устройства (по крайней мере, в первый раз, во всяком случае.) Некоторые устройства не предоставляют эту информацию, поэтому предположение, что они это сделают, сделает исключение в этом случае; это нормально, поэтому мы проходим.
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
Ответ 6
Когда я запускаю свой код, я получаю следующий вывод, например.
<usb.Device object at 0xef38c0>
Device: 001
idVendor: 7531 (0x1d6b)
idProduct: 1 (0x0001)
Manufacturer: 3
Serial: 1
Product: 2
Следует отметить, что a) у меня есть объекты usb.Device
, тогда как у вас есть объекты usb.legacy.Device
, и b) у меня есть имена файлов устройства.
Каждый usb.Bus
имеет поле dirname
, и каждый usb.Device
имеет имя файла. Как вы можете видеть, имя файла похоже на 001
, а также имя dirname. Вы можете объединить их для получения файла шины. Для dirname=001
и filname=001
это должно быть что-то вроде /dev/bus/usb/ 001/001.
Сначала вы должны понять, какова эта ситуация "usb.legacy". Я использую последнюю версию, и у меня даже нет подмодуля legacy
.
Наконец, вы должны использовать поля idVendor
и idProduct
для уникальной идентификации устройства при его подключении.
Ответ 7
Если вам просто нужно имя устройства, вот небольшой взлом, который я написал в bash. Чтобы запустить его в python, вам понадобится следующий фрагмент. Просто замените $1 и $2 на номер шины и номер устройства, например 001 или 002.
import os
os.system("lsusb | grep \"Bus $1 Device $2\" | sed 's/\// /' | awk '{for(i=7;i<=NF;++i)print $i}'")
В качестве альтернативы вы можете сохранить его как bash script и запустить его оттуда тоже. Просто сохраните его как bash script, как foo.sh, сделать его исполняемым.
#!/bin/bash
myvar=$(lsusb | grep "Bus $1 Device $2" | sed 's/\// /' | awk '{for(i=7;i<=NF;++i)print $i}')
echo $myvar
Затем вызовите его в python script как
import os
os.system('foo.sh')
Ответ 8
Может кто-нибудь сказать мне, как перечислить устройства под устройства универсальной последовательной шины. Я не ищу данные портов. Порты, такие как COM1, COM2, отличаются от устройств в разделе "Устройства USB" в диспетчере устройств в WINDOWS 10. введите описание изображения здесь. Я подключил USB-кабель к устройствам Windows 10, и он отображается в разделе "Устройства USB", но не в разделе "ПОРТЫ". Не могли бы вы помочь мне в этом. Спасибо