понеділок, 15 лютого 2016 р.

Женячка рутера TP-LINK TL-WR1043ND з LTE модемом ZTE MF880

Початок. Продовження історії тут.

Є інтернет 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 провайдера.

Немає коментарів:

Google Analytics