Tengo un módem GSM USB que no siempre funciona como propiedad (Huawei E367u-2) A veces se restablece (dispositivo USB se desconecta / vuelve a conectar en los registros) y cuando vuelve a funcionar, tiene diferentes números ttyUSB. A veces, en el arranque, usb_modswitch parece no ser despedido. La computadora es una Raspberry Pi con Raspbian.
Tengo una solución simple para esto, cada minuto CRON ejecuta el siguiente script:
If WVDIAL is not running:
Run WVDIAL
Quiero cambiar el script para que sea esto:
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
Obviamente, este es un pseudocódigo, pero tengo las siguientes líneas que necesito para unir, pero no puedo entender cómo:
Esto carga wvdial si no se está ejecutando:
#! /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
Esto me permite encontrar la /sys
ruta a cierto dispositivo:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
Y esto restablece un dispositivo USB si conoce la ruta correcta / 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
Por lo tanto, necesito encadenar las últimas 2 secciones y una prueba /dev/ttyUSB0
en una sección que vaya debajo de la sección "Si desea que un comando siempre se ejecute. Póngalo aquí"
ACTUALIZACIÓN 1
Usbreset, aunque funciona, no hace el trabajo. Solo echo 0 el 1 authroized
simula correctamente una desconexión / reconexión del dispositivo.
Esto es lo que hace que el truco de reiniciar el dispositivo o usb_modeswitch vuelva a la vida. Como tal, he logrado improvisar esto:
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
Por lo tanto, creo que todo lo que tengo que hacer ahora es poner esto en el 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
falla con los módems Huawei, el módem no puede recuperarse y se congela al reiniciar. Actualmente estoy resolviendo el mismo problema, y podría tener una solución totalmente funcional pronto.Respuestas:
Hice un script bash simple para restablecer un dispositivo USB en particular.
fuente
Puede restablecer el bus USB a través de este programa C. https://gist.github.com/x2q/5124616
Descargar el código C de github
Compile el código C como usbreset
Dar permiso de ejecución para programar
Enumere sus dispositivos USB mediante el comando lsusb
Debería ver las entradas del dispositivo USB en su salida y marcar el dispositivo para el que desea restablecer.
Bus 002 Dispositivo 003 : ID 0fe9: 9010 DVICO
Ejecute el programa usbreset con argumentos
fuente
x = lsusb | grep xxxx:yyyy
/usr/sbin/usbreset $x
. Por desgracia, parece que no podemos poner saltos de línea en un comentariowvdialer
). Actualmente CRON lo ejecuta cada minuto, y vuelve a cargar wvdial si no está presente (usandostart-stop-daemon
). Pero no comenzará si ttyUSB0 no está allí. Ahora, por varias razones, el palo a veces necesita volver a la vida. Así que en ese script necesitoIf ttyUSB0 is not present reset the USB stick
Puede usar pyusb para restablecer un dispositivo:
Primero instala pyusb:
Luego cree este script y ejecútelo:
Adapte el
idVendor
yidProduct
al dispositivo que desea restablecer (puede encontrar la identificación a través delsusb
)fuente
Muchas gracias! Este código C funciona muy bien. Este es el script de shell simple que hice para identificar el dispositivo USB
fuente
Restablecer mi módem Huawei no siempre funciona. Como de todos modos estoy marcando con un servicio systemd, agregué algunas líneas que desconectan por completo todos los dispositivos USB y reinicia la frambuesa después de 5 minutos :-)
fuente