Mam modem USB GSM, który nie zawsze działa prawidłowo (Huawei E367u-2) Czasami resetuje się (urządzenie USB odłącza / ponownie łączy się w logach), a kiedy wraca, ma różne numery ttyUSB. Czasami po uruchomieniu usb_modswitch wydaje się po prostu nie zostać zwolniony. Komputer to Raspberry Pi z systemem Raspbian.
Mam na to proste rozwiązanie, co minutę CRON uruchamia następujący skrypt:
If WVDIAL is not running:
Run WVDIAL
Chcę zmienić skrypt w następujący sposób:
If /dev/ttyUSB0 is not present:
If DevicePresent(12d1:1446):
ResetDevice(12d1:1446)
ElseIs DevicePresemt(12d1:1506)
ResetUSB(12d1:1506)
If WVDIAL is not running:
Run WVDIAL
Oczywiście jest to pseudo kod, ale mam następujące wiersze, które muszę połączyć razem, ale nie wiem, jak to zrobić:
To ładuje wvdial, jeśli nie jest uruchomiony:
#! /bin/sh
# /etc/init.d/wvdial
### BEGIN INIT INFO
# Provides: TheInternet
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
# Description: A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO
# If you want a command to always run, put it here
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting GPRS Internet"
# run application you want to start
/sbin/start-stop-daemon --start --background --quiet --exec /usr/bin/wvdial internet
;;
stop)
echo "Stopping GPRS Internet"
# kill application you want to stop
/sbin/start-stop-daemon --stop --exec /usr/bin/wvdial
;;
*)
echo "Usage: /etc/init.d/noip {start|stop}"
exit 1
;;
esac
exit 0
To pozwala mi znaleźć /sys
ścieżkę do określonego urządzenia:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
I to resetuje urządzenie USB, jeśli znasz prawidłową ścieżkę / sys:
echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized
Muszę więc napisać ostatnie 2 sekcje i test do /dev/ttyUSB0
sekcji, która znajduje się w sekcji „Jeśli chcesz, aby polecenie zawsze działało. Umieść je tutaj”
AKTUALIZACJA 1
usbreset, chociaż działa, nie spełnia swojej roli. Tylko echo 0 the 1 authroized
poprawnie symuluje rozłączenie / ponowne podłączenie urządzenia.
To właśnie polega na ponownym uruchomieniu urządzenia lub przełącznika usb_modeswitch. Jako taki udało mi się połączyć to:
echo "Searching for $1"
devPath=`lsusb | grep $1 | sed -r 's/Bus ([0-9]{3}) Device ([0-9]{3}).*/bus\/usb\/\1\/\2/g;'`
echo "Found $1 @ $devPath"
echo "Searching for sysPath"
for sysPath in /sys/bus/usb/devices/*; do
echo "$sysPath/uevent"
devName=`cat "$sysPath/uevent" | grep $devPath`
#echo devName=$devName
if [ ! -z $devName ]
then
break
fi
done
if [ ! -z $devName ]
then
echo "Found $1 @ $sysPath, Resetting"
echo "echo 0 > $sysPath/authorized"
echo 0 > $sysPath/authorized
echo "echo 1 > $sysPath/authorized"
echo 1 > $sysPath/authorized
else
echo "Could not find $1"
fi
Myślę zatem, że wszystko, co muszę teraz zrobić, to umieścić to w skrypcie init.d:
if ttyUSB0 not present
if 12d1:1446 present
/usr/sbin/resetdevicebyauthorized 12d1:1446
else if 12d1:1506 present
/usr/sbin/resetdevicebyauthorized 12d1:1506
fi
fi
usbreset
nie działa z modemami Huawei, modem nie jest w stanie się zregenerować i zawiesza się przy ponownym uruchomieniu. Obecnie rozwiązuję ten sam problem i wkrótce mogę znaleźć w pełni działające rozwiązanie.Odpowiedzi:
Zrobiłem prosty skrypt bash do zresetowania konkretnego urządzenia USB.
źródło
Możesz zresetować magistralę USB za pomocą tego programu C. https://gist.github.com/x2q/5124616
Pobierz kod C z github
Skompiluj kod C jako usbreset
Zezwól na wykonanie programu
Wyświetl listę urządzeń USB za pomocą polecenia lsusb
Powinieneś zobaczyć wpisy urządzenia USB na wyjściu i sprawdzić urządzenie, dla którego chcesz zresetować.
Magistrala 002 Urządzenie 003 : ID 0fe9: 9010 DVICO
Uruchom program usbreset z argumentami
źródło
x = lsusb | grep xxxx:yyyy
/usr/sbin/usbreset $x
. Niestety wydaje się, że nie możemy wstawiaćwvdialer
). Obecnie CRON uruchamia go co minutę i ponownie ładuje wvdial, jeśli go nie ma (używastart-stop-daemon
). Ale nie uruchomi się, jeśli nie będzie tam ttyUSB0. Teraz z różnych powodów kij po prostu czasami potrzebuje powrotu do życia. Potrzebuję więc tego skryptuIf ttyUSB0 is not present reset the USB stick
Możesz użyć pyusb do zresetowania urządzenia:
Pierwsza instalacja pyusb:
Następnie utwórz ten skrypt i uruchom go:
Dostosuj
idVendor
iidProduct
do urządzenia, które chcesz zresetować (możesz znaleźć identyfikator za pośrednictwemlsusb
)źródło
Dziękuję bardzo! Ten kod C działa po prostu świetnie. To jest prosty skrypt powłoki, który zrobiłem, aby zidentyfikować urządzenie USB
źródło
Resetowanie mojego modemu Huawei nie zawsze działa. Ponieważ i tak łączę się z usługą systemową, dodałem kilka linii, które całkowicie wyłączają wszystkie urządzenia USB i ponownie uruchamiają malinę po 5 minutach :-)
źródło