Простой рецепт устойчивой работы 3G под Linux
Используя 3G модем Huawei E160 (lsub пишет E620) под Linux столкнулся с проблемой неустойчивого подъема соединения после перезагрузки системы. В сообщениях wvdial проблема выглядела так:
Но мне требовалось более надежное решение, независящее от моего присутствия. Сам рецепт подсказывал мне — надо научиться программно перезапускать модем.
Самый надежный и универсальный способ — управление питанием по шине USB. Выключить и включить питание модема и все — проблема будет решена.
К сожалению, USB-хабы, поддерживающие управление питанием весьма редки. А исследование устройства с точки зрения Linux указывало на отсутствие такой функции на шине USB модема. Поэтому, такой вариант пришлось исключить.
Второй вариант — попробовать AT командой поуправлять модемом. Хотя бы заставить переподключить к GSM/3G сети.
Пришлось заняться поиском документации по AT коммандам.
И они нашлись от первоисточника:
http://www.3gpp.org/ftp/Specs/html-info/27007.htm
Команда, решающая мою проблему выглядит так:
Модем действительно перегрузился, даже находясь в режиме передачи данных — команда была послана через ttyUSB2.
В консоли команда отправляется так:
В /etc/wvdial.conf добавил ограничение на количество попыток соединения:
Теперь обертываю вызов wvdial в скрипт:
/var/log/wvdial.log — будут писаться события wvdial
/var/log/3g.log — события скрипта
30 секунд оказалось вполне достаточно для перезагрузки модема.
Желаю устойчивого connect'a!
--> Sending: ATDT*99# --> Waiting for carrier. --> Timed out while dialing. Trying again.С настройками wvdial по умолчанию — сообщения шли бесконечно. По всем симптомам — модем «зависал». Проблема решалась просто — ручным кратковременным вытаскиванием модема из USB разъема.
Но мне требовалось более надежное решение, независящее от моего присутствия. Сам рецепт подсказывал мне — надо научиться программно перезапускать модем.
Самый надежный и универсальный способ — управление питанием по шине USB. Выключить и включить питание модема и все — проблема будет решена.
К сожалению, USB-хабы, поддерживающие управление питанием весьма редки. А исследование устройства с точки зрения Linux указывало на отсутствие такой функции на шине USB модема. Поэтому, такой вариант пришлось исключить.
Второй вариант — попробовать AT командой поуправлять модемом. Хотя бы заставить переподключить к GSM/3G сети.
Пришлось заняться поиском документации по AT коммандам.
И они нашлись от первоисточника:
http://www.3gpp.org/ftp/Specs/html-info/27007.htm
Команда, решающая мою проблему выглядит так:
AT+CFUN=1,1Команда заставляет модем перегрузиться и снова перейти в рабочий режим.
Модем действительно перегрузился, даже находясь в режиме передачи данных — команда была послана через ttyUSB2.
В консоли команда отправляется так:
echo -e "AT+CFUN=1,1\r\n" >/dev/ttyUSB0Проблема теоретически решена. Осталось автоматизировать процесс.
В /etc/wvdial.conf добавил ограничение на количество попыток соединения:
Dial Attempts = 5После пяти не успешных попыток дозвониться, wvdial завершит работу.
Теперь обертываю вызов wvdial в скрипт:
rm -f /var/log/3g.log while true; do echo "wvdial" >>/var/log/3g.log wvdial >&/var/log/wvdial.log echo "sleep 10" >>/var/log/3g.log sleep 10 echo "reboot modem" >>/var/log/3g.log echo -e "AT+CFUN=1,1\r\n" >/dev/ttyUSB0 echo "sleep 30" >>/var/log/3g.log sleep 30 doneВызов скрипта добавляю в скрипт загрузки системы.
/var/log/wvdial.log — будут писаться события wvdial
/var/log/3g.log — события скрипта
30 секунд оказалось вполне достаточно для перезагрузки модема.
Желаю устойчивого connect'a!