J'ai un modem USB GSM qui ne fonctionne pas toujours (Huawei E367u-2) Parfois, il est réinitialisé (déconnexion / reconnexion du périphérique USB dans les journaux) et lorsqu'il revient, il a des numéros ttyUSB différents. Parfois au démarrage, usb_modswitch semble juste ne pas être viré. L'ordinateur est un Raspberry Pi exécutant Raspbian.
J'ai une solution simple à cela, chaque minute CRON exécute le script suivant:
If WVDIAL is not running:
Run WVDIAL
Je veux changer le script comme ceci:
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
Évidemment, c'est du pseudo-code, mais j'ai les lignes suivantes que je dois enchaîner, mais je ne peux pas comprendre comment:
Cela charge wvdial s'il n'est pas en cours d'exécution:
#! /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
Cela me permet de trouver le /sys
chemin vers un certain appareil:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
Et cela réinitialise un périphérique USB si vous connaissez le chemin / sys correct:
echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized
Donc, je dois enchaîner les 2 dernières sections et un test /dev/ttyUSB0
dans une section qui passe sous la section "Si vous voulez qu'une commande soit toujours exécutée. Mettez-la ici"
MISE À JOUR 1
usbreset, bien que fonctionnel, ne fait pas l'affaire. Seul l'écho 0 le 1 dans authroized
simule correctement une déconnexion / reconnexion de périphérique.
C'est ce que fait l'astuce de redémarrer l'appareil ou usb_modeswitch dans la vie. En tant que tel, j'ai réussi à bricoler ensemble ceci:
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
Je pense donc que tout ce que j'ai à faire maintenant est de mettre ceci dans le script 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
échoue avec les modems Huawei, le modem n'est pas en mesure de récupérer et se fige au redémarrage. Je suis en train de résoudre le même problème, et je pourrais avoir une solution pleinement opérationnelle bientôt.