Проблема с соединением для 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.

Другие вопросы по тегам