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>

и т.п.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

<?php
$strHost = "127.0.0.1";
$strUser = "AMI User";
$strSecret = "AMI password";
$strChannel = "Local/s@autodial";
$strWaitTime = "60000";
$strApplication = $_POST['app'];
$strData = $_POST['data'];
$strVariable = "dst1=$strData";
$timeout1 = $_POST['timeout1'];
$strVariable = "timeout1=$timeout1";
$length = strlen($strData);

if ($length == 4 && is_numeric($strData))
{
$oSocket = fsockopen($strHost, 5038, $errnum, $errdesc) or die("Connection to host failed");
fputs($oSocket, "Action: login\r\n");
fputs($oSocket, "Events: on\r\n");
fputs($oSocket, "Username: $strUser\r\n");
fputs($oSocket, "Secret: $strSecret\r\n\r\n");
fputs($oSocket, "Action: originate\r\n");
fputs($oSocket, "Channel: $strChannel\r\n");
fputs($oSocket, "Timeout: $strWaitTime\r\n");
fputs($oSocket, "Application: $strApplication\r\n");
fputs($oSocket, "Data: $strData\r\n");
fputs($oSocket, "Variable: $strVariable\r\n");
fputs($oSocket, "Action: Logoff\r\n\r\n");
sleep (1);
fclose($oSocket,128);

?>
<p>
<table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0">
<tr><td>
<font size="2" face="verdana,georgia" color="#630000">Кампания активирована!<br><a href="<?php echo $_SERVER['PHP_SELF'] ?>">Ещё раз</a>
</td></tr>
</table>
</p>
<?php
}
else
{
?>
<p>
<table width="300" border="1" bordercolor="#630000" cellpadding="3" cellspacing="0">
<tr><td>
<font size="2" face="verdana,arial,georgia" color="#630000">Таймаут, Приложение и имя</font>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">

<input type="text" size="20" maxlength="12" name="timeout1" Value="sec">
<p></p>
<input type="text" size="20" maxlength="12" name="app" Value="application">
<p></p>
<input type="text" size="20" maxlength="12" name="data" Value="data">
<p></p>
<input type="submit" value="Start">
</form>
</td></tr>
</table>
</p>
<?php
}
?>

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

> select * from autodial;
+------+--------+----------+-------+
| id   | number | status   | count |
+------+--------+----------+-------+
| 1    | 2666   | noanswer | 3     |
| 2    | 2667   | answer   | 2     |
| 3    | 2668   | answer   | 1     |
+------+--------+----------+-------+
см. также

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

  • asterisk/app/while.txt
  • Последние изменения: 2018/12/10