Цей допис є продовженням історії "сексу" з вищеназваним модемом. Не знаю, як цей модем потрапив в список підтримуваних, якщо стільки з ним гемору. Я писав про новий скрипт /lib/netifd/proto/wwan.sh з пакунку wwan, який має займатися розпізнаванням модему і передачею конфігурації на інші скрипти з'єднання. У випадку мого модему це мав бути /lib/netifd/proto/qmi.sh. Сьогодні ще раз переглянув той скрипт, і вгорі скрипта зацікавився параметрами, з якими він працює. А саме параметром "delay" i "modes". "Modes" то зрозуміло, це з якою мережею має з'єднуватися, типу "all,lte,3g,..", можна подивитися допомогу по uqmi. А от "delay" мене навів на підозру, що це напевно затримка для повної ініціалізації модема. І дійсно, опускаюся нижче по скрипту і бачу стрічку
[ -n "$delay" ] && sleep "$delay"
якраз перед тими, які я коментував перед тим. Аааах, он в чому справа! Ну все, міняю wan інтерфейс до первісного стану, коментую стрічку для cron, створюю новий wwan із затримкою 20 секунд для проби:
config interface 'wwan'
option 'proto' 'wwan'
option 'apn' 'internet'
option 'delay' '20'
витягую модем, запихаю назад - мережа появляється! Виключає, включаю рутер - модем без проблем спокійно з'єднується! Як все просто... Проблема в тому, що ці скрипти добре не документовані, і всюди доводиться проламуватися крізь хащі.
Показ дописів із міткою LTE. Показати всі дописи
Показ дописів із міткою LTE. Показати всі дописи
середа, 17 лютого 2016 р.
понеділок, 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 провайдера.
Є інтернет 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 провайдера.
Підписатися на:
Дописи (Atom)
loading..