Ограничение количества междугородних звонков в Asterisk

В целях борьбы со злоупотреблениями и профилактики fraud’а возникла необходимость ограничить количество звонков, которые может совершить внутренний номер по каналам МГ/МН связи. Данная задача может быть легко реализована посредством встроенных средств Asterisk v1.8: AstDB.
Допустим, мы хотим, что бы один абонент в сутки мог совершить не более 30 МГ/МН звонков. Создаем в плане нумерации направление аналогичное следующему:

[macro-Dial-SIPNET]
exten => s,1,Dial(SIP/${ARG1}@sipnet,60,tTr)
exten => s,2,Hangup

[sipnet-default]
exten => _X.,1,NoOp( ----- Limited Extension Context Activated ----- )
exten => _X.,n,Set(limitcall=${DB(ext/${CALLERID(num)}/limit)})
exten => _X.,n,NoOp( ----- Call limit set to ${limitcall} in the database ----- )
exten => _X.,n,GotoIf($["${limitcall}" = ""]?resetvariable)
exten => _X.,n,GotoIf($[${limitcall} > 30]?hang)
exten => _X.,n,Set(limitcall=${MATH(${limitcall}+1)})
exten => _X.,n(dbwrite),Set(DB(ext/${CALLERID(num)}/limit)=${limitcall})
exten => _X.,n,Macro(Dial-SIPNET,${EXTEN})
exten => _X.,n(hang),NoOp( ----- Call limit of ${limitcall} has been reached. ------ )
exten => _X.,n,Wait(1)
exten => _X.,n,Playback(please-contact-tech-supt)
exten => _X.,n,Hangup()
exten => _X.,n(resetvariable),NoOp( ----- Null value has been corrected ----- )
exten => _X.,n,Set(limitcall=1)
exten => _X.,n,Goto(dbwrite)

Теперь для каждого абонента будет вестись учет количества совершенных звонков по данному направлению, а в случае превышения лимита, проигрываться приглашение обратиться в службу технической поддержки. Просмотреть текущее значение счетчиков можно в CLI Asterisk командой «database show ext»:

/ext/58100/limit : 3.000000
/ext/58101/limit : 2.000000

Для обнуления счетчиков раз в сутки необходимо в cron добавить строку «0 0 * * * asterisk -rqx 'database deltree ext' > /dev/null 2>&1». Командой наподобие «database deltree ext/58100» можно оперативно сбросить лимит для конкретного абонента.
Конечно, предлагаемая методика несколько примитивна, поскольку не учитывает результат звонка, т.е. состоялся ли он, или вызываемый номер, к примеру, оказался занят. Однако данная технология весьма проста в реализации и не требует привлечения сторонних инструментов.

Поделиться ссылкой:

  1. Диана

    Добрый вечер
    А можно спросить, можно ли изменить так не в сутки а в месяц совершать допустим 50 звонков? А еще нельзя ли сделать с учетом не количества, а длительности разговора?

    • ...можно ли изменить так не в сутки а в месяц совершать допустим 50 звонков?

      Конечно, обнуляйте счетчики в cron не ежедневно, а раз в месяц.

      А еще нельзя ли сделать с учетом не количества, а длительности разговора?

      Такая задача встроенными средствами Asterisk не может быть реализована. Необходима сторонняя обвязка вокруг CDR.

Оставить комментарий


Примечание - Вы можете использовать эти 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>