Страница 1 из 1

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

Добавлено: 30 авг 2019, 18:46
SinglWolf
Интернет-провайдер в нашей местности достал до такой степени, что пришлось искать альтернативу.
► Показать
Об этой эпопее читайте Есть ли жизнь без Ростелекома? Есть! Прощай, Ростелеком! А сейчас расскажу как подключить 3G\4G модем в режиме Hilink к роутеру с OS OpenWrt и настроить бесперебойный доступ в интернет.
Имеется модем, разблокированный под любого оператора Huawei E3372h-153. Модем работает в режиме Hilink (определяется как сетевая карта).
E3372h.png
E3372h.png (44.24 КБ) 34220 просмотров
Была задача подключить его к роутеру и раздавать интернет всем устройствам, подключенных к маршрутизатору. Модель роутера не имеет значения. Лишь бы был хотя бы 1 USB порт и прошивка OpenWrt. Ну и нужен доступ в интернет для скачивания необходимых пакетов. Раньше я поднимал точку доступа на смартфоне, а на роутере поднимал Wi-Fi клиента, теперь пользуюсь скриптом для создания локального репозитория пакетов для OpenWRT [WINDOWS].
Заходим по ssh (через Putty, например) в систему роутера и устанавливаем необходимые пакеты. Можно то же самое проделать через web-интерфейс.

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

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

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

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

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

<?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_wps.trigger='none'
		#uci commit
		#echo "none" > /sys/class/leds/tdw89x0:green:wps/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
#Проверяем подключен ли модем
if [ X"$(ls /sys/class/net | grep eth1)" != X"" ]; then
	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_wps.trigger='heartbeat'
		#uci commit
		#echo "heartbeat" > /sys/class/leds/tdw89x0:green:wps/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_wps.trigger='heartbeat'
			#uci commit
			reboot
		fi
	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. Как я уже упоминал, скрипт написан "на коленке". Есть что оптимизировать и дополнить. Например, добавить мигание индикаторами при обрыве линка. В скрипте эти строки есть, но закомментированы. Если хотите сделать себе индикацию, пишите, указав версию прошивки и модель роутера.

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

Добавлено: 31 авг 2019, 12:16
rewuxiin
в TPlink-ах обычно есть wathdogs. устанавливаешь пинг в яндекс и если нет ответа - перезагружаешь все устройство, раз usb модем питается от него

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

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

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

Добавлено: 09 июн 2020, 20:19
Mordevolt
Расскажите пожалуйста конец истории! аналогичная проблема с модемом, вот сейчас пытаюсь воспользоватся вашим скриптом.

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

Добавлено: 10 июн 2020, 19:54
SinglWolf
Mordevolt писал(а):
09 июн 2020, 20:19
Расскажите пожалуйста конец истории!
Да что рассказывать....
Обновил в роутере прошивку 18.06. Всё работает :-)
Спрашивайте, если что.

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

Добавлено: 21 авг 2020, 07:19
yobgzpwu
спасибо за статью

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

Добавлено: 15 сен 2020, 00:12
bezoomie
интернет не отваливается?

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

Добавлено: 15 сен 2020, 18:42
SinglWolf
bezoomie писал(а):
15 сен 2020, 00:12
интернет не отваливается?
Очень-очень редко :-)
Основная проблема сейчас в том, что М Т С научилась палить раздачу с патченного модема на "безлимитном" тарифе и частенько ни с того, ни с сего режет скорость до 1 мегабит. ]:->
Приходится вручную делать реконнект через вебморду модема.
Решение пока не ищу - ростелеком тянет к нам оптику, обещает GPON \m/ \m/

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

Добавлено: 01 ноя 2020, 05:59
SinglWolf
Ростелеком, как и предполагалось, подложил очередную свинью! ]:->
Оптику протянули только до своей будки.
Дальше как прежде - по ADSL *ROFL*
Единственная разница: теперь скорость будет не 256 килобит/сек., а 6 мегабит. \m/ \m/ :-|
И то только к Новому Году доделают...
Нафига мне такой интернет, буду сидеть на мобильном. :-)
В связи с этим обновил скрипт.
Добавил проверку наличие модема.
Если модема нет, скрипт ничего не делает. То есть, если модема нет, теперь роутер не перезагружается.

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

Добавлено: 29 ноя 2021, 05:48
Kirgiz_09
Здравствуйте. А сможете накидать 2 скрипта:
1. Переключение на "Только 3g"
2. Переключение на "Только 4g"
По вечерам на 4g сеть лежит, приходится вручную через веб-интерфейс каждый день переключать на 3g на 2-3 часа, а потом ночью обратно на 4g.
Буду очень признателен!

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

Добавлено: 29 ноя 2021, 10:56
SinglWolf
Kirgiz_09 писал(а):
29 ноя 2021, 05:48
А сможете накидать 2 скрипта:
1. Переключение на "Только 3g"
2. Переключение на "Только 4g"
Как вы себе всё это представляете?

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

Добавлено: 29 ноя 2021, 19:13
Kirgiz_09
SinglWolf писал(а):
29 ноя 2021, 10:56
Как вы себе всё это представляете?
Допустим создать скрипт "Только 3g", добавить в crontab выполнение в 19:30, а "Только 4G" в 23:30.

При вводе адреса Для просмотра ссылок Вы должны быть авторизованы на форуме. я тоже получил ответ как у вас на скриншоте.
Параметр <CurrentNetworkType>9</CurrentNetworkType> это и есть тип сети как я понимаю (в данном случае "Только 3g"). Для "Только 4G" этот параметр равен 19. Нет ли возможности отправить по Curl команду на изменение этого параметра?

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

Добавлено: 29 ноя 2021, 19:42
SinglWolf
Kirgiz_09 писал(а):
29 ноя 2021, 19:13
При вводе адреса Для просмотра ссылок Вы должны быть авторизованы на форуме. я тоже получил ответ как у вас на скриншоте.
Параметр <CurrentNetworkType>9</CurrentNetworkType> это и есть тип сети как я понимаю (в данном случае "Только 3g"). Для "Только 4G" этот параметр равен 19. Нет ли возможности отправить по Curl команду на изменение этого параметра?
Я уже забыл всё, если честно :-D .
Смотрите код скрипта.Есть же команды модему. Смотрите как отправляются. Всё возможно.
У меня сейчас просто нет времени на это :-[ . Только после НГ *PARDON* .

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

Добавлено: 06 фев 2022, 12:07
Funjy
Классный мануал. Большое спасибо!

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

Добавлено: 16 янв 2024, 21:36
azzee
А как сделать просто рестарт модема через хайлинковский API, просто ежечасно?
Или реконект может можно сделать ежечасно?

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

Добавлено: 17 янв 2024, 08:42
SinglWolf
azzee писал(а):
16 янв 2024, 21:36
А как сделать просто рестарт модема через хайлинковский API, просто ежечасно?
Или реконект может можно сделать ежечасно?
На 4pda есть тема про E3372h. Читал там, что можно залезть в сам модем и настроить в системе crontab.
А так, рестарт роутера можно делать ежечасно, если время перезагрузки не напрягает.