Используя 3G модем Huawei E160 (lsub пишет E620) под Linux столкнулся с проблемой неустойчивого подъема соединения после перезагрузки системы. В сообщениях wvdial проблема выглядела так:
--> 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!