Уважаемые гости и пользователи форума!
Если Вы были зарегистрированы на старом форуме, а здесь не можете зайти под своей учётной записью, пожалуйста, сообщите свой ник мне через контактную форму "Связаться с администрацией"

Продвинутый рестарт (smart reboot) 3G\4G модема Huawei E3372 в режиме Hilink через роутер с прошивкой OpenWrt

OpenWrt — встроенная операционная система, основанная на ядре Linux, и предназначенная, в первую очередь, для домашних маршрутизаторов. Основные компоненты включают в себя ядро Linux, util-linux, uClibc или musl и BusyBox. Размер всех компонентов оптимизирован в связи с тем, что в большинстве домашних маршрутизаторов сильно ограничен объём памяти.

Модераторы: rewuxiin, kulia

Аватара пользователя
SinglWolf
Контактная информация:
Откуда: Башкирия
Сообщения: 1329
Зарегистрирован: 23 янв 2012, 22:11

Продвинутый рестарт (smart reboot) 3G\4G модема Huawei E3372 в режиме Hilink через роутер с прошивкой OpenWrt

30 авг 2019, 18:46

Интернет-провайдер в нашей местности достал до такой степени, что пришлось искать альтернативу.
► Показать
Об этой эпопее как-нибудь напишу статью. А сейчас расскажу как подключить 3G\4G модем в режиме Hilink к роутеру с OS OpenWrt и настроить бесперебойный доступ в интернет.
Имеется модем, разблокированный под любого оператора Huawei E3372h-153. Модем работает в режиме Hilink (определяется как сетевая карта).
E3372h.png
E3372h.png (44.24 КБ) 836 просмотров
Была задача подключить его к роутеру и раздавать интернет всем устройствам, подключенных к маршрутизатору. Модель роутера не имеет значения. Лишь бы был хотя бы 1 USB порт и прошивка OpenWrt. Ну и нужен доступ в интернет для скачивания необходимых пакетов. (Я поднимал точку доступа на смартфоне, а на роутере поднимал Wi-Fi клиента.)
Заходим по ssh (через Putty, например) в систему роутера и устанавливаем необходимые пакеты. Можно то же самое проделать через web-интерфейс.

Код: Выделить всё

opkg update
opkg install kmod-usb-net-cdc-ether
opkg install usb-modeswitch;
reboot
Предварительно нужно отключить NAT в модеме. Для этого подключаем модем к компьютеру, заходим в веб-интерфейс по адресу 192.168.8.1 и настраиваем как на картинке:
dmz.png
Подключаем модем к роутеру.
Дожидаемся перезагрузки роутера и заходим в веб-морду. Нам нужно создать новый интерфейс.
Сеть --> Интерфейсы --> Добавить новый интерфейс.
interface.png
  1. Назначаем имя интерфейсу. Имя произвольное.
  2. Назначаем протокол. DHCP-клиент. Модем сам выдаст роутеру IP-адрес.
  3. Выбираем наш модем как сетевое устройство, которое определилось в роутере. В моём случае это eth1. У меня уже создан интерфейс с именем МТС, который привязан к eth1, так что не обращайте на это внимания. :-)
  4. Применяем.
firewall.png
  1. Далее нам нужно перейти на вкладку "Настройки межсетевого экрана".
  2. Выбрать зону wan. Она всегда красным цветом.
  3. Кликнуть на кнопку "Сохранить и применить"
Ждём несколько секунд...
В списке интерфейсов должен появиться наш модем.
interfacelist.png

Веб-интерфейс модема по-прежнему доступен по адресу 192.168.8.1
huawei.png
Всё, уже можно пользоваться... Некоторое время... До первого недоумения: "КУДА ДЕЛСЯ ИНТЕРНЕТ???" :-D

Не знаю как обстоят дела у других владельцев 3\4G модемов, но у меня иногда "отваливается интернет". :'( Захожу в веб-морду модема, а там всё ОК. Линк есть, даже трафик бежит. Жидкий, но он есть, а интернета НЕТ... *SCRATCH*
В 99% помогает простое отключение и включение соединения. В редких случаях нужно перезагружать модем. Но проще передёрнуть модем в USB.
У меня роутер висит на стене, как раз за монитором. Каждый раз заходить в веб-морду модема (вставать и лезть за монитор) как-то лениво... :-[ Да и "толстые" торренты качаю иногда... :-)
Что-то надо придумать для автоматического "передёргивания модема".
Что первое пришло в голову - пакет watchcat OpenWrt.
Но там, если "отвалился" интернет тупо перезагружается роутер. А это долго.
td-w8970-v1.png
td-w8970-v1.png (109.78 КБ) 827 просмотров
По крайней мере мой гигабитный TP-Link TD-W8970 v1.2 перезагружается довольно нерасторопно. :(
Приходила мысль перешить модем в Stick (классический USB-модем) и рулить им через AT-команды *YAHOO* .
Покопал инфу в интернете и пришёл к выводу: встать и передёрнуть модем в роутере - быстрее и проще, чем прошить модем, а потом организовать автоматику через AT-команды. %)
Решение нашлось. У Huawei-ев в режиме Hilink есть API. Например, если в браузере перейти по ссылке http://192.168.8.1/api/monitoring/status на экране появится ряд чисел
APIstatus.png
APIstatus.png (5.82 КБ) 826 просмотров
а код страницы имеет довольно информативные теги

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8"?>
<response>
<ConnectionStatus>901</ConnectionStatus>
<WifiConnectionStatus></WifiConnectionStatus>
<SignalStrength></SignalStrength>
<SignalIcon>5</SignalIcon>
<CurrentNetworkType>9</CurrentNetworkType>
<CurrentServiceDomain>3</CurrentServiceDomain>
<RoamingStatus>0</RoamingStatus>
<BatteryStatus></BatteryStatus>
<BatteryLevel></BatteryLevel>
<BatteryPercent></BatteryPercent>
<simlockStatus>0</simlockStatus>
<WanIPAddress>10.111.217.135</WanIPAddress>
<WanIPv6Address></WanIPv6Address>
<PrimaryDns>212.188.31.152</PrimaryDns>
<SecondaryDns>212.188.31.153</SecondaryDns>
<PrimaryIPv6Dns></PrimaryIPv6Dns>
<SecondaryIPv6Dns></SecondaryIPv6Dns>
<CurrentWifiUser></CurrentWifiUser>
<TotalWifiUser></TotalWifiUser>
<currenttotalwifiuser>0</currenttotalwifiuser>
<ServiceStatus>2</ServiceStatus>
<SimStatus>1</SimStatus>
<WifiStatus></WifiStatus>
<CurrentNetworkTypeEx>46</CurrentNetworkTypeEx>
<maxsignal>5</maxsignal>
<wifiindooronly>-1</wifiindooronly>
<wififrequence>0</wififrequence>
<classify>hilink</classify>
<flymode>0</flymode>
<cellroam>0</cellroam>
<ltecastatus>0</ltecastatus>
</response>
УРЯЯЯЯ-ЯЯЯ-Я! *YAHOO* *DANCE*
Устанавливаем curl в роутере,

Код: Выделить всё

opkg update
opkg install curl
заходим в консоль, набираем команду

Код: Выделить всё

curl -s -X GET http://192.168.8.1/api/monitoring/status
и получаем ОБЛОМ!!!! ]:->
APIopenwrt.png
Потратив изрядное количество времени в поиске информации, всё-таки нашёл объяснение такого поведения API модема. Всё дело в безопасности. Чтобы не было несанкционированного доступа к API модема. То есть для нормального ответа API модема нам нужно как-то легализовать свои запросы.
Пишем команду в консоли роутера:

Код: Выделить всё

curl -s -X GET http://192.168.8.1/api/webserver/SesTokInfo
и получаем информацию:

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8"?>
<response>
<SesInfo>SessionID=tJnebnySHLlP+whNsVwHn5yJMFizfddRGJZwH7lea4Es69qnk40CUaYQ0h0jr06EriRBZ8glcZGg/wRuQCPRofm0l1YxFefLhLLZRwX9QO700PIkCkKOB2IxEXPyrGlV</SesInfo>
<TokInfo>tuY0erY9OgnafggIYylBN2mm+cI/mntb</TokInfo>
</response>
Чтобы API модема нормально принимала команды, нужно предварительно и перед каждой командой запрашивать данные сессии и внедрять содержимое тегов <SesInfo></SesInfo> и <TokInfo></TokInfo> в тело запросов.
Путём метода "научного тыка", несчётного количества проб и ошибок я написал небольшой скрипт, который позволяет управлять модемом через API.
Пока только пинг гугловского DNS и три варианта реакции на отсутствие ответа.
1. Отключение и включение линка в модеме.
2. Если не помогло - перезагрузка модема.
3. Если и это не помогло - перезагрузка роутера.
Алгоритм пока сырой. Но пользоваться уже можно.

Код: Выделить всё

#!/bin/ash
# самая первая строка не ошибка!
#functions
getToken() {
	SesTokInfo=$(curl -s -X GET http://192.168.8.1/api/webserver/SesTokInfo) #получаем данные
	export SesInfo=$(echo "${SesTokInfo}" | grep SesInfo | cut -d ">" -f2 | cut -d "<" -f1) #получаем SesInfo
	export TokInfo=$(echo "${SesTokInfo}" | grep TokInfo | cut -d ">" -f2 | cut -d "<" -f1) #получаем TokInfo
}
#
checkLink() {
	export LIMIT=$1
	for i in $(seq 0 $LIMIT)
	do
	if ping -W 5 8.8.8.8 -c 1 >>  /dev/null; then
		export LinkOFF=0
		#uci set system.led_dsl.trigger='none'
		#uci commit
		#echo "none" > /sys/class/leds/tdw89x0:green:dsl/trigger
		break;
	else
		logger "No internet connection. Wait..."
		sleep 1
	fi
	export LinkOFF=1
	done
}
#
getStatusLink() {
	getToken
	StatusAll=$(curl -s -X GET http://192.168.8.1/api/monitoring/status -H "Cookie: $SesInfo" -H "__RequestVerificationToken: $TokInfo")
	export statusLink=$(echo "${StatusAll}" | grep ConnectionStatus | cut -d ">" -f2 | cut -d "<" -f1) #получаем состояние подключения
	#echo $statusLink
}
#
setLinkOFF() {
	getToken
	# отключаем соединение
	curl http://192.168.8.1/api/dialup/mobile-dataswitch -H "Cookie: $SesInfo" -H "__RequestVerificationToken: $TokInfo" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: http://192.168.8.1/html/home.html" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><dataswitch>0</dataswitch></request>"
}
#
setLinkON() {
	getToken
	# включаем соединение
	curl http://192.168.8.1/api/dialup/mobile-dataswitch -H "Cookie: $SesInfo" -H "__RequestVerificationToken: $TokInfo" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: http://192.168.8.1/html/home.html" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><dataswitch>1</dataswitch></request>"
}
rebootModem() {
	#reboot
	getToken
	curl http://192.168.8.1/api/device/control -H "Cookie: $SesInfo" -H "__RequestVerificationToken: $TokInfo" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: http://192.168.8.1/html/home.html" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><Control>1</Control></request>"
	logger "3G modem rebooting"
}
#begin
checkLink 1
if [ X"$LinkOFF" == X"0" ]; then
	if [ -f "/etc/router" ]; then
		rm -rf /etc/router
	fi
	exit 0;
else
#uci set system.led_dsl.trigger='heartbeat'
#uci commit
#echo "heartbeat" > /sys/class/leds/tdw89x0:green:dsl/trigger
	getStatusLink
	if [ X"${statusLink}" == X"901" ]; then
		setLinkOFF
		sleep 10
		# ждём 10 секунд
	fi
	getStatusLink
	if [ X"${statusLink}" == X"902" ]; then
		setLinkON
	fi
fi
#
checkLink 10
if [ X"$LinkOFF" == X"0" ]; then
	logger "3G modem reconnected"
	exit 0;
else
	rebootModem
fi
checkLink 20
if [ X"$LinkOFF" == X"0" ]; then
	logger "3G modem rebooted"
	exit 0;
else
	logger "Router reboot"
	if [ ! -f "/etc/router" ]; then
		touch /etc/router
		#uci set system.led_dsl.trigger='heartbeat'
		#uci commit
		reboot
	fi
fi
Итак... Чтобы использовать данный скрипт, нам нужно настроить cron и создать расписание, по которому он будет запускаться.

Код: Выделить всё

touch /etc/crontabs/root
ln -sf /etc/crontabs/root /etc/crontab
/etc/init.d/cron start
/etc/init.d/cron enable
Проверим запуск cron

Код: Выделить всё

logread | grep "cron"
Выхлоп должен быть примерно таким:

Код: Выделить всё

Sun Sep  1 07:26:50 2019 cron.info crond[2481]: crond (busybox 1.28.4) started, log level 5
Теперь нам нужно разместить скрипт в файловой системе роутера и создать расписание запуска сценария.
В OpenWrt по-умолчанию в целях экономии размера прошивки нет продвинутого текстового редактора. Только vi с минимальным функционалом. Так что будет проще и быстрее залить готовый файл скрипта в роутер любым удобным способом. Например, WinSCP из-под Windows
WinSCP.png
Удобнее всего размещать скрипты в каталоге /etc
После копирования файла в файловую систему роутера, нам нужно установить атрибуты скрипта на исполнение. Можно сделать тем же WinSCP.
WinSCPattr.png
или консольной командой

Код: Выделить всё

chmod o+x /etc/m.sh
Осталось написать и запустить задание для cron. Быстрее всего это можно сделать через консоль (Скрипт будет запускаться каждую минуту - значение "*/1").

Код: Выделить всё

echo -e "*/1 * * * * sh /etc/m.sh\n" >> /etc/crontab
/etc/init.d/cron restart
На этом всё. Удачи! *DRINK*

P.S. Как я уже упоминал, скрипт написан "на коленке". Есть что оптимизировать и дополнить. Например, добавить мигание индикаторами при обрыве линка. В скрипте эти строки есть, но закомментированы. Если хотите сделать себе индикацию, пишите, указав версию прошивки и модель роутера.
m.zip
Готовый скрипт. Нужно только распаковать.
(1.12 КБ) 15 скачиваний
rewuxiin
Супер модератор
Супер модератор
Сообщения: 221
Зарегистрирован: 30 окт 2012, 15:14

Re: Управление 3G\4G модемом Huawei E3372 в режиме Hilink через роутер с прошивкой OpenWrt

31 авг 2019, 12:16

в TPlink-ах обычно есть wathdogs. устанавливаешь пинг в яндекс и если нет ответа - перезагружаешь все устройство, раз usb модем питается от него
Аватара пользователя
SinglWolf
Контактная информация:
Откуда: Башкирия
Сообщения: 1329
Зарегистрирован: 23 янв 2012, 22:11

Re: Управление 3G\4G модемом Huawei E3372 в режиме Hilink через роутер с прошивкой OpenWrt

31 авг 2019, 12:26

rewuxiin писал(а):
31 авг 2019, 12:16
в TPlink-ах обычно есть wathdogs. устанавливаешь пинг в яндекс и если нет ответа - перезагружаешь все устройство, раз usb модем питается от него
Это watchcat в OpenWrt. Дык долго же. Тем более если роутер не имеет программного управления питанием USB-портов, модем так и останется зависшим линком. И я ещё не дописал статью. Финал с хэппи-эндом. :-D

Вернуться в «OpenWrt|LEDE»