Asterisk Click2Call API
- Готовый скрипт для вызовов между extension и внешним номером, а также для запуска любого диалплана и передачи ему параметров. Использовалась библиотека https://github.com/chan-sccp/PAMI это форк самой популярной библиотеки от marcelog/PAMI. Используется потому, что в ней исправлена ошибка при использовании CommandAction. в оригинальной библиотеке она будет выдавать read timeout. Скрипт выдает статус оригинации в json формате и unqueid. техническое задание в конце кода.
ini_set('display_errors', 0);
require __DIR__ . '/vendor/autoload.php';
use PAMI\Client\Impl\ClientImpl;
use PAMI\Listener\IEventListener;
use PAMI\Message\Event\EventMessage;
use PAMI\Message\Action\OriginateAction;
use \PAMI\Message\Event\NewchannelEvent;
class A implements IEventListener
{
public $result;
public function handle(EventMessage $event)
{
if ($event instanceof \PAMI\Message\Event\NewchannelEvent) {
$this->result = $event->getUniqueID();
return $this->result;
}
}
}
$agent = $_GET['agent'];
$extension = $_GET['extension'];
$destination = $_GET['destination'];
while ($agent && $extension) {
echo "No agent and extension possible!";
exit;
}
include "config.php";
$a = new ClientImpl($options);
$a->open();
$ClassA = new A();
$a->registerEventListener($ClassA);
while ($agent && $destination) {
echo "Agent && Destination";
$result = makecallagent($a,$agent,$destination);
$arr = array('success' => false, 'errormsg' => $result);
if ($result === true)
$arr = array('success' => $result,'errormsg' => NULL, 'uniqueid' => $ClassA->result);
echo json_encode($arr);
$a->close();
exit;
}
while ($extension && $destination) {
$result = makecall($a,$extension,$destination);
$arr = array('success' => false, 'errormsg' => $result);
if ($result === true)
$arr = array('success' => $result,'errormsg' => NULL, 'uniqueid' => $ClassA->result);
echo json_encode($arr);
$a->close();
exit;
}
echo "No extension\agent and destination correctly passed";
exit;
function makecall($a,$source,$number) {
$originateMsg = new OriginateAction("PJSIP/$source");
$originateMsg->setContext('from-internal');
$originateMsg->setPriority('1');
$originateMsg->setExtension("$number");
$res = $a->send($originateMsg);
if ($res->isSuccess()) return true; //return tru if originating success
return $res->getKeys()['message']; //otherwise return error message
}
function makecallagent($a,$source,$number) {
$originateMsg = new OriginateAction("Local/28@queuemetrics");
$originateMsg->setContext('queuemetrics');
$originateMsg->setPriority('1');
$originateMsg->setVariable('AGENTCODE',$source);
$originateMsg->setVariable('QDIALER_QUEUE','outqueue');
$originateMsg->setVariable('EXTTODIAL',$number);
$originateMsg->setExtension("28");
$res = $a->send($originateMsg);
if ($res->isSuccess()) return true; //return tru if originating success
return $res->getKeys()['message']; //otherwise return error message
}
3.07.2019 Asterisk as Wholesale. PAMI instead of AGI. Stable AMI connection.
Во время выполнения диалплана необходимо уточнять маршруты для звонка и делать то нужно из базы Mysql. Классический вариант использовать AGI Либо FastAGI, Но здесь я рассмотрю вариант запуска в фоне скрипта который, получая информацию о звонке, будет устанавливать переменную обратно в диалплан.
Asterisk адаптированный для wholesale, кстати, достаточно быстро всё обрабатывает используя минимум модулей и запросы в базу через ODBC. на удивление. Но всё равно с Opensips И Kamailio не сравнится.
Используем: PAMI library при установке пришлось повозиться т.к. не очень знаком с composer, но почитав про него – всё получилось. библиотеки ставятся в текущую директорию agi-bin, тогда будет доступ.
Основная проблема это поддержка коннекта между скриптом и астером, а также отсутствие ошибок между ними. Если вы запустите по умолчанию скрипты с ами, то вы наверняка получите внезапное завершение программы при анализе event от астериска. Есть несколько факторов, которые влияют на стабильность соединения:
- read timeout\read error – возникает на стороне скрипта, нужно обрабатывать такие события, в скрипте для этого будет try { } catch {}.
- Снизить поток событий из Астериска. В manager.conf Использовать eventfilter=Event: Newchannel тогда пользователю будет прилетать только определенный события.
- Не подключаться каждый раз при чтении и записи. В рамках библиотеки PAMI пришлось разбираться с классами в php.
- Астериск должен подождать в диалплане пока AMI скрипт установит переменную в канал, вот тут я не нашел ничего лучше чем просто подвесить его на 1500 циклов присвоения переменной – это ужасно я знаю.
Пример pami.php
Пример extensions.conf
Пример manager.conf
| Posted in Asterisk, Без рубрики, Готовые решения | No Comments »