Kérdés:
Hogyan állíthatom vissza az USB-eszközt egy szkript segítségével?
RoboJ1M
2013-08-27 14:20:49 UTC
view on stackexchange narkive permalink

Van egy USB GSM modemem, amely nem képes a munka tulajdonságainak kielégítésére (Huawei E367u-2). Néha visszaáll (az USB-eszköz leválasztja / újracsatlakozik a naplókba), és amikor újból előáll, különböző ttyUSB-számokkal rendelkezik. Néha úgy tűnik, hogy indításkor az usb_modswitch egyszerűen nem lő ki. A számítógép egy Raspberry Pi, amely Raspbian-t futtat.

Erre egyszerű megoldásom van, a CRON minden percben a következő parancsfájlt futtatja:

  Ha a WVDIAL nem fut: Futtassa a WVDIAL 

A szkriptet a következőre szeretném változtatni:

  Ha a / dev / ttyUSB0 nincs meg: Ha DevicePresent (12d1: 1446): ResetDevice ( 12d1: 1446) ElseIs DevicePresemt (12d1: 1506) ResetUSB (12d1: 1506) Ha a WVDIAL nem fut: Futtassa a WVDIAL  

Nyilvánvalóan ez álkód, de a következő sorok vannak, amelyeket összefűzni kell, de nem tudom kideríteni, hogyan:

Ez a wvdial-t tölti be, ha nem fut:

  #! / bin / sh # /etc/init.d/wvdial### BITIN INIT INFO # Biztosítja: Az Internet # Kötelező-Start: $ remote_fs $ syslog # Kötelező-Stop: $ remote_fs $ syslog # Alapértelmezett-Kezdés: 2 3 4 5 # Alapértelmezett leállítás: 0 1 6 # Rövid leírás: Egyszerű szkript a program indításához indításkor # Leírás: Egyszerű szkript a www.stuffaboutcode.com webhelyről, amely elindítja / leállítja a program indítását / leállítását. ### END INIT INFO # Ha azt akarja, hogy a parancs mindig fusson, akkor tegye ide # Végezze el az adott funkciókat, amikor a "$ 1" systemcase kéri induláskor. Echo "GPRS Internet indítása" # futtatni kívánt alkalmazást / sbin / start-stop -daemon --start - háttér - csendes - exec / usr / bin / wvdial internet ;; stop) echo "A GPRS Internet leállítása" # leállítandó alkalmazás / sbin / start-stop-daemon --stop --exec / usr / bin / wvdial ;; *) echo "Használat: /etc/init.d/noip {start | stop}" kilépés 1 ;; esacexit 0  

Ezzel megkereshetem a / sys elérési út egy bizonyos eszközhöz:

  X-hez a / sys / bus / usb / devices / * fájlban; "X X" visszhang
cat "$ X / idVendor" 2> / dev / null macska "$ X / idProduct" 2> / dev / null echodone  

És ez visszaállítja az USB-eszközt, ha ismeri a helyes / sys elérési utat :

  echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorizedecho 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized kód> 

Tehát be kell írnom az utolsó 2 részt és egy tesztet a / dev / ttyUSB0 -ra egy szakaszba, amely a "Ha azt akarja, hogy a parancs mindig futjon" . tedd ide "szakasz

UPDATE 1

Az usbreset bár működik, de nem végzi el a munkát. Csak 0 visszhangozza az 1-et hitelesítéssel helyesen szimulálja az eszköz leválasztását / újracsatlakozását.
Ez az a trükk, hogy újraindítja az eszközt vagy az usb_modewitchet az életbe. Mint ilyen, ezt sikerült összezúzni:

  echo "$ 1 keresése" devPath = `lsusb | grep $ 1 | sed -r 's / Bus ([0-9] {3}) eszköz ([0-9] {3}). * / bus \ / usb \ / \ 1 \ / \ 2 / g;' echo " Talált $ 1 @ $ devPath "echo" sysPath keresése "a sysPath számára a / sys / bus / usb / devices / * fájlban; do echo "$ sysPath / uevent" devName = `macska" $ sysPath / uevent "| grep $ devPath` #echo devName = $ devName ha [! -z $ devName], majd törd meg a fidoneif [! -z $ devName], majd echo "Talált $ 1 @ $ sysPath," echo "visszhang visszaállítása 0 > $ sysPath / engedéllyel rendelkező echo 0 > $ sysPath / engedélyezett echo" echo 1 > $ sysPath / engedéllyel "echo 1 > $ sysPath / engedéllyel" echo 1 echo "Nem található a $ 1" fi  

Úgy gondolom, hogy most csak annyit kell tennem, hogy ezt teszem az init.d szkriptbe:

  if ttyUSB0 nincs jelen, ha 12d1: 1446 present / usr / sbin / resetdevicebyauthorized 12d1: 1446 else, ha 12d1: 1506 present / usr / sbin / resetdevicebyauthorized 12d1: 1506 fifi  
+1 `usbreset` nem működik a Huawei modemeknél, a modem nem képes helyreállni és az újraindításkor lefagy. Jelenleg ugyanazt a problémát oldom meg, és hamarosan egy teljesen működő megoldásom lehet.
Tudom, hogy nem ezt akarja hallani, de miután az általam használt bot miatt ez a probléma megsült, felvettem egy Huawei E3131-et a Tescótól (10 font). Ez egy router egy bottal, csak csatlakoztassa, és NAT1 IP-vel megkapja az eth1-et, és kész. Még webes felülete is van a konfigurációhoz. És szükség esetén átállítható normál PPP módba. @tohecz
Nos, mondd meg, hogy van-e ilyen olcsó 4G-s, és te vagy az én hősöm! :) (Jelenleg 4G tarifás és 3G modemmel vagyok, igen, és olyan 4G modemmel, aminek nincs ARM illesztőprogramja.)
Az [USB eszköz visszaállítása a terminálról] lehetséges másolata (http://raspberrypi.stackexchange.com/questions/8435/resetting-usb-device-from-terminal)
Nézze meg [ezt a kapcsolódó kérdést] (https://unix.stackexchange.com/questions/256331/how-to-logically-eject-disconnect-reattach-a-usb-device-dongle/256343#256343) a Unix és Linux SE rendszeren.
öt válaszokat:
gurcanozturk
2013-08-27 15:48:07 UTC
view on stackexchange narkive permalink

Ezzel a C programmal visszaállíthatja az USB buszt. https://gist.github.com/x2q/5124616

C-kód letöltése a github-ból

  wget -c --no-check -certificate https://gist.githubusercontent.com/x2q/5124616/raw/3f6e5f144efab2bc8e9d02b95b8301e1e0eab669/usbreset.c -O usbreset.c  

C-kód fordítása usbreset-ként

  cc usbreset.c -o usbreset  

Végrehajtási engedély megadása a programozáshoz

  chmod + x usbreset  

Sorolja fel az USB-eszközöket az lsusb paranccsal.

lsusb

A kimenetén látnia kell az USB-eszköz bejegyzéseit, és ellenőriznie kell a visszaállítani kívánt eszközt.

Busz 002 003 eszköz: ID 0fe9: 9010 DVICO

Futtassa a usbreset programot argumentumokkal

  sudo ./usbreset / dev / bus / usb / 002/003  
Még mindig össze kell állítani egy forgatókönyvvé. Valami ilyesmi: `x = lsusb | grep xxxx: yyyy "/ usr / sbin / usbreset $ x". Sajnos úgy tűnik, hogy nem tehetünk sortöréseket egy megjegyzésbe
Szükségem van rá az init.d szkriptembe (`wvdialer`). Jelenleg a CRON percenként futtatja, és ha nincs, a wvdial újratöltődik (a `start-stop-daemon` használatával). De nem indul el, ha a ttyUSB0 nincs meg. Különböző okokból kifolyólag a botnak néha csak életre kell kelnie. Tehát abban a szkriptben szükségem van "Ha a ttyUSB0 nincs jelen, állítsd vissza az USB-meghajtót"
Használja az lsusb parancsot további információkért? Példa ; lsusb -d xxxx: yyyy, akkor ellenőrizze, hogy ott van-e az USB modem, ha nem hívja az usbreset szolgáltatást.
rishta
2016-12-26 03:56:45 UTC
view on stackexchange narkive permalink

A pyusb segítségével visszaállíthat egy eszközt:

Először telepítse a pyusb-t:

  sudo pip telepítse a pyusb  

Ezután hozza létre ezt a parancsfájlt, és futtassa: >

Alkalmazza az idVendor és az idProduct elemeket a visszaállítani kívánt eszközhöz (az azonosítót a lsusb oldalon találja)

Thoht
2019-01-12 12:56:10 UTC
view on stackexchange narkive permalink

Készítettem egy egyszerű bash parancsfájlt az adott USB-eszköz alaphelyzetbe állításához.

  #! / bin / bash # írja be az lsusb parancsot, hogy megtalálja az "eladó" és a "termék" azonosítót a -euo pipefail IFS = $ '\ n \ t' # terminálkészletben. szerkessze az alábbi vonalvezetéseket szállító- és termékértékek lsusb eredményével dev = $ (lsusb -t | grep usbdevicename | grep 'If 1' | cut -d '' -f13 | cut -d "," -f1) # ELADÓ = 05a3 # PRODUCT = 9230 ELADÓ = $ (lsusb -s $ dev | cut -d '' -f6 | cut -d: -f1) PRODUCT = $ (lsusb -s $ dev | cut -d '' -f6 | cut -d: -f2) a DIR-re $-ban (find / sys / bus / usb / devices / -maxdepth 1 -típus l); tedd, ha [[-f $ DIR / idVendor && -f $ DIR / idProduct && $ (cat $ DIR / idVendor) == $ VENDOR && $ (cat $ DIR = = cat $ DIR = (cat $ DIR = majd visszhang 0 > $ DIR / engedélyezett alvás 0.5 visszhang 1 > $ DIR / engedélyezett fi kész  
McPeppr
2015-12-02 21:27:34 UTC
view on stackexchange narkive permalink

Nagyon köszönöm! Ez a C-kód nagyon jól működik. Ez az egyszerű shell parancsfájl, amelyet az USB-eszköz azonosításához

  #! / Bin / bashUSBNAME = webcamLSUSB = $ (lsusb | grep --ignore-case $ USBNAME) FOLD = "/ dev / bus / usb /" $ (echo $ LSUSB | cut --delimiter = '' --fields = '2') "/" $ (echo $ LSUSB | cut --delimiter = ' '--fields =' 4 '| tr --delete ":") echo $ LSUSBecho $ FOLDsudo ./usbreset $ FOLD  
ree2k
2019-12-23 17:30:54 UTC
view on stackexchange narkive permalink

A Huawei modem visszaállítása nem mindig működik. Mivel mindenesetre egy systemd szolgáltatással tárcsázom, felvettem néhány sort, amelyek teljesen kikapcsolják az összes USB eszközt, és 5 perc után újraindítják a málnát: - )

  [Unit] Description = GSM InternetRequires = network.target # Ha 12 órán belül nem tud elindulni, kapcsolja ki az összes USB-t és indítsa újra az indítást. StartLimitIntervalSec = 43200StartLimitBurst = 300OnFailure = unpower-usb-reboot.service [Service] Típus = forkingUser = rootExecStartPre = / bin / ls / dev / serial / by-id / usb-HUAWEI_Technology_HUAWEI_Mobile-if00-port0ExecStart = / usr / bin / ponRemainAfterExit = yesExecStop = / usr / bin / poffest = multi-user.target  
  [Unit] Leírás = Kikapcsolja az összes USB-t és újraindítja [Szolgáltatás] User = rootExecStart = / bin / sh -c 'echo 0 > / sys / devices / platform / soc / 20980000.usb / buspower; alvás 5m; leállítás -r most ' 


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...