У меня есть USB GSM модем, который не всегда обладает рабочим свойством (Huawei E367u-2). Иногда он сбрасывается (отключение / переподключение USB-устройства в журналах), а при возврате он имеет разные номера ttyUSB. Иногда при загрузке usb_modswitch просто не срабатывает. Компьютер Raspberry Pi работает под управлением Raspbian.
У меня есть простое решение, каждую минуту CRON запускает следующий скрипт:
If WVDIAL is not running:
Run WVDIAL
Я хочу изменить сценарий так:
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
Очевидно, это псевдокод, но у меня есть следующие строки, которые мне нужно связать вместе, но я не могу понять, как:
Это загружает wvdial, если он не работает:
#! /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
Это позволяет мне найти /sys
путь к определенному устройству:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
И это сбрасывает USB-устройство, если вы знаете правильный путь / 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
Итак, мне нужно объединить последние 2 раздела и тест /dev/ttyUSB0
в раздел, который находится в разделе «Если вы хотите, чтобы команда всегда выполнялась. Поместите ее здесь»
ОБНОВЛЕНИЕ 1
usbreset, хотя функционирует, не выполняет свою работу. Только эхо 0 в 1 authroized
правильно имитирует отключение / переподключение устройства.
Это то, что возвращает к жизни устройство или usb_modeswitch. Таким образом, мне удалось собрать это:
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
Поэтому я думаю, что теперь все, что мне нужно сделать, это поместить в скрипт 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
не работает с модемами Huawei, модем не может восстановиться и зависает при перезагрузке. В настоящее время я решаю ту же проблему, и скоро у меня может быть полностью рабочее решение.Ответы:
я сделал простой bash-скрипт для сброса определенного USB-устройства.
источник
Вы можете сбросить шину USB с помощью этой программы. https://gist.github.com/x2q/5124616
Скачать код C с GitHub
Скомпилировать код C как usbreset
Дать разрешение на выполнение программы
Выведите список своих USB-устройств с помощью команды lsusb
Вы должны увидеть записи устройства USB на своем выходе и проверить устройство, для которого вы хотите выполнить сброс.
Автобус 002 Устройство 003 : ID 0fe9: 9010 DVICO
Запустите программу usbreset с аргументами
источник
x = lsusb | grep xxxx:yyyy
/usr/sbin/usbreset $x
. К сожалению, кажется, что мы не можем поставить разрывы строк в комментарииwvdialer
). В настоящее время CRON запускает его каждую минуту и перезагружает wvdial, если его нет (используяstart-stop-daemon
). Но он не запустится, если ttyUSB0 там не будет. Теперь по разным причинам палку просто нужно вернуть к жизни. Так что в этом сценарии мне нужноIf ttyUSB0 is not present reset the USB stick
Вы можете использовать pyusb для сброса устройства:
Сначала установите pyusb:
Затем создайте этот скрипт и запустите его:
Адаптируйте
idVendor
иidProduct
к устройству, которое вы хотите сбросить (вы можете найти идентификатор черезlsusb
)источник
Спасибо большое! Этот C-код работает просто отлично. Это простой сценарий оболочки, который я сделал для идентификации устройства USB
источник
Сброс моего модема Huawei не всегда работает. Так как я в любом случае подключаюсь через службу systemd, я добавил несколько строк, которые полностью отключают питание всех USB-устройств и перезагружают малину через 5 минут :-)
источник