Страница 1 из 3
Скрипт контроля баланса для chan_dongle
Добавлено: 12 май 2012, 22:56
SolarW
Домашняя страница
Тема для обсуждения функционала и объявлений об обновлениях.
12.05.2012
siv237 писал(а):Обновил скрипт, теперь он умеет автоматически отключать модемы с низким балансом.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 12 май 2012, 23:03
SolarW
Желающие я так понимаю могут
min_bal не только глобально задавать а и для каждого канала отдельно
Код: Выделить всё
# Список модемов и соответствующих им типов ответов операторов
# о состоянии баланса
# Последовательность заполнения:
# 1. Номер Dongle устройства, 2. Префикс строки разбора, 3. Номер симки
# 4. Имя оператора 5. USSD запрос баланса 6. Минимальный баланс при котором происходит отключение канала
# Внимание, пробелы в полях не допускаются
for opsos in \
" 000103 MTS2 +79140000001 МТС *100# 50" \
" 000101 MTS +79140000002 МТС *100# 100" \
" 000106 MTS +79140000003 МТС *100# 70" \
" 000104 MGF +79240000004 МЕГАФОН *100# 20" \
" 000102 MGF +79240000005 МЕГАФОН *100# 30" \
" 000105 BEE +79620000006 БИЛАЙН *102# 50" \
" 000107 BEE +79090000007 БИЛАЙН *102# 80"
do
num=`echo $opsos | awk '{print $1}'`
oper=`echo $opsos | awk '{print $2}'`
numsim=`echo $opsos | awk '{print $3}'`
fovsim=`echo $opsos | awk '{print $4}'`
ussdzap=`echo $opsos | awk '{print $5}'`
min_bal=`echo $opsos | awk '{print $6}'`
Ну и чтобы уже в одной теме все было - настройки для украинских операторов
USSD-запросы
Код: Выделить всё
" dongle1 KS +380981234567 КИЕВСТАР *111#"
" dongle2 MTS +380951234567 МТС *110*10*01#"
" dongle3 UTEL +380911234567 Укртелеком *100#"
" dongle4 LF +380931234567 Лайф *111#"
Парсинг ответов
Код: Выделить всё
######## Варианты парсинга баланса для разных операторов #######################
# Результат разбора должен быть в виде:
# 28.04.2012 08:30:17;52.70;000101
################################################################################
# Оператор КИЕВСТАР
if [ "${oper}" = "KS" ]
then cat $opermsg | grep $num| grep USSD| grep 'Na rahunku'| sed -r 's/(: Na rahunku: | - | grn. )/;/g'| awk -F ";" '{print $1";"$4";"$3}' | tail -n $tn >>/tmp/tmpallbalans
fi
# Оператор МТС
if [ "${oper}" = "MTS" ]
then cat $opermsg | grep $num| grep USSD| grep 'Na osobovomu rakhunku'| sed -r "s/(: Na osobovomu rakhunku | - |: avans |5 hrn.)/;/g"| awk -F ";" '{print $1";"$5";"$3}'| tail -n $tn >>/tmp/tmpallbalans
fi
# Оператор Укртелеком
if [ "${oper}" = "UTEL" ]
then cat $opermsg | grep $num| grep USSD| grep 'Vash balans'| sed 's/,/./g'| sed "s/'//g"|sed -r "s/(: Vash balans:zagalnyi | - |; paketnyi )/;/g"| awk -F ";" '{print $1";"$4";"$3}'| tail -n $tn >>/tmp/tmpallbalans
fi
# Оператор Лайф
if [ "${oper}" = "LF" ]
then cat $opermsg | grep $num| grep USSD| grep ': Balans'| sed 's/,/./g'| sed -r 's/(: Balans | - |hrn. )/;/g'| awk -F ";" '{print $1";"$4";"$3}' | tail -n $tn >>/tmp/tmpallbalans
fi
################################################################################
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 12 май 2012, 23:31
SolarW
Немного подумав.
Хотя конечно было бы хорошо изыскать способ не полностью вырубать канал при малом балансе а исключать его из исходящей маршрутизации - не знаю как в других местах а у нас входящие бесплатны.
Сходу мыслей как это сделать в системе под управлением FreePBX пока нет.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 01:22
SolarW
Нашел глючек.
Кусок диалплана
Код: Выделить всё
[from-gsm]
exten => ussd,1,Verbose(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%d.%m.%Y %H:%M:%S)} - USSD - ${DONGLENAME}:${BASE64_DECODE(${USSD_BASE64})}' >> /var/www/msg)
exten => ussd,n,Hangup()
спотыкается на USSD ответах вида
Код: Выделить всё
50.01 UAH, dejstvitelen do 02.03.2013. Tarif - Super MTS bez PZS i popolneniy 0-25. * Euro-GOOD'OK 2012: zvoni 700!
Код: Выделить всё
Na rahunku: 58.96 grn. Info pro bonusy na *112# i *119#. Unikal'na BEZKOSHTOVNA muzyka na D-Jingle! Tel. 465
Код: Выделить всё
Vash balans:zagal'nyi 25,53; bonusnyi 0,00; dodatkovyi 0,00 hrn.Nomer diysnyi do 2012-09-22 23:59:59. Perevirka dodatkovykh poslug *121#
Все ломает одинарная кавычка внутри ответа которую вставляют в транслит вместо мягкого знака.
Как бы ее заэкранировать?
Обновлено: заменил в диалплане одинарную кавычку на двойную и все заработало.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 08:01
Vlad1983
отключать исходящие можно через проверку переменной, хранимой в AstDB, которую выставлять на основе данных о балансе.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 17:29
siv237
Есть мысль сделать отключение исходящих при достижении модемом предельного количества минут в день. Например у многих операторов есть льготное число минут за которые баланс не снимается. После достижения предела минуты становятся платными. Если модемов несколько, можно экономить переключая на следующий модем в цепочке.
Есть ли идеи как сделать? Пока мысль такая, брать из основной базы cdr записей инфу по числу минут на интересующем модеме за период с начала дня и если порог превышен, отключать модем.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 17:35
siv237
Vlad1983 писал(а):отключать исходящие можно через проверку переменной, хранимой в AstDB, которую выставлять на основе данных о балансе.
Для чистого астериска можно добавить agi скрипт проверяющий баланс и устанавливающий канал в режим занят при исходящем звонке для перехода к следущему свободному. Тогда входящие будут идти независимо от состояния баланса. Но беда в том, что при настройке через FreePBX канал chan_dongle прописан customtran-ком и вписаться в диалплан между вызовом из кустомтранка и драйвером канала уже негде. Нет контекста или я не понял где его искать.
Можно поподробнее по вашему предложению?
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 18:16
Vlad1983
сведения о затраченых минутах или балансе берите откуда хотите и засовываем в AstDB так
Код: Выделить всё
asterisk -rx 'database put TRUNKLIMIT gsm0 1200'
asterisk -rx 'database put TRUNKLIMIT gsm1 1210'
делал для шлюзов для обеспечения равномерной нагрузки на симки и отключения при привышении месячного лимита (пример для двухсимок)
под модемы точите сами
Код: Выделить всё
[outbound-allroutes-custom]
...
exten => _7XXXXXXXXXX,1,GoSub(sub-outbound,${EXTEN},gsm)
exten => _7XXXXXXXXXX,n,GoSub(sub-outbound,${EXTEN},sipnetmsk) ;резерв
...
[sub-outbound]
...
exten => _X.,n(gsm),ExecIf($[ ${DB(TRUNKLIMIT/gsm0)} > 3000 ]?Return()) ; на симках одинаковый лимит 3000 минут.
exten => _X.,n,ExecIf($[ ${DB(TRUNKLIMIT/gsm1)} > 3000 ]?Return()) ; распределение нагрузки нормальное поэтому выходим сразу
exten => _X.,n,GotoIf($[ ${DB(TRUNKLIMIT/gsm0)} > ${DB(TRUNKLIMIT/gsm1)} ]?gsm1:gsm0)
exten => _X.,n(gsm0),Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm0)
exten => _X.,n,Dial(SIP/gsm/10${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm1)
exten => _X.,n,Dial(SIP/gsm/11${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Return()
exten => _X.,n(gsm1),Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm1)
exten => _X.,n,Dial(SIP/gsm/11${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Macro(record-enable,${AMPUSER},OUT)
exten => _X.,n,Set(CDR(to)=gsm0)
exten => _X.,n,Dial(SIP/gsm/10${EXTEN},60,TX)
exten => _X.,n,StopMixMonitor()
exten => _X.,n,Return()
...
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 13 май 2012, 21:58
SolarW
Насчет порядка использования транков в зависимости от потраченных минут попадался вот такой, более года назад заброшенный модуль для FreePBX -
Trunk Cost / Load Balancing
Поставить / освоить руки если честно не доходили.
Re: Скрипт контроля баланса для chan_dongle
Добавлено: 14 май 2012, 05:13
siv237
Vlad1983 писал(а):сведения о затраченых минутах или балансе берите откуда хотите и засовываем в AstDB так
Код: Выделить всё
asterisk -rx 'database put TRUNKLIMIT gsm0 1200'
asterisk -rx 'database put TRUNKLIMIT gsm1 1210'
делал для шлюзов для обеспечения равномерной нагрузки на симки и отключения при привышении месячного лимита (пример для двухсимок)
под модемы точите сами
Код: Выделить всё
[outbound-allroutes-custom]
...
exten => _7XXXXXXXXXX,1,GoSub(sub-outbound,${EXTEN},gsm)
exten => _7XXXXXXXXXX,n,GoSub(sub-outbound,${EXTEN},sipnetmsk) ;резерв
...
...
К сожалении проблема с free-pbx в том, что нет возможности встроиться в диалплан на этапе набора номера и соответственно отработать кустом контекст не получится.
Вот если есть мысли, как привязать custom trunk к конкретному контексту не потеряв интерактивность настройки исходящей маршрутизации в freepbx из webgui, а уж дальше логику можно любую выстраивать.