Початок. Продовження історії тут.
Є інтернет LTE на 60 мегабіт, є рутер TP-LINK L-WR1043ND з USB-портом, куплено за недорогу копійку модем ZTE MF880. Задача була проста - подружити цей весь колгосп для роздачі інтернету по квартирі. Вирішення не передбачало ніяких несподіванок: викинути оригінальну прошивку, закинути туди нову на базі DD-WRT або OpenWRT, модем мав служити WAN-інтерфейсом. DD-WRT мені вже трохи приїлося, захотілося знову побавитися з OpenWRT, тож завантажив в рутер останню версію на даний час Chaos Calmer 15.05. На диво все пройшло гладко. Підключив рутер до існуючої мережі, встановив необхідні пакунки
#opkg update
#opkg install wwan comgt chat comgt-ncm comgt-directip uqmi umbim usb-modeswitch
і пакунки для зв'язку через QMI модуль
#opkg install uqmi kmod-usb-net-qmi-wwan
В цій новій Chaos Calmer 15.05 появився новий пакунок wwan, який служить для автоматичного викривання драйвера модему. Це ніби добре, модем має автоматично викритися і зв'язатися з мережею. Треба лиш відкоригувати wan інтерфейс в /etc/config/network:
config 'interface' 'wan'
option proto wwan
option apn internet
Можна ще додати option pincode 1234, якщо sim-карта з пін-кодом. Тобто рутер за допомогою скриптів пакунку wwan мав би розпізнати модем, впровадити пін-код 1234 і заставити його з'єднатися з мережею провайдера з APN "internet". Нового інтерфейсу я не створював, щоб потім не гратися з фаєрволом, використав стандартний wan, так як вище. Все би мало грати як гітара. Втикаю модем, і ... тиша. ?*№&!!!! Явне вказування протоколу теж нічого не дало:
config 'interface' 'wan'
option 'proto' 'qmi'
option 'device' '/dev/cdc-wdm0'
option 'apn' 'internet'
Настроїв WiFi, лізу по ssh до нього. dmesg показуює, що появився пристрій /dev/cdc-wdm0:
[ 111.170000] usb 1-1: new high-speed USB device number 6 using ehci-platform
[ 111.320000] option 1-1:1.0: GSM modem (1-port) converter detected
[ 111.330000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[ 111.340000] option 1-1:1.1: GSM modem (1-port) converter detected
[ 111.340000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[ 111.350000] option 1-1:1.2: GSM modem (1-port) converter detected
[ 111.360000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[ 111.370000] option 1-1:1.3: GSM modem (1-port) converter detected
[ 111.370000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
[ 111.400000] qmi_wwan 1-1:1.4: cdc-wdm0: USB WDM device
[ 111.400000] qmi_wwan 1-1:1.4 wwan0: register 'qmi_wwan' at usb-ehci-platform-1, WWAN/QMI device, 5d:a2:44:f8:89:56
Нарешті ps показує, що модем застряг на команді
uqmi -s -d /dev/cdc-wdm0 --get-pin-status
і
grep "UIM uninitialized"
Що за чорт, я ж піна ніякого не маю на sim-картці. А навіть якщо б мав, то все одно так не має бути. Вбиваю всі процеси uqmi:
killall -9 uqmi
і пробую uqmi -s -d /dev/cdc-wdm0 --get-pin-status - дійсно висить, не рухається. Знайшов ті стрічки у файлі /lib/netifd/proto/qmi.sh :
while uqmi -s -d "$device" --get-pin-status | grep '"UIM uninitialized"' > /dev/null; do
sleep 1;
done
[ -n "$pincode" ] && {
uqmi -s -d "$device" --verify-pin1 "$pincode" || {
echo "Unable to verify PIN"
proto_notify_error "$interface" PIN_FAILED
proto_block_restart "$interface"
return 1
}
}
закоментував. Витягую модем, вставляю - ха! Працює! Але все це мені це не подобається, зміна системних файлів не входить в плани. Після проб зробив все інакше.
Поміняв інтерфейс wan у /etc/config/network:
config interface 'wan'
option ifname 'wwan0'
option proto 'dhcp'
Переписав скрипт для автоматичного з'єднання модему при розриві зв'язку з блогу UAVmatrix, назвав /usr/bin/checklte.sh:
#!/bin/sh
YOUR_APN=internet
#Create lock file
LOCKFILE=/tmp/lock.txt
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "This script is already running"
exit
fi
# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}
#let`s ping google.
#if ! wget -q -s http://google.com
if ! wget -q --tries=10 --timeout=20 --spider http://google.com
then
sleep 1
#let`s ping google again to doublecheck that RPI is offline.
#if ! wget -q -s http://google.com
if ! wget -q --tries=10 --timeout=20 --spider http://google.com
then
killall -9 uqmi
# killall -9 dhclient
uqmi -d /dev/cdc-wdm0 --set-device-operating-mode shutting_down
sleep 30
uqmi -d /dev/cdc-wdm0 --stop-network 4294967295 --autoconnect
sleep 2
uqmi -d /dev/cdc-wdm0 --network-register
sleep 2
uqmi -s -d /dev/cdc-wdm0 --start-network ${YOUR_APN} --keep-client-id wds --autoconnect &
echo "Modem Restarted"
sleep 8
else
echo "Modem Online"
fi
else
echo "Modem Online"
fi
#remove LockFile
rm -f ${LOCKFILE}
Скрипт містить закоментовані рядки для обрубаного wget зі стокового OpenWRT. Ці що є, то для встановленого wget з сховищ.
І, відповідно, команда для cron запускає скрипт кожну хвилину:
*/1 * * * * /usr/bin/checklte.sh &
Втикнутий модем розпізнається, далі ним займається скрипт з cron, який перевіряє з'єднання, якщо воно є, то нічого не робить, а якщо немає, то вимикає модем, виключає глобальну опцію автоз'єднання в ньому, реєструє в мережі без з'єднання і запускає само з'єднання з відповідним APN провайдера.
Немає коментарів:
Дописати коментар