Asterisk AMI AGI通知PHP脚本


Asterisk AMI AGI Notification PHP Script

我是Asterisk的新手。我的要求是,当我接到电话时,我需要识别来电者id,并在接听电话时弹出该id。我对AMI和AGI有一些了解。我想知道如何使用php脚本来实现这一点。

任何我可以用来做这件事的例子或东西,请附在这里。

这在很大程度上取决于您使用的Asterisk版本。我建议使用Asterisk 13,因为它既是一个LTS,而且比其他版本具有更好的AMI事件。

这里有两种方法。第一种是使用AMI,它将通过TCP套接字将事件泄漏回您。第二种是使用AGI,特别是FastAGI,它将使您的远程应用程序能够控制通道。在该应用程序中,您可以自己提取呼叫者ID。

如果选择使用AMI,通常应该侦听两个事件:Newchannel(在创建通道时引发)和Newcallerid(在更改通道的参与方标识时引发)。这应该涵盖当事方身份更改的绝大多数时间,并应向您提供该频道的呼叫者ID和连接线路信息,即该频道正在通话的当事方的身份。

你不应该在Bridge事件中需要Link子事件(它在13中不存在,被BridgeEnter/BridgeLeave事件取代)-这就是我认为Arheops所指的。只有当一个频道"链接"到网桥中的另一个频道时,才会引发Link,并且与呼叫者ID无关。在这种情况下,方标识可能会更改,但这将在NewcallerId事件中传达,因此听它是没有意义的。

或者,您也可以使用FastAGI。如果你走这条路,你会想在你的拨号计划中有一个能调用你的FastAGI服务器的东西:

exten => _X.,1,NoOp()
 same => n,AGI(agi://127.0.0.1)
 same => n,...

在您的脚本中(可以用多种语言编写,给定可用的AGI库的数量),您可以使用get variable命令和CALERID函数提取CallerID。以下是node.js中的一个示例:

return agi.getFullVariable('${CALLERID(NUMBER)}').then(function (number) {
    callerId.number = number;
    return agi.getFullVariable('${CALLERID(NAME)}');
}).then(function (name) {
    callerId.name = name;

顺便说一句,这些都不是"专家"级别的Asterisk操作。它只需要一些编程和对Asterisk API的基本理解。祝你好运

如果你是星号新手,你可以使用已经开发好的软件,比如星号fop/fop2。它允许在来电时使用callerid,我相信这会更简单。

若你们仍然想通过星号来完成,你们应该注意"链接"事件。然而,在该事件中不会有callerid,因此您还必须查找"NewChannel"事件和CALERID(num)=something的"set"扩展,这将改变callerid。

您可以使用通道uniqueid连接事件。

这项任务并不琐碎,需要精通php。

此外,您可以更改星号拨号计划以触发UserEvent操作,并在呼叫应答时提供所需信息,之后只收集UserEvents。这需要星号拨号计划方面的高专业知识和php方面的低专业知识。

如果浏览器上的弹出窗口对您来说是可以的,我建议使用websocket通知网页关于新呼叫(带所有参数)。您可以通过监听AMI事件并使用nodejs将数据发送到浏览器来实现这一点,这样您就可以避免轮询Asterisk服务器以检查呼叫是否得到响应。

查看此代码:https://www.backloop.biz/en/products/asterisk-call-notifier-en