Portál AbcLinuxu, 8. listopadu 2025 14:43
můžete mi prosím poradit jestli je možné z USB zařízení (v mém případě meteostanice) číst pomocí bash skriptu data. Momentálně to načítám pomocí malého C prográmku (nejsem jeho autorem).
O co mi jde:
mám meteostanici připojenou přes USB k routeru s linuxem (teď momentálně OpenWRT). Chtěl bych pomocí skriptu načíst naměřená data ze stanice a pak si je odeslat na web.
#!/bin/sh mount /dev/sda1 /mnt/flash cp /mnt/flash/foo barNN
Ten C prográmek je závislý na konkrétním routeru/linuxu (Asus), jinde mi nejede. Chtěl bych něco univerzálního, kde jen vycucnu surové data, pošlu na server a tam zpracuji.
Nejlépe pomocí bashe, ale teoreticky třeba i pomocí jiného skriptovacího jazyka běžně dostupného na routerech (perl, python, php), hlavně bez nutnosti kompilace.
hub.c: new USB device 00:03.0-1.1, assigned address 5
usb.c: kmalloc IF 81fb4ba0, numif 1
usb.c: skipped 1 class/vendor specific interface descriptors
usb.c: new device strings: Mfr=0, Product=0, SerialNumber=0
usb.c: unhandled interfaces on device
usb.c: USB device 5 (vend/prod 0x1941/0x8021) is not claimed by any active driver.
Length = 18
DescriptorType = 01
USB version = 1.10
Vendor:Product = 1941:8021
MaxPacketSize0 = 8
NumConfigurations = 1
Device version = 1.00
Device Class:SubClass:Protocol = 00:00:00
Per-interface classes
Configuration:
bLength = 9
bDescriptorType = 02
wTotalLength = 0022
bNumInterfaces = 01
bConfigurationValue = 01
iConfiguration = 00
bmAttributes = 80
MaxPower = 100mA
Interface: 0
Alternate Setting: 0
bLength = 9
bDescriptorType = 04
bInterfaceNumber = 00
bAlternateSetting = 00
bNumEndpoints = 01
bInterface Class:SubClass:Protocol = 03:00:00
iInterface = 00
Endpoint:
bLength = 7
bDescriptorType = 05
bEndpointAddress = 81 (in)
bmAttributes = 03 (Interrupt)
wMaxPacketSize = 0008
bInterval = 0a
usb.c: kusbd: /sbin/hotplug add 5
hub.c: port 2, portstatus 103, change 0, 12 Mb/s
read < /dev/ttyS0 eventuelně read < /dev/ttyUSB0. Takže pokud se pro komunikaci s meteostanicemi používá libusb a není pro ně nějaký kernelový modul který by například vytvořil znakové zařízení /dev/usbMETEO0 tak to z bashe nepůjde. A tedy navrhuji asi toto: většina těch routerů běží na ARM CPU a zkompiloval bych si pomocí crosscompiler toolchainu statickou binárku toho prográmku v C, která by se dala použít v těch routerech.
Zkusil bych co píše
# ls /dev/ttyUSB*
Pokud se tam po připojení té stanice objeví nové zařízení - např. /dev/ttyUSB0, tak je napůl vyhráno... komunikujeme přes virtuální seriový port...
Pak doporučuji nějaký terminálový prográmek - já používám minicom... tam v nastavení vychytej parametry toho portu a zkus, že jsi schopný komunikovat... pak teprve začneme řešit nash - ale obecně: čtení a zápis se řeší stejně jako se soubory - např.
# echo "ATZ" > /dev/ttyUSB0
# cat /dev/ttyUSB0
Předem je ale nutné nastavit parametry komunikace (proto ten minicom) přes program stty
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.