Проблема с соединением для Raspberry Pi с 3G/4G Dongle
Я смиренно прихожу к вам в конце моей привязи, балансируя на грани безумия.
Вот ситуация:
Небольшой сервис, который предоставляет мой бизнес, работает на Raspberry Pi Zero W.
Он настраивается с помощью usb_modeswitch с использованием Huawei k4203 и следующей конфигурации:
/etc/udev/rules.d/40-usb_modeswitch.rules
# Huawei k4203
ACTION=="add", ATTR{idVendor}=="12d1", ATTR{idProduct}=="1f1c",
RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1f1c -W -M
55534243123456780000000000000011062000000101000100000000000000"
ACTION=="add", SUBSYSTEM=="net", ATTRS{idVendor}=="12d1",
ATTRS{idProduct}=="1590", NAME="4gmodem", RUN+="/root/modem-up.sh"
ACTION=="remove", KERNEL=="4gmodem", RUN+="/root/modem-down.sh"
/root/modem-down.sh
#!/bin/bash
# modem-down.sh
/usr/bin/systemctl restart openvpn@raspz1
/usr/bin/rfkill unblock wifi
/usr/bin/ip link set WIRELESS_INTERFACE up[/code]
/root/modem-up.sh
#!/bin/bash
# modem-up.sh
/usr/bin/rfkill block wifi
#/usr/bin/netctl restart 4gmodem-PROFILE
# Optional
#/usr/bin/ping -c 1 -w 60 8.8.8.8 &&
/usr/bin/systemctl restart openvpn@raspz1
/etc/usb_modeswitch.d/12d1:1f1c
# Vodafone / Huawei K4203
DefaultVendor=0x12d1
DefaultProduct=0x1f1c
#DefaultProduct=0x14fb
TargetVendor=0x12d1
TargetProductList="157a,1590"
MessageContent="55534243123456780000000000000011062000000101000100000000000000"
HuaweiNewMode=1
Проблема в том, что иногда ключ отключается от Интернета - я не могу подключиться к нему по SSH, он отключается от моей VPN, и клиенты раздражаются. Когда я в офисе, ничего страшного - я просто вытаскиваю ключ, засовываю его обратно, и он снова работает.
В качестве альтернативы, я могу отключить питание на стене и после загрузки снова подключится и заработает.
Тем не менее, в настоящее время я путешествую за границу и (пытаюсь) провести отпуск (моя семья постоянно просит меня отключить компьютер, поскольку я часами ищу решение).
По сути, мне нужен способ удаленного подключения ключа к сети через какой-либо скрипт.
Вещи, которые я пробовал:
-> Скрипт, который регулярно пингует сеть, и если он не попадает на google.com, перезагружает пи.
Это не работает По причинам, которые я не могу понять, перезагрузка программного обеспечения не перезапускает соединение. У меня такое ощущение, что это может быть потому, что он не отключает питание ключа, как полная перезагрузка или вытаскивание ключа.
-> Режущая сила для ключа
Я попытался отключить питание, используя следующий скрипт:
echo 0 > /sys/devices/platform/soc/20980000.usb/buspower
sleep 5
echo 1 > /sys/devices/platform/soc/20980000.usb/buspower
Это действительно отключает питание, но только на мгновение (например, оно не будет отключено до тех пор, пока я не отправлю "эхо 1", но вместо этого устройство несколько раз мигнет синим, а затем вернется в свое текущее состояние.)
В качестве примечания: когда вы впервые подключаете ключ физически, он несколько раз мигнет зеленым, прежде чем станет синим, но с вышеописанным сценарием этого не происходит.
-> все варианты ifconfig 4gmodem вниз && вверх
Кажется, ничего не делает.
-> /etc/init.d/networking restart - похоже, ничего не делает
Я думаю, что-то может сработать:
У меня была эта идея в течение нескольких дней, но есть риск, что если я ошибаюсь, пи останется отключенным от Интернета, и у меня не будет никакого способа исправить это, пока я не вернусь домой - что нехорошо, ха-ха
echo "rebooting internet"
#remove lines from modeswitch so it won't enable modem mode when plugged in.
sudo rm /etc/udev/rules.d/40-usb_modeswitch.rules
#reboot dongle
sudo echo 0 > /sys/devices/platform/soc/20980000.usb/buspower
sleep 5
sudo echo 1 > /sys/devices/platform/soc/20980000.usb/buspower
#modem will hopefully now be flashing green (in storage mode, not modem)
#write to file
sudo cat <<EOT >> /etc/udev/rules.d/40-usb_modeswitch.rules
# Huawei k4203
ACTION=="add", ATTR{idVendor}=="12d1", ATTR{idProduct}=="1f1c", RUN+="/usr/sbin/usb_modeswitch -v
12d1 -p 1f1c -W -M 55534243123456780000000000000011062000000101000100000000000000"
ACTION=="add", SUBSYSTEM=="net", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1590",
NAME="4gmodem", RUN+="/root/modem-up.sh"
ACTION=="remove", KERNEL=="4gmodem", RUN+="/root/modem-down.sh"
EOT
#reboot dongle again with mode_switch reconfigured
sudo echo 0 > /sys/devices/platform/soc/20980000.usb/buspower
sleep 5
sudo echo 1 > /sys/devices/platform/soc/20980000.usb/buspower
# Device should now reboot into modem mode
Идея с приведенным выше кодом заключается в том, что при настройке ключа я заметил, что когда модем не находится в режиме модема, он мигает зеленым (например, когда вы сначала подключаете его к устройству, прежде чем он станет синим), поэтому вышеприведенный код по существу "ломается" usb_modeswitch, перезагружает ключ, где он, вероятно, перейдет в режим хранения, а затем вернет процесс обратно.
Я думаю, что это может сработать, но, как я уже сказал, это слишком рискованно для этого далеко.
У кого-нибудь есть мысли или идеи о том, как я мог бы сценарий отключить / повторно подключить 3g Dongle?
Спасибо
1 ответ
Я периодически проверяю внешний ip с помощью try:
ip=(socket.gethostbyname("info.io"))
кроме: IP = 'unknown' напечатайте IP, затем перезагрузите пи, если таковой не существует. Я также добавляю dhclient wlan0, но это, вероятно, работает только для модемов, которые используют прямое ip connect вместо wvdial. Посмотрите, сможете ли вы найти в сети сценарий, который изменяет конфигурацию модема, чтобы предотвратить его включение в любом другом режиме, кроме режима модема, который сработал на моем Sierra 320U.