Asterisk app: While
Команда плана набора Asterisk While - Повторять цикл (loop) пока условие верно.
Описание
Петля создается между приложениями While() и EndWhile() и выполняется,
пока условие заданное в While(условие) верно.
Условие вычисляется один раз за цикл, в самом начале.
примечания:
- Цикл While/EndWhile может параллельно выполнять множество наборов за раз.
- Если условие неверно, выполнение диалплана продолжается после EndWhile
- Модификатор цикла, приложение ContunueWhile
Синтаксис
While(expr)
Пример 1
exten => _4881,1,Answer exten => _4881,n,Set(i=1) exten => _4881,n,While($[${i} < 5]) exten => _4881,n,SayNumber(${i}) exten => _4881,n,Set(i=$[${i} + 1]) exten => _4881,n,EndWhile
пример 2
Сбор конференц-моста из БД, средствами диалплана, при помощи команды While()
БД:
+------+--------+ | id | number | +------+--------+ | 1 | 2666 | | 2 | 2667 | | 3 | 2668 | +------+--------+
extconfig.conf:
autoconfbridge = odbc,category(res_odbc.conf),autoconfbridge
exten => _4884,1,Answer same => n,Set(i=1) same => n,While($[${i} <= 3]) ; макс кол-во участников. same => n,originate(SIP/${REALTIME_FIELD(autoconfbridge,id,${i},number)},app,confbridge,<conf_name>) same => n,Set(i=$[${i} + 1]) same => n,EndWhile
пример 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 | +------+--------+----------+-------+