Eu tenho um modem USB GSM que nem sempre funciona (Huawei E367u-2) Às vezes, ele é redefinido (dispositivo USB desconectado / reconectado em logs) e, quando volta, ele tem números ttyUSB diferentes. Às vezes, na inicialização, o usb_modswitch parece não ser demitido. O computador é um Raspberry Pi executando o Raspbian.
Eu tenho uma solução simples para isso, a cada minuto que o CRON executa o seguinte script:
If WVDIAL is not running:
Run WVDIAL
Eu quero mudar o script para ser este:
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, esse é um pseudo-código, mas eu tenho as seguintes linhas que preciso unir, mas não consigo descobrir como:
Isso carrega o wvdial se não estiver em execução:
#! /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
Isso me permite encontrar o /sys
caminho para um determinado 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
E isso redefine um dispositivo USB se você souber o caminho / sys correto:
echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized
Portanto, preciso /dev/ttyUSB0
inserir as duas últimas seções e um teste em uma seção que se enquadre na seção "Se você deseja que um comando sempre seja executado. Coloque-o aqui"
ATUALIZAÇÃO 1
O usbreset, embora funcionando, não faz o trabalho. Apenas o eco de 0 a 1 authroized
simula corretamente um dispositivo desconectar / reconectar.
É isso que faz o truque de inicializar o dispositivo ou usb_modeswitch de volta à vida. Como tal, eu consegui juntar isso:
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
Acho que, portanto, tudo o que tenho que fazer agora é colocar isso no 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
falha nos modems Huawei, o modem não consegue se recuperar e congela na reinicialização. Atualmente, estou resolvendo o mesmo problema e, em breve, poderá ter uma solução totalmente funcional.Respostas:
Eu criei um script bash simples para redefinir um dispositivo USB específico.
fonte
Você pode redefinir o barramento USB através deste programa C. https://gist.github.com/x2q/5124616
Faça o download do código C no github
Compilar o código C como usbreset
Dê permissão de execução ao programa
Listar seus dispositivos USB via comando lsusb
Você deve ver as entradas do dispositivo USB na saída e verificar o dispositivo para o qual deseja redefinir.
Dispositivo 003 do barramento 002 : ID 0fe9: 9010 DVICO
Execute o programa usbreset com argumentos
fonte
x = lsusb | grep xxxx:yyyy
/usr/sbin/usbreset $x
. Infelizmente parece que não podemos colocar quebras de linha em um comentáriowvdialer
). Atualmente, o CRON o executa a cada minuto e recarrega o wvdial se não estiver presente (usandostart-stop-daemon
). Mas não será iniciado se ttyUSB0 não estiver lá. Agora, por várias razões, o bastão às vezes precisa voltar à vida. Então, nesse necessidade roteiro IIf ttyUSB0 is not present reset the USB stick
Você pode usar o pyusb para redefinir um dispositivo:
Primeiro instale o pyusb:
Em seguida, crie este script e execute-o:
Adapte
idVendor
eidProduct
ao dispositivo que deseja redefinir (você pode encontrar o ID vialsusb
)fonte
Muito obrigado! Este código C funciona muito bem. Este é o script de shell simples que fiz para identificar o dispositivo USB
fonte
Redefinir meu modem Huawei nem sempre funciona. Como eu estou discando com um serviço systemd de qualquer maneira, adicionei algumas linhas que desligam totalmente todos os dispositivos USB e reiniciam o raspberry após 5 minutos :-)
fonte