Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
makros_dlja_balansirovki_isxodjaschix_zvonkov_na_gsm [2013/11/19 14:06]
ansealk создано
makros_dlja_balansirovki_isxodjaschix_zvonkov_na_gsm [2013/11/19 14:07] (текущий)
Строка 1: Строка 1:
 +====== Макрос для балансировки исходящих звонков на GSM ======
 +**Дано:​** FreeBSD 9, Asterisk 11.4, 2х Addpac GS1002 (используются все 4 сим-карты). Настроено 4 транка на симки: 9001, 9002, 9003, 9004 соответственно. На них полосатый тариф с «безлимитом» 300 минут в месяц на каждой.
 +**Задача:​** Если на какой-либо симке исчерпан лимит, не использовать ее при наборе. Если же исчерпаны все — слать звонок через провайдера (там чуть дешевле,​ чем через GSM с тарификацией)
 +**Решение:​**
 +  - Настраиваем сохранение cdr в mysql. Не вижу смысла копипастить сюда [[http://​voip.rus.net/​tiki-index.php?​page=Asterisk+cdr+mysql|мануал]]. Добавлю лишь, проверьте наличие модуля cdr_mysql.so в своей сборке.
 +  - Добавляем контекст с макросом в extensions.conf(для работы необходим модуль app_mysql.so — Simple Mysql Interface!)
 +
 +Сам макрос подробно прокомментирован.
 +<code lua>
 +[macro-gsm]
 +
 +exten => s,​1(start),​Set(ARG2=$[${ARG2} + 1]) ;​инкремент,​ подробности чуть ниже
 +same => n,​GotoIf($[${ARG2}>​=9005]?​sip:​repeat) ;У нас 4 транка,​ предлагает 9005 - пускаем через провайдера
 +same => n(repeat),​MYSQL(Connect connid localhost asterisk password asterisk) ; Подключаемся к базе
 +same => n,​MYSQL(Query resultid ${connid} SELECT SUM(`billsec`) FROM `cdr` WHERE `dstchannel` LIKE '​%${ARG2}%'​ AND `calldate` BETWEEN DATE_FORMAT(NOW(),'​%Y-%m-01'​) AND LAST_DAY(NOW()) + INTERVAL 1 DAY) ; Собственно запрос. Результат - суммарное количество тарифицируемых секунд на текущем транке за текущий месяц
 +same => n,​MYSQL(Fetch fetchid ${resultid} duration) ; Результат в переменную duration
 +same => n,​MYSQL(Clear ${resultid}) ;​Очистка и отключение от базы
 +same => n,​MYSQL(Disconnect ${connid})
 +same => n,​GotoIf($[${duration}<​=18000]?​call:​start) ; Если через транк прошло менее 300 минут, посылаем звонок через него, нет - отправляемся в начало,​ в следующем круге используется транк с большим номером
 +same => n(call),​Set(limit=$[18000 - ${duration}]) ; устанавливаем максимальную длительность разговора,​ чтобы не попасть на деньги
 +same => n,​Dial(SIP/​${ARG2}/​${ARG1},,​S(${limit})tTr) ;​Звоним
 +same => n,​GotoIf($[${DIALSTATUS}=ANSWER]?​finish:​start) ;​Разговор состоялся - кладем трубку,​ транк занят - следующий круг
 +same => n(sip),​Dial(SIP/​ctm/​${ARG1},,​Ttr) ;​Звонок через провайдера
 +same => n(finish),​Hangup ;​Кладем трубку
 +
 +exten => h,​1,​MYSQL(Clear ${resultid}) ; Еще команды на отключение от базы, для перестраховки. ​
 +same => n,​MYSQL(Disconnect ${connid})
 +</​code>​
 +
 +Пример вызова в диалплане:​ exten => _79XXXXXXXXX,​1,​Macro(gsm,​${EXTEN},​9000)
 +
 +9000: номер транка — 1 
 +
 +Макрос протестирован и работает. Очевидные минусы — названия транков только цифровые. Есть желание помочь — предлагайте в комментариях свои варианты. Плюс — он эффективен)
  
makros_dlja_balansirovki_isxodjaschix_zvonkov_na_gsm.txt · Последние изменения: 2013/11/19 14:07 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика