Имеется модем, разблокированный под любого оператора Huawei E3372h-153. Модем работает в режиме Hilink (определяется как сетевая карта).
Заходим по ssh (через Putty, например) в систему роутера и устанавливаем необходимые пакеты. Можно то же самое проделать через web-интерфейс.
Код: Выделить всё
opkg update
opkg install kmod-usb-net-cdc-ether usb-modeswitch curl
reboot
Дожидаемся перезагрузки роутера и заходим в веб-морду. Нам нужно создать новый интерфейс.
Сеть --> Интерфейсы --> Добавить новый интерфейс.
- Назначаем имя интерфейсу. Имя произвольное.
- Назначаем протокол. DHCP-клиент. Модем сам выдаст роутеру IP-адрес.
- Выбираем наш модем как сетевое устройство, которое определилось в роутере. В моём случае это eth1. У меня уже создан интерфейс с именем МТС, который привязан к eth1, так что не обращайте на это внимания.
- Применяем.
- Далее нам нужно перейти на вкладку "Настройки межсетевого экрана".
- Выбрать зону wan. Она всегда красным цветом.
- Кликнуть на кнопку "Сохранить и применить"
В списке интерфейсов должен появиться наш модем.
Веб-интерфейс модема по-прежнему доступен по адресу Для просмотра ссылок Вы должны быть авторизованы на форуме.
Не знаю как обстоят дела у других владельцев 3\4G модемов, но у меня иногда "отваливается интернет". Захожу в веб-морду модема, а там всё ОК. Линк есть, даже трафик бежит. Жидкий, но он есть, а интернета НЕТ...
В 99% помогает простое отключение и включение соединения. В редких случаях нужно перезагружать модем. Но проще передёрнуть модем в USB.
У меня роутер висит на стене, как раз за монитором. Каждый раз заходить в веб-морду модема (вставать и лезть за монитор) как-то лениво... Да и "толстые" торренты качаю иногда...
Что-то надо придумать для автоматического "передёргивания модема".
Что первое пришло в голову - пакет watchcat OpenWrt.
Но там, если "отвалился" интернет тупо перезагружается роутер. А это долго.
Приходила мысль перешить модем в Stick (классический USB-модем) и рулить им через AT-команды .
Покопал инфу в интернете и пришёл к выводу: встать и передёрнуть модем в роутере - быстрее и проще, чем прошить модем, а потом организовать автоматику через AT-команды.
Решение нашлось. У Huawei-ев в режиме Hilink есть API. Например, если в браузере перейти по ссылке Для просмотра ссылок Вы должны быть авторизованы на форуме. на экране появится ряд чисел
Код: Выделить всё
<?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>
Устанавливаем curl в роутере,
Код: Выделить всё
opkg update
opkg install curl
Код: Выделить всё
curl -s -X GET http://192.168.8.1/api/monitoring/status
Пишем команду в консоли роутера:
Код: Выделить всё
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.
Пока только пинг гугловского 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
Код: Выделить всё
touch /etc/crontabs/root
ln -sf /etc/crontabs/root /etc/crontab
/etc/init.d/cron start
/etc/init.d/cron enable
Код: Выделить всё
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.
Код: Выделить всё
chmod o+x /etc/m.sh
Код: Выделить всё
echo -e "*/1 * * * * sh /etc/m.sh\n" >> /etc/crontab
/etc/init.d/cron restart
P.S. Как я уже упоминал, скрипт написан "на коленке". Есть что оптимизировать и дополнить. Например, добавить мигание индикаторами при обрыве линка. В скрипте эти строки есть, но закомментированы. Если хотите сделать себе индикацию, пишите, указав версию прошивки и модель роутера.