Asterisk Автообзвон - Autodialer
Примеры реализации автообзвона (autodialer) на Asterisk.
Автообзвон при помощи Call File
Реализация автоматического обзвона абонентов (автодозвона) при помощи Asterisk и call файлов.
Bash скрипт генерирует 'Call File' на основании списка номеров из текстового файла и
копирует в директорию /var/spool/asterisk/outgoing.
Asterisk вызывает номер на основании информации из 'call file' и отправляет на обработку в заданный контекст или приложение плана набора.
Все очень просто и эффективно.
Синтаксис Call File:
Логика 'Call File' такая же, как и команды originate.
Сначала инициируется 'Channel', если заданный в данном параметре номер отвечает,
вызывается 'Extension' или 'Application' и соединяются с 'Channel'.
Если 'Channel' не отвечает в течении 'WaitTime', а параметр 'MaxRetries' больше нуля,
предпринимается заданное кол-во попыток 'MaxRetries' с интервалом 'RetryTime'.
Параметры канала
- Channel: <channel>: инициируемый канал (например Local/${number}/from-autodial )
- CallerID: «name» <number> Caller ID, требуемый формат: CallerID: «Имя» <1234>
- MaxRetries: <number> Кол-во попыток набора на каждый номер в списке (По умолчанию 0. Если установлено '0', будет совершена одна попытка, если '1' то две)
- RetryTime: <number> Время в секундах между попытками. (Seconds between retries, Don't hammer an unavailable phone. По умолчанию 300 (5 min).)
- WaitTime: <number> Время посылки вызова. (По умолчанию 45.)
- Account: Аккаунт для вызова.
Параметры расширения:
- Context: <context-name> Контекст для приема вызова, когда абонент ответил (extensions.conf)
- Extension: <ext> Extension (расширение например:exten⇒ s,…) в контексте (extensions.conf)
- Priority: <priority> Приоритет в контексте.
- Set: Установить переменную канала для вызова (example: file1=/tmp/to );
- Application: Приложение Asterisk (используется вместо context, extension, priority)
- Data: Данные приложения (например: PlayBack(data))
- AlwaysDelete: Yes/No - Удалять файлы по завершении.
- Archive: Yes/No - Перемещать выполненные файлы в директорию outgoing_doneс указанием статуса с которым завершилось задание «Status: value», где возможны значения
- Completed - Успешно.
- Expired - Просрочено.
- Failed - Неудачно.
Expired или Failed отличаются по статусу вызова. Если вызов удался, но на него не ответили в заданное время вызова и кол-во попыток, то Expired. Если вызов не удалось инициировать вообще, то Failed.
Autodial: пример 1
Вызываются номера по списку и проигрывается сообщение из контекста [outboundmsg1].
dialplan
bash script
Примечания к скрипту:
- Channel: SIP/voip_trunk/$number - voip_trunkтранк через который совершаются вызовы.
- if [ «$count_f» -eq «30» ]; then - 30кол-во одновременных вызовов. (фактически это кол-во файлов создаваемых скриптом за один раз, следующие по списку файлы, будут созданы, только по завершению обработки первой группы)
/var/spool/asterisk/list.txt - список обзвона, каждый номер в новой строке.
101 102
пример predictive dialer
Автообзвон абонентов из базы данных средствами диалплана.
extconfig.conf
autodial=>odbc,sql2,autodial
БД
> select * from autodial; +------+--------+--------+-------+ | id | number | status | count | +------+--------+--------+-------+ | 1 | 2666 | new | 0 | | 2 | 2667 | new | 0 | | 3 | 2668 | new | 0 | +------+--------+--------+-------+
func_odbc.conf
[SQL] dsn=sql2 mode=multirow readsql=SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1}
extensions.conf
[autodial] exten => s,1,Noop same => n,Set(_i=${ODBC_FETCH(${ODBC_SQL(1)})}) ;получаем id = SELECT id FROM autodial WHERE status = 'new' LIMIT ${ARG1} same => n,While($[${REALTIME_FIELD(autodial,id,${i},count)} <= 3]) ; старт цикла same => n,Set(REALTIME(autodial,id,${i},status)=inuse) ; статус вызова same => n,Dial(PJSIP/${REALTIME_FIELD(autodial,id,${i},number)}@fs_pjsip,5,U(sub-answer^s^1)) ; набор номера, с подпрограммой диалплана ; sub-answer, выполняется, если вызываемый номер ; ответил на вызов. ; ответил. same => n,Goto(s-${DIALSTATUS}) ; определяем действия в зависимости от статуса вызова same => n(s-ANSWER),hangup same => n(s-NOANSWER),goto(s,loop) ; направим неотвеченные вызовы на приоритет loop same => n(s-BUSY),goto(s,loop) same => n(s-CANCEL),Set(REALTIME(autodial,id,${i},status)=cancel) same => n(s-CANCEL),hangup same => n(loop),set(count=${REALTIME_FIELD(autodial,id,${i},count)}) ; приоритет для неотвеченных вызовов same => n,Set(REALTIME(autodial,id,${i},count)=$[${count} + 1]) ; счетчик неотвеченных вызовов same => n,GotoIf($[${REALTIME_FIELD(autodial,id,${i},count)} >= 3]?no-answer,s,1) ; если значение счетчика >= 3 same => n,ODBCFinish ; устанавливаем статус noanswer same => n,EndWhile [sub-answer] exten => s,1,Set(REALTIME(autodial,id,${i},status)=answer) ;exten => s,n,System(asterisk -rx 'channel originate Local/s@autodial application queue queuename1') ; или exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1)) same => n,return [no-answer] exten => s,1,Set(REALTIME(autodial,id,${i},status)=noanswer) exten => s,n,Exec(originate(Local/s@autodial,app,queue,queuename1))
Активация
originate Local/s@autodial application queue <queuename>
или
originate Local/s@autodial application playback <playback_name>
и т.д.
originate Local/s@autodial application confbridge <conference_name>
и т.п.
БД после завершения автообзвона
> select * from autodial; +------+--------+----------+-------+ | id | number | status | count | +------+--------+----------+-------+ | 1 | 2666 | noanswer | 3 | | 2 | 2667 | answer | 2 | | 3 | 2668 | answer | 1 | +------+--------+----------+-------+
Tips&Tricks
Если установить параметры файла atimeи mtime (access time и modifity time соответственно) в будущем, файл помещенный в директорию outgoingбудет выполнен только по наступлении заданного времени.