Windows:puoi estrarre le informazioni USB da WMI, ma devi essere amministratore. Gli esempi sono in .NET, ma dovresti essere in grado di usare il modulo Python WMI. Questo ti darà accesso alle stringhe di identificazione USB, che possono contenere informazioni utili. Per i dispositivi seriali FTDI esiste una scorciatoia che utilizza la DLL di FTDI, che non richiede l'accesso privilegiato.
Linux:tutte le informazioni disponibili sono in /sys/bus/usb
e disponibile anche tramite udev. Questa sembra una buona risposta.
So che questo è un post più vecchio, ma oggi stavo lottando con esso. Alla fine ho usato la libreria wmi per Python dato che sono su una macchina Windows (scusa, so che la mia risposta si applica solo a Windows, ma forse sarà d'aiuto qualcuno).
Installa prima il pacchetto usando pip:
pip install wmi
quindi
import wmi
c = wmi.WMI()
wql = "Select * From Win32_USBControllerDevice"
for item in c.query(wql):
print item.Dependent.Caption
Dovrebbe risultare con qualcosa come:
Hub radice USB
Hub radice USB
Porta di comunicazione da USB a seriale prolifica (COM9) Hub principale USB
Hub radice USB
Dispositivo composito USB
Dispositivo video USB Dispositivo audio USB
Hub radice USB
...taglia...
In questo caso, dovresti eseguire l'analisi delle stringhe della didascalia per trovare la porta COM. Puoi anche dare un'occhiata solo all'articolo. Oggetto dipendente per visualizzare altri attributi del dispositivo USB accanto a Caption che potresti trovare pertinenti:
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";
};
Per quanto riguarda Linux, se tutto ciò di cui hai bisogno è enumerare i dispositivi, puoi persino saltare la dipendenza pyudev per il tuo progetto e analizzare semplicemente l'output di /sbin/udevadm info --export-db
comando (non richiede privilegi di root). Scaricherà tutte le informazioni sui dispositivi e le classi presenti, inclusi gli ID prodotto USB per i dispositivi USB, che dovrebbero essere più che sufficienti per identificare i tuoi adattatori da USB a seriale. Ovviamente puoi farlo anche con pyudev.
Almeno per Linux, puoi usare alcuni hack fittizi per determinare il tuo nodo /dev, ispezionando ad esempio l'output di "ls /dev | grep ttyUSB" prima e dopo aver collegato il tuo dispositivo. Questo in qualche modo deve valere anche per il caso OSX. Una buona idea è ispezionare quei comandi usando qualcosa come il comando subprocess.Popen(). Per quanto riguarda Windows, questo potrebbe essere utile.