Portál AbcLinuxu, 14. července 2025 00:10
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.