Asterisk Manager Interface (AMI) – это программный интерфейс который позволяет внешним программам как управлять, так и контролировать систему Asterisk. AMI слушает соединения на TCP порту, по-умолчанию это 5038. Клиентская программа может соединяться с AMI, передавать команды в Asterisk, получать ответ о статусе выполнения команд.
В данном посте мы рассмотрим использование AMI на примере решения определенной задачи: настроить Asterisk на генерацию звонков по заданному url, в котором должны устанавливаться параметры звонка.
Настройка Asterisk AMI
Первое что необходимо сделать, это включить AMI и завести пользователя с помощью которого клиентская программа будет аутентифицироваться:
/etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
/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
Для применения изменений выполним reload:
asterisk -rx "module reload manager"
Теперь нам потребуется создать внутренний номер который, собственно, и будем соединять с вызываемым абонентом:
/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
После создания внутреннего номера, потребуется перечитать конфигурацию Asterisk:
asterisk -rx "sip reload"
На этом настройка Asterisk завершена.
Скрипт обратного вызова
Теперь переходим к созданию скрипта на 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: loginrn");
fputs ($sconn, "Username: c2callrn");
fputs ($sconn, "Secret: FrUyHn6FSaXrn");
fputs ($sconn, "Events: offrnrn");
usleep(500);
fputs ($sconn, "Action: Originatern");
fputs ($sconn, "Channel: SIP/$cidrn");
fputs ($sconn, "Callerid: $cidrn");
fputs ($sconn, "Timeout: 15000rn");
fputs ($sconn, "Context: $crn");
fputs ($sconn, "Exten: $numrn");
fputs ($sconn, "Priority: $prnrn");
fputs ($sconn, "Async: yesrnrn" );
fputs ($sconn, "Action: Logoffrnrn");
usleep (500);
fclose ($sconn);
}
?>
Теперь можно проверить генерацию вызова, используя следующий URL:
http://domain.com/callback.php?p=1&c=OUT_EXT2&cid=3200&num=84951234567
Результат мы видим в консоли:
*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'
Приведу некоторые комментарии, которые, возможно, будут полезны практикующим:
rn — возврат каретки с переводом строки (Carriage Return + Line Feed (CR+LF)). Обычно передается в результате нажатия клавиши Enter и обозначает завершение передачи команды.
Events: off
В данном случае мы отключаем отправку событий на это соединение интерфейса AMI. В основном его значение всегда off
Channel: SIP/$cid
Имя канала которому адресован вызов. В нашем случае вызов сначала поступит абоненту SIP/3200, как только он возьмет трубку, вызов бедет перенаправлен на номер 84951234567.
Callerid: $cid
Идентификатор вызывающего абонента, который должен быть задан для исходящего канала.
Timeout: 15000
Указываем время ожидания ответа на звонок — 15 секунд
Async: yes
Асинхронное формирование вызовов позволяет создавать один или более вызовов, не ожидая немедленного ответа.
Автор: sfw