Distinguere le periferiche USB

Distinguere i dispositivi

Una singola installazione di Weewx può essere utilizzata per raccogliere dati da più dispositivi su un computer. Ma come puoi sapere quale dispositivo è?

Se i dispositivi sono collegati direttamente alle porte seriali, la porta seriale li identifica. Ad esempio, /dev/ttyS0 e /dev/ttyS1 o COM1 e COM2.

Identificare i dispositivi USB è un po' più complicato.

Ogni dispositivo USB ha un VendorID e un ProductID. La maggior parte dei software utilizza questi identificatori per distinguere un dispositivo USB da un altro. Tuttavia, se sono presenti due dispositivi USB con lo stesso VendorID e ProductID, è necessario trovare qualche altro attributo per distinguerli.

Se i dispositivi sono USB nativi, allora questa distinzione deve essere fatta nel software. Ad esempio, le stazioni Lacrosse WS28xx utilizzano ricetrasmettitori USB con un numero di serie univoco impresso al loro interno. Il parametro serial può essere specificato nel driver WS28xx.

Se i dispositivi sono convertitori da USB a seriale, il software non è in grado di distinguere i dispositivi. Il software vede ogni convertitore come una porta seriale. Quindi può fare riferimento a una porta seriale come /dev/ttyUSB0, ma quando il convertitore da USB a seriale viene scollegato e poi ricollegato, potrebbe apparire come /dev/ttyUSB1 invece di /dev/ttyUSB0.

Come ci si assicura che l'istanza di Weewx per il dispositivo A parli sempre e solo con il dispositivo A?

Utilizza le regole udev per garantire un nome univoco e coerente per ciascun dispositivo.

Esempio: due convertitori da usb a seriale

Ad esempio, se hai due convertitori USB-seriale FTDI, chiamati A e B, verranno visualizzati come /dev/ttyUSB0 e /dev/ttyUSB1. Ma quando scolleghi A e ricolleghi, potrebbe apparire come /dev/ttyUSB2.

Inizia con la configurazione di Weewx per ogni dispositivo. Nel file di configurazione di Weewx per il dispositivo A, usa port = /dev/deviceA. Allo stesso modo, per il dispositivo B: port = /dev/deviceB.

Crea un file di regole udev /etc/udev/rules.d/weewx.rules simile a questo:

# FTDI usb-serial converter for device A
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="XXXXXXXX", SYMLINK+="deviceA"
# FTDI usb-serial converter for device B
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="YYYYYYYY", SYMLINK+="deviceB"

dove XXXXXXXX è il numero di serie del convertitore da USB a seriale collegato al dispositivo A ed YYYYYYYY è il numero di serie del convertitore da USB a seriale collegato al dispositivo B.

Trova i numeri di serie osservando gli attributi USB dettagliati di ciascun dispositivo:

sudo lsusb -v

Dì al sistema operativo di ricaricare le regole con questo comando:

sudo udevadm control --reload-rules

Infine, scollegare e ricollegare il cavo USB a ciascun dispositivo per attivare udev ed effettuare i collegamenti.

Ora vedrai /dev/deviceA e /dev/deviceB, ognuno dei quali è un collegamento simbolico al dispositivo effettivo. Se scolleghi e ricolleghi i dispositivi, Weewx rileverà il dispositivo mancante, ritenterà la sua connessione, quindi tutto dovrebbe continuare normalmente. Non è necessario riavviare Weewx o apportare modifiche ai file di configurazione.

Determinare l'unicità di ciascun dispositivo

Il comando lsusb -v enumera gli attributi di ciascun dispositivo USB. Di solito è una buona idea eseguirlo con privilegi amministrativi, ad esempio, sudo lsusb -v poiché non tutti gli attributi sono visibili senza privilegi amministrativi.

Per vedere come questi attributi vengono visti da udev, usa i comandi udevadm. Per esempio:

sudo udevadm info -a -n /dev/ttyUSB0

Elencherà tutti gli attributi del dispositivo /dev/ttyUSB0, utilizzando le etichette che udev riconoscerà.

Devi usare le etichette udev nel file delle regole; udev non riconoscerà molte delle etichette che vedi nell'output di lsusb, anche se si riferiscono alla stessa cosa.

Autore: Tom Keffer