Мар 192013
 

Никогда особой стабильностью звонки через 3g модемы не отличались. Но что же делать если не по карману даже GoIP?

Совсем избавится от проблем не удастся, но минимизировать их можно! Для этого мне пришлось написать скрипт, который я забросил в cron.

Скрипт проверяет статус модемов и если какой то отвалился то его переподключает (на уровне linux). Он так же проверяет все идентификаторы модемов в системе. Т.е. вам ничего править не нужно, скрипт все делает сам! Единственное, если у вас не стандартный путь к файлу dongle.conf то укажите его.

Данный скрипт тестировался на Fedora 15 с Asterisk 11 и соответственно chan_dongle. Но думаю он без проблем пойдет на других ОС (не уверен по поводу FreeBSD).

Скрипт можно скачать отсюда.

Так же вот сам код скрипта:

#!/bin/sh

# ----------------------------------------------
#| Created by Miho |
#| This is a public script is distributed free. |
#| |
#| Sincerely, Miho. |
#| Author site: http://miho.org.ua/ |
# ----------------------------------------------

#---------------Variables-------------------
config_file=/etc/asterisk/dongle.conf
#-------------End variables-----------------
#---------------Functions-------------------
# Function of read data value of datacard in dongle.conf
read_ini(){
 file=$1
 block=$2
 key=$3
 # Define ttyUSB
 usb_port=$(sed -n 's/#.*//;/[^[:space:]]/p' $file | awk -F = "BEGIN{found=0} {if(found) {if(/\[.+\]/){exit}else{if(\$1=/$key/){print \$2}}} else{if(/\[$block\]/){found=1}}}")
 usb_port=$(echo $usb_port | sed 's|.*/||')
}
# Function to reload modem
reload_modem(){
 if [ -z "$sys_num" ] # If system identifier is NULL then skiped, because it not connect to server
 then
 echo "$cur_error dont connect to server! Skip reload..."
 echo [$(date +%d.%m.%Y\ %H:%M:%S)]: "$cur_error dont connect to server! Skip reload..." >> /var/log/asterisk/datacard_reloads.txt
 else
 sh -c "echo 0 > /sys/bus/usb/devices/$sys_num/authorized" # Disable modem
 sleep 2
 sh -c "echo 1 > /sys/bus/usb/devices/$sys_num/authorized" # Enable modem
 echo "Reloading $cur_error done..."
 echo [$(date +%d.%m.%Y\ %H:%M:%S)]: "$sys_num reloaded..." >> /var/log/asterisk/datacard_reloads.txt
 fi
}

#-------------End functions-----------------
#-------------------Main--------------------
error_count=$(asterisk -rx 'dongle show devices' | egrep "Not|GSM" | wc | awk '{print($1);}';) # Count of fail modem
i=1
while [ $i -le $error_count ]; do # Repeat to all fail modem
 cur_error=$(asterisk -rx 'dongle show devices' | egrep "Not|GSM" | sed -n "$i"p | awk '{print($1);}';) # Find number of fail datacard
 echo "$cur_error not connect! Try to restart..."
 read_ini $config_file $cur_error "data" # Find number ttyUSB of fail datacard
 sys_num=$(dmesg | grep "$usb_port$" | grep "attached" | awk '{print($4);}' | sed 's|.*]||' | sed -n "1"p | sed 's/.$//') # Find system identifier of fail datacard
 reload_modem # Reload him
 i=$(($i + 1)) # Go to next fail datacard
done
#-----------------End Main------------------
exit 0

Profit!

  3 комментария to “Что делать если 3g модемы в asterisk иногда отваливаются…”

  1. Такое решение конает, только , если в /etc/asterisk/dongle.conf привязка по юсб, а что делать если по IMEI ?

    • Первое, что приходит в голову это сделать отдельный файл (или бд или что угодно) где будет привязка IMEI — USB. И обновлять эти данные по крону с помощью minicom. Ну и соответственно отредактировать скрипт, что бы он IMEI находил в dongle.conf, а потом USB с помощью вышеуказанного файла.
      P.S. Я уже как года два использую только GSM шлюзы и не заморачиваюсь по поводу модемов, что и Вам советую =)

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)