Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
obratnyj_vyzov_s_ispolzovaniem_ami [2013/11/18 13:03]
ansealk
obratnyj_vyzov_s_ispolzovaniem_ami [2013/11/18 13:06] (текущий)
Строка 1: Строка 1:
 +====== Обратный вызов с использованием AMI ======
  
 +Asterisk Manager Interface (AMI) – это программный интерфейс который позволяет внешним программам как управлять,​ так и контролировать систему Asterisk. AMI слушает соединения на TCP порту, по-умолчанию это 5038. Клиентская программа может соединяться с AMI, передавать команды в Asterisk, получать ответ о статусе выполнения команд.
 +В данном посте мы рассмотрим использование AMI на примере решения определенной задачи:​ настроить Asterisk на генерацию звонков по заданному url, в котором должны устанавливаться параметры звонка.
 +
 +===== Настройка Asterisk AMI =====
 +Первое что необходимо сделать,​ это включить AMI и завести пользователя с помощью которого клиентская программа будет аутентифицироваться:​
 +
 +<file ini /​etc/​asterisk/​manager.conf>​
 +[general]
 +enabled = yes
 +port = 5038
 +bindaddr = 0.0.0.0
 +</​file>​
 +
 +<file ini /​etc/​asterisk/​manager.conf>​
 +[c2call]
 +secret=FrUyHn6FSaX
 +deny=0.0.0.0/​0.0.0.0
 +permit=192.168.0.0/​255.255.0.0
 +read=system,​call,​log,​verbose,​command,​agent,​user,​config,​command,​dtmf,​reporting,​cdr,​dialplan,​originate
 +write=system,​call,​log,​verbose,​command,​agent,​user,​config,​command,​dtmf,​reporting,​cdr,​dialplan,​originate
 +</​file>​
 +
 +Для применения изменений выполним reload:
 +<code bash>​asterisk -rx "​module reload manager"</​code>​
 +
 +Теперь нам потребуется создать внутренний номер который,​ собственно,​ и будем соединять с вызываемым абонентом:​
 +<file ini /​etc/​asterisk/​sip.conf>​
 +[3200]
 +deny=0.0.0.0/​0.0.0.0
 +permit=192.168.0.0/​255.255.0.0
 +secret=3200
 +dtmfmode=rfc2833
 +canreinvite=no
 +context=OUT_IN1
 +host=dynamic
 +type=friend
 +nat=yes
 +port=5060
 +qualify=yes
 +callcounter=yes
 +faxdetect=no
 +</​file>​
 +
 +После создания внутреннего номера,​ потребуется перечитать конфигурацию Asterisk:
 +<code bash>​asterisk -rx "sip reload"</​code>​
 +На этом настройка Asterisk завершена.
 +
 +===== Скрипт обратного вызова =====
 +Теперь переходим к созданию скрипта на PHP:
 +<file php callback.php>​
 +<?php
 +
 +# --- define globals ---
 +$strhost = "​192.168.0.10";​
 +$strport = "​5038";​
 +$timeout = "​10";​
 +$num=$_REQUEST['​num'​];​
 +$cid=$_REQUEST['​cid'​];​
 +$c=$_REQUEST['​c'​];​
 +$p=$_REQUEST['​p'​];​
 +
 +$errno=0 ;
 +$errstr=0 ;
 +
 +$sconn = fsockopen ($strhost, $strport, &​$errno,​ &​$errstr,​ $timeout) or die("​Connection to $strhost:​$strport failed"​);​
 +
 +if (!$sconn) { echo "​$errstr ($errno)<​br>​\n";​ } 
 +
 +  else {
 +
 +  fputs ($sconn, "​Action:​ login\r\n"​);​
 +  fputs ($sconn, "​Username:​ c2call\r\n"​);​
 +  fputs ($sconn, "​Secret:​ FrUyHn6FSaX\r\n"​);​
 +  fputs ($sconn, "​Events:​ off\r\n\r\n"​);​
 +  usleep(500);​
 +
 +  fputs ($sconn, "​Action:​ Originate\r\n"​);​
 +  fputs ($sconn, "​Channel:​ SIP/​$cid\r\n"​);​
 +  fputs ($sconn, "​Callerid:​ $cid\r\n"​);​
 +  fputs ($sconn, "​Timeout:​ 15000\r\n"​);​
 +  fputs ($sconn, "​Context:​ $c\r\n"​);​
 +  fputs ($sconn, "​Exten:​ $num\r\n"​);​
 +  fputs ($sconn, "​Priority:​ $p\r\n\r\n"​);​
 +  fputs ($sconn, "​Async:​ yes\r\n\r\n"​ );
 +  fputs ($sconn, "​Action:​ Logoff\r\n\r\n"​);​
 +  usleep (500);
 +
 +  fclose ($sconn);
 +
 +  } 
 +
 +?>
 +</​file>​
 +
 +Теперь можно проверить генерацию вызова,​ используя следующий URL: \\ http://​domain.com/​callback.php?​p=1&​c=OUT_EXT2&​cid=3200&​num=84951234567
 +
 +Результат мы видим в консоли:​
 +<code lua>
 +*CLI> ​  == Manager '​c2call'​ logged on from 192.168.0.11
 +        == Using SIP RTP CoS mark 5
 +         -- Executing [84951234567@OUT_EXT2:​1] Dial("​SIP/​3200-0000000a",​ "​SIP/​84951234567@TRK1"​) in new stack
 +       == Manager '​c2call'​ logged off from 192.168.0.11
 +       == Using SIP RTP CoS mark 5
 +         -- Called SIP/​84951234567@TRK1
 +         -- SIP/​TRK1-0000000b is ringing
 +       == Spawn extension (OUT_EXT2, 84951234567,​ 1) exited non-zero on '​SIP/​3200-0000000a'​
 +</​code>​
 +
 +Приведу некоторые комментарии,​ которые,​ возможно,​ будут полезны практикующим:​
 +  * **\r\n** — возврат каретки с переводом строки (Carriage Return + Line Feed (CR+LF)). Обычно передается в результате нажатия клавиши Enter и обозначает завершение передачи команды.
 +  * **Events: off** - В данном случае мы отключаем отправку событий на это соединение интерфейса AMI. В основном его значение всегда off
 +  * **Channel: SIP/$cid** - Имя канала которому адресован вызов. В нашем случае вызов сначала поступит абоненту SIP/3200, как только он возьмет трубку,​ вызов бедет перенаправлен на номер 84951234567.
 +  * **Callerid: $cid - Идентификатор вызывающего абонента,​ который должен быть задан для исходящего канала.
 +  * **Timeout: 15000** - Указываем время ожидания ответа на звонок — 15 секунд
 +  * **Async: yes** - Асинхронное формирование вызовов позволяет создавать один или более вызовов,​ не ожидая немедленного ответа.
obratnyj_vyzov_s_ispolzovaniem_ami.txt · Последние изменения: 2013/11/18 13:06 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика