Поддержка интернет-соединения

Материал из Lblss.ru
Перейти к: навигация, поиск

Проблема

Казалось бы, с проблемами подключения инета через модем Huawei E220 покончено. За pppd присматривает init, и ежле тот срубается, то немедленно принимаются меры. Однако, в середине февраля месяца году две тыщи девятого заметил я странную вещицу. Обрывы стали случаться примерно каждые 2...5 часов, хотя, раньше сутками проблем не было. Меры то init пытается принять, даёт пинка pppd, но коннект установить не удаётся. Не приемлет его оператор до тех пор, пока ручками не выдерну модем и не воткну его обратно. Разумеется, это не наш метод ;-)

Уж не знаю, откуда растут ноги у проблемы - мож БС не получает вовремя информацию о подключенных услугах, а мож просто глючит оборудование... Ясно одно: при отключении модем пропадает из зоны видимости базовой станции, а при подключении происходит регистрация с запросом списка услуг. Соответственно, пришлось искать способы управления регистрацией на БС.

Решение

Порыскав по инету, нарыл список AT-команд, используемых для мобильных устройств. Для Huawei E220 или хотя бы для этой серии найти не удалось, но это лучше чем ничего. Самыми простыми оказались команды выключения и включения питания (точней, снижения функциональности, или, своего рода, стендбай) - по сути, то же самое, что кнопка выключения питания на мобильнике. С отключением проблем не должно быть, а регистрация проходит обычно максимум за пол-минуты. Потому и нет (по крайней мере, пока нет) необходимости в контроле за взаимодействием модема и оператором.

Был вытащен из хламника когда то вполне рабочий скрипт и слегка подправлен в свете новых решений.

  • Маленькое замечание: в скрипте используется команда host из пакета bind-utils, который необходимо установить заранее (чтоб не спрашивать "почему не регистрируется пропадание инета").
#!/bin/sh
 
# Файл /home/vk/bin/modem.sh
 
# Запускать будем от рута по крону раз в минут пять:
# */5 * * * * /home/vk/bin/modem.sh 1>>/home/vk/log/modem.log 2>&1
# Это нужно при загрузке компа да и сам скрипт завершает работу
# после того как отработает цикл.
 
# Вызов скрипта с параметром reconnect приводит к немедленному
# циклу переподключения.
 
# хосты для теста
testhost1="ya.ru"
testhost2="news.kraft-s.ru"
 
# интервал
timeinterval=15
# к-во тестов
counter=4
 
# модем (канал управления)
dev_modem="/dev/ttyUSB1"
 
# не факт что нет лишних путей, скопипейстил тупо
PATH="/home/vk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin:/sbin"
 
if [ "$1" != "reconnect" ]
then
  echo
  echo `date`" ============== Start of the script =============="
  # если есть запущенный экземпляр скрипта
  if pgrep  modem.sh | grep -v $$
  then # то выход
    exit 0
  fi
 
  # проверка связи
  # counter попыток через timeinterval секунд (с таймаутом - через +15 примерно)
  numbers=0 # счетчик неудачных попыток
  while [ $counter -gt $numbers ]
  do
    sleep $timeinterval
    # теперь пиннем контрольные хосты:
    # первый
    if [[ 1 -eq `host $testhost1 2>/dev/null | grep "timed out" | wc -l` ]]
    then
      res1=1
    else
      res1=`ping -c 1 $testhost1 2>/dev/null | grep "100% packet loss" | wc -l`
    fi
    # второй
    if [[ 1 -eq `host $testhost2 2>/dev/null | grep "timed out" | wc -l` ]]
    then
      res2=1
    else
      res2=`ping -c 1 $testhost2 2>/dev/null | grep "100% packet loss" | wc -l`
    fi
    # сумма
    (( res=$res1+$res2 ))
    # счет
    if [[ 2 -eq $res ]]
    then
      (( numbers++ ))
      echo `date`" Errors: $numbers"
    else
      numbers=0 # сброс счетчика
    fi
  done
else # принудительно переподключить
  echo `date`" force reconnect"
fi
 
echo `date`" killall pppd"
killall pppd
echo `date`" modem turn Power OFF"
echo -e -n "AT+CFUN=0 \015" >$dev_modem
sleep 10
echo `date`" modem turn Power ON"
echo -e -n "AT+CFUN=1 \015" >$dev_modem
sleep 30
init q 2>/dev/null
 
echo `date`" ========== End of the script ============"
exit 0

Следует отметить несколько нестандартный способ завершения строки, отправляемой модему:

echo -e -n "AT+CFUN=0 \015" >$dev_modem
Персональные инструменты