Asterisk: обратный вызов с использованием AMI

от автора

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: 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);    }   ?> 

Теперь можно проверить генерацию вызова, используя следующий 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' 

Приведу некоторые комментарии, которые, возможно, будут полезны практикующим:

\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
Асинхронное формирование вызовов позволяет создавать один или более вызовов, не ожидая немедленного ответа.

ссылка на оригинал статьи http://habrahabr.ru/company/centosadmin/blog/161521/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *