Ich habe ein USB-GSM-Modem, das nicht immer funktioniert (Huawei E367u-2). Manchmal wird es zurückgesetzt (USB-Gerät wird in Protokollen getrennt / wieder verbunden), und wenn es wieder hochfährt, hat es unterschiedliche ttyUSB-Nummern. Manchmal scheint usb_modswitch beim Booten einfach nicht gefeuert zu werden. Der Computer ist ein Raspberry Pi, auf dem Raspbian ausgeführt wird.
Ich habe eine einfache Lösung dafür: Jede Minute führt CRON das folgende Skript aus:
If WVDIAL is not running:
Run WVDIAL
Ich möchte das Skript folgendermaßen ändern:
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
Natürlich ist dies Pseudocode, aber ich habe die folgenden Zeilen, die ich aneinanderreihen muss, aber ich kann nicht herausfinden, wie:
Dies lädt wvdial, wenn es nicht ausgeführt wird:
#! /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
Auf diese Weise kann ich den /sys
Pfad zu einem bestimmten Gerät finden:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
Und dies setzt ein USB-Gerät zurück, wenn Sie den richtigen / sys-Pfad kennen:
echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized
Daher muss ich die letzten beiden Abschnitte und einen Test /dev/ttyUSB0
in einen Abschnitt einfügen, der unter dem Abschnitt "Wenn ein Befehl immer ausgeführt werden soll. Fügen Sie ihn hier ein" steht
UPDATE 1
usbreset funktioniert zwar, funktioniert aber nicht. Nur Echo 0 die 1 in authroized
simuliert korrekt das Trennen / Wiederverbinden eines Geräts.
Dies ist der Trick, um das Gerät oder usb_modeswitch wieder zum Leben zu erwecken. Als solches habe ich es geschafft, Folgendes zusammenzubasteln:
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
Ich denke, alles was ich jetzt tun muss, ist dies in das init.d Skript zu schreiben:
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
schlägt bei Huawei-Modems fehl, das Modem kann nicht wiederhergestellt werden und friert beim Neustart ein. Ich löse derzeit das gleiche Problem und habe möglicherweise bald eine voll funktionsfähige Lösung.Antworten:
Ich habe ein einfaches Bash-Skript zum Zurücksetzen eines bestimmten USB-Geräts erstellt.
quelle
Sie können den USB-Bus über dieses C-Programm zurücksetzen. https://gist.github.com/x2q/5124616
Laden Sie den C-Code von github herunter
Kompilieren Sie C-Code als Usbreset
Geben Sie dem Programm die Ausführungsberechtigung
Listen Sie Ihre USB-Geräte mit dem Befehl lsusb auf
Sie sollten USB-Geräteeinträge in Ihrer Ausgabe sehen und überprüfen, auf welches Gerät Sie zurücksetzen möchten.
Bus 002 Gerät 003 : ID 0fe9: 9010 DVICO
Führen Sie das usbreset-Programm mit Argumenten aus
quelle
x = lsusb | grep xxxx:yyyy
/usr/sbin/usbreset $x
. Leider können wir keine Zeilenumbrüche in einen Kommentarwvdialer
). Derzeit führt CRON es jede Minute aus und lädt wvdial neu, wenn es nicht vorhanden ist (usingstart-stop-daemon
). Aber es wird nicht gestartet, wenn ttyUSB0 nicht da ist. Aus verschiedenen Gründen muss der Stock nur manchmal wieder zum Leben erweckt werden. Also in diesem Skript brauche ichIf ttyUSB0 is not present reset the USB stick
Sie können pyusb verwenden, um ein Gerät zurückzusetzen:
Installieren Sie zuerst pyusb:
Erstellen Sie dann dieses Skript und führen Sie es aus:
Passen Sie das
idVendor
undidProduct
an das Gerät an, das Sie zurücksetzen möchten (Sie finden die ID überlsusb
)quelle
Ich danke dir sehr! Dieser C-Code funktioniert einfach super. Dies ist das einfache Shell-Skript, mit dem ich das USB-Gerät identifiziert habe
quelle
Das Zurücksetzen meines Huawei-Modems funktioniert nicht immer. Da ich mich sowieso mit einem systemd-Dienst einwähle, habe ich einige Leitungen hinzugefügt, die alle USB-Geräte vollständig ausschalten und die Himbeere nach 5 Minuten neu starten :-)
quelle