Quantcast
Channel: IP АТС Asterisk
Viewing all articles
Browse latest Browse all 1135

Команда Asterisk: While

$
0
0

Команда Asterisk: 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
пример: autodial

Автообзвон абонентов из базы данных средствами диалплана.

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>

и т.п.

Spoiler

БД после завершения автообзвона

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+

см. также

Команды диалплана Asterisk


Viewing all articles
Browse latest Browse all 1135

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>