Получение дружественных имен устройств в Python - PullRequest
11 голосов
/ 26 сентября 2011

2-портовое сигнальное реле подключено к компьютеру через последовательный интерфейс USB. Используя модуль pyserial, я могу легко управлять этими реле. Однако это основано на предположении, что я заранее знаю, какой COM-порт (или / dev-узел) назначен устройству.

Для проекта, который я делаю, этого недостаточно, поскольку я не хочу предполагать, что устройство всегда назначается, например, для COM7 в Windows. Мне нужно иметь возможность идентифицировать устройство программно на всех возможных платформах (Win, Linux, OSX (что, я думаю, будет похоже на подход Linux)), используя python. Возможно, как следует из названия, перечислить USB-устройства в системе и как-то получить более понятные имена для них. Windows и Linux - самые важные платформы для поддержки.

Любая помощь будет принята с благодарностью!

EDIT:
Похоже, что pyudev-модуль подойдет для Linux-систем. У кого-нибудь был такой опыт?

Ответы [ 6 ]

7 голосов
/ 26 сентября 2011

Что касается Linux, если все, что вам нужно, это перечислить устройства, вы можете даже пропустить зависимость pyudev для вашего проекта и просто проанализировать вывод команды /sbin/udevadm info --export-db (не требует привилегий root). Он выведет всю информацию о существующих устройствах и классах, включая идентификаторы USB-устройств для USB-устройств, которых должно быть более чем достаточно для идентификации ваших адаптеров USB-последовательный порт. Конечно, вы также можете сделать это с pyudev.

4 голосов
/ 23 февраля 2013

Я знаю, что это старый пост, но я боролся с ним сегодня. В конечном итоге я использовал библиотеку wmi для python, поскольку я работаю на компьютере с Windows (извините, я знаю, что мой ответ применим только к Windows, но, возможно, он кому-нибудь поможет).

Сначала установите пакет, используя pip:

pip install wmi

затем

import wmi
c = wmi.WMI()
wql = "Select * From Win32_USBControllerDevice"
for item in c.query(wql):
    print item.Dependent.Caption

Должно получиться что-то вроде:

USB Root Hub
USB Root Hub
Порт Prolific USB-to-Serial (COM9) USB Root Hub
USB Root Hub
Составное USB-устройство
USB-видеоустройство Аудиоустройство USB
USB Root Hub
... чик ...

В этом случае вам придется анализировать заголовок строки, чтобы найти COM-порт. Вы также можете посмотреть только на элемент. Зависимый объект для просмотра других атрибутов USB-устройства рядом с заголовком, которые могут оказаться уместными:

instance of Win32_PnPEntity
{
    Caption = "USB Root Hub";
    ClassGuid = "{36fc9e60-c465-11cf-8056-444553540000}";
    ConfigManagerErrorCode = 0;
    ConfigManagerUserConfig = FALSE;
    CreationClassName = "Win32_PnPEntity";
    Description = "USB Root Hub";
    DeviceID = "USB\\ROOT_HUB\\4&32F13EF0&1";
    HardwareID = {"USB\\ROOT_HUB&VID8086&PID3A36&REV0000",     
                "USB\\ROOT_HUB&VID8086&PID3A36", "USB\\ROOT_HUB"};
    Manufacturer = "(Standard USB Host Controller)";
    Name = "USB Root Hub";
    PNPDeviceID = "USB\\ROOT_HUB\\4&32F13EF0&1";
    Service = "usbhub";
    Status = "OK";
    SystemCreationClassName = "Win32_ComputerSystem";
    SystemName = "001fbc0934d1";
};
2 голосов
/ 26 сентября 2011

Windows: вы можете получить информацию USB из WMI , но вам нужно быть администратором .Примеры приведены в .NET, но вы должны использовать модуль Python WMI .Это даст вам доступ к идентификационным строкам USB, которые могут содержать полезную информацию.Для устройств с последовательным интерфейсом FTDI имеется ярлык с использованием библиотеки FTDI, который не требует привилегированного доступа.

Linux: вся доступная информация находится под /sys/bus/usb, а также доступна через udev. Это похоже на хороший ответ .

2 голосов
/ 26 сентября 2011

По крайней мере для linux, вы можете использовать несколько фиктивных хаков для определения вашего узла / dev, проверяя, например, вывод «ls / dev | grep ttyUSB» до и после подключения вашего устройства. Это как-то должно относиться и к случаю OSX. Хорошая идея - проверить эти команды, используя что-то вроде команды subprocess.Popen (). Что касается Windows, это может быть полезным.

1 голос
/ 26 сентября 2011

Что касается Windows, вы можете сканировать реестр:

import _winreg as reg
from itertools import count

key = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, 'HARDWARE\\DEVICEMAP\\SERIALCOMM')
try:
    for i in count():
        device, port = reg.EnumValue(key, i)[:2]
        print device, port
except WindowsError:
    pass
0 голосов
/ 26 сентября 2011

Было бы здорово, если это возможно, но по моему опыту с коммерческим оборудованием, использующим COM-порты, это не так. В большинстве случаев вам необходимо вручную установить в программном обеспечении COM-порт. Это беспорядок, особенно в Windows (по крайней мере, XP), который в некоторых случаях имеет тенденцию изменять количество com-портов. В некоторых устройствах в программном обеспечении имеется функция автообнаружения, которая отправляет небольшое сообщение на каждый COM-порт и ожидает правильного ответа. Это, конечно, работает, только если прибор реализует какую-то команду идентификации. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...