asterisk agi php,php AGI 学习

2023-11-05

AGI(Asterisk 网关接口),也就是说 Asterisk 是支持各种扩展的应用网关。

AGI 脚本通过通信通道与Asterisk 通信,而不是通过API 方式来编程:

AGI 脚本通过STDIN 从Asterisk 获取信息。

AGI 脚本通过STDOUT 把输出信息写到Asterisk 中。

AGI 脚本可以通过STDERR 把调试信息送到Asterisk 控制台。

当一个AGI 脚本启动时,Asterisk 向AGI 脚本传送一系列变量及变量值,通过 fgets(STDIN,4096) 来获取

在 Dialplan 中这样调用 AGI 脚本 :

exten => 123,2,AGI(agi-test.agi)   agi-test.agi 为 AGI 脚本,一般放在/var/lib/asterisk/agi-bin

用 PHP 来写AGI脚本(参照未来之路)

if(!defined('STDIN')){

define('STDIN', fopen('php://stdin', 'r'));

}

if(!defined('STDOUT')){

define('STDOUT', fopen('php://stdout', 'w'));

}

if(!defined('STDERR')){

define('STDERR', fopen('php://stderr', 'w'));

}

//这段代码确保我们有打开的STDIN、STDOUT 和STDERR 文件句柄,

//这些句柄会处理Asterisk 和我们的脚本之间的所有通信。

while (!feof(STDIN)){

$temp = trim(fgets(STDIN,4096));

if (($temp == "") || ($temp == "\n")){

break;

}

$s = split(":",$temp);

$name = str_replace("agi_","",$s[0]);

$agi[$name] = trim($s[1]);

}

//接下来我们会读取Asterisk 传来的所有变量,

//在PHP 中用fgets 命令可以从STDIN 读取数据,

//我们会把每一个变量存入名为$agi 的哈希变量中。

?> 现在我用的是 Asterisk-1.6 版本,测试好像不行!

在网上看了下,有个 phpagi 的类,使用的是 socket 来与 Asterisk 通信:

fwrite($socket, "Action: login\r\nUserName: $username\r\nSecret: $secret\r\n\r\n");

while($c = fgets($socket, 4096))

{

echo $c ."\n";

}

fwrite($socket, "Action: Command\r\nCommand: database show SIP/Registry/801\r\n\r\n");

while($c = fgets($socket, 4096))

{

echo $c ."\n";

} 输出内容为:

e5258d9a3a5a96ac681ccf8ca40409d7.png

使用这种方法还得配置些东西,在 /etc/asterisk/manager.conf中设置相关的服务器信息:

[mark]                   ----连接时用到的 用户名

secret = phpami      ----密码

read = system,call,log,verbose,command,agent,user

write = system,call,log,verbose,command,agent,user

read 和 write 就是 AMI 所能用到的指令

记得要重启 Asterisk 。 其实后一种用的是 AMI (Asterisk manager API), 和 AGI 有很大区别的

Asterisk控制接口(Asterisk manager API)允许管理客户端程序连接到一个asterisk实例,并且可以通过TCP/IP(AMI通过TCP/IP协议连接到Asterisk 服务器的端口默认为5038)流发送命令或读取事件。相对于AGI ,AMI并没有将控制交给您的应用程序,但允许您查询和随时更改其状态。

AMI提供给用户的指令集合如下:

system       -- 系统的一般信息。允许执行执行系统管理命令,如Shutdown, Restart, and Reload.

call           -- 通道的信息。允许用户设置当前通道的一些信息.

log            -- 日志信息(Read-only)

verbose      -- 详细信息(Read-only.即指asterisk控制台上的信息)

agent         -- agents和queues的信息。允许增加一个队列member到队列中.

user           -- 允许用户发送和收取UserEvent.

config         -- 允许用户读取和写配置文件.

command    -- 允许发送可执行的控制台命令(Write-only.)

dtmf           -- 接收DTMF事件,Read-only.

reporting     -- 允许用户取得系统信息.

cdr             -- cdr_manager的输出信息(if loaded. Read-only.)

dialplan       -- 接收NewExten and VarSet events(Read-only.)

originate      -- 允许产生一个新的call(Write-only.)

在asterisk控制台执行 manager show commands命令,即可查看AMI提供给用户的所有指令。

其中,Privilege即command所属的指令集合,当Privilege为None时,是指这些指令允许任何用户使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asterisk agi php,php AGI 学习 的相关文章

随机推荐

  • ZigBee传感数据采集实验

    一 实验目的与要求 1 学习通过DHT11采集温度和湿度数据 2 掌握CC2530接收和发送串口数据 3 学习使用ZStack库 二 实验原理与内容 1 DHT11电路图 2 基本控制原理 2 1 CC2530 的 IO 口配置我们需要配置
  • AnolisOS 外传二: 在oracle 云安装并使用anolis系统

    前言 Oracle 云支持自制映像 custom images 这就给了我们很大的想象空间 本文假设您已经完成了oracle 云的账户注册工作 一 下载anolis 镜像并制作镜像 1 anolis 官网下载 anck核心 云核心 qcow
  • elasticsearch 基本语法(常见的RESTFUL API)

    一 ES的基本语法 文章目录 一 ES的基本语法 1 Query String 语法 2 Query DSL 语法 3 Full text queries 全文检索 4 Phrase search 短语搜索 5 Query and filt
  • 使用MathJax在HTML中显示LaTeX

    使用MathJax在HTML中渲染LaTex数学公式 只需加入 若需要显示行内公式 则需加入
  • JS实现冒泡排序

    一 概念 冒泡排序 Bubble Sort 是一种计算机科学领域的较简单的排序算法 它重复地走访过要排序的元素列 依次比较两个相邻的元素 如果顺序 如从大到小 首字母从Z到A 错误就把他们交换过来 走访元素的工作是重复地进行 直到没有相邻元
  • 模板特例化与偏特化

    模板是C 中一个很重要的特性 写一份代码能用于多种数据类型 包括用户自定义类型 例如 STL的sort 函数可以用于多种数据类型的排序 类stack可以用作多种数据类型的栈 但是 如果我们想对特定的数据类型执行不同的代码 而不是通用模板 呢
  • 【PyTorch学习笔记】一、两个全连接层的感知机实现(损失函数及优化器的使用)

    demo1 import torch from torch import nn 全连接类 class Linear nn Module def init self in dim out dim super Linear self init
  • pyqt5 QCheckBox使用setChecked(False)后再次用鼠标选中时无法触发信号函数的解决办法

    项目需要一个复选框QCheckBox来做某种选择 但是会有选中了但是不符合条件的情况 这种情况下需要把复选框的状态置为不选中 我的做法是在下面这个信号链接的函数中判断 if self checkBox isChecked 为真且不符合条件的
  • mysql create table select from_mysql create table select复制表结构和数据实例讲解

    比如现在有一张表 我们要将该表复制一份 以备以后使用 那么如何使用mysql语句来实现呢 其实我们可以直接使用create select from语句来实现 具体实现方法请看下面实例 我们先来创建一张Topic表 创建Topic表的SQL语
  • angular4 入门

    笔记来源于慕课网视频https coding imooc com class chapter 94 html Anchor 老师 JoJozhai 纳斯达克上市公司技术总监 创业公司CTO在angular4 中 较少组件之间的耦合 提升组件
  • Mac开机后键盘和触控板失灵

    http www jianshu com p 51d6142b564a 今天上班正敲着代码电脑突然触摸板不管用了 没办法 我用快捷键 Shift Ctrl Option 开关机键 强制关机后 再开机后 鼠标在屏幕左上角 动触摸板不管用 屏幕
  • Android Studio Kotlin环境搭建

    1 安装Kotlin插件 File gt Settings gt Plugins Kotlin 搜索并安装重启AS 2 创建一个项目 3 将Java代码转换为Kotlin 打开MainActivity 按快捷健Shift Cril A输入
  • ctf.show_web(1-14)wp

    目录 web 1 web 2 web 3 web 4 web 5 web 6 web 7 web 8 web 9 web 10 web 11 web 12 web 13 web 14 web 1 f12查看源码得到一串base64编码 解码
  • 数组去重-数组塌陷的解决方法

    var arr 23 4 23 4 23 4 54 56 54 66 43 4 1 4 6 3 4 1 66 99 for var i 0 i
  • 模拟测试Mock详解

    一 Mock模拟测试 1 Mock 测试简介 在测试过程中 数据的流转往往和系统的复杂程度有关 功能越复杂的系统 数据流转的过程越烦琐 有时候会经过数十个子系统 其上下游业务相互依赖 使得测试过程十分漫长 复杂 例如 在电商网站进行购物 需
  • 极光笔记

    对营销邮件来说 多一份送达 也许就多一个客户 因此 怎样让邮件顺利进入收件箱 是每一个市场营销人员需要面对的问题 EngageLab作为领先的客户互动和营销技术服务提供商 为市场营销人员提供了稳定 高效的电子邮件发送服务 只需几个简单的步骤
  • 排序函数qsort的使用,以及模拟实现(详解)

    了解qsort 以及模拟实现 情境引入 qsort qsort的头文件 开场 qsort的参数 为什么可以对任意类型排序呢 参数 参数 参数 参数 最难的参数 qsort应用实例 比较整形 浮点型 比较结构体的整形 比较结构体的字符串 想成
  • C# event Action<> & event EventHandler<>

    event作用 我们可以通过对event的使用完成回调功能 本节通过简单的例子引入Action和EventHandler EventHandler class Program private static event EventHandle
  • 9.3事件内核对象学习

    第八章主要涉及到了用户模式同步 第九章进行了内核对象同步 内核对象同步应用广 缺点是性能 内核对象包括进程 线程以及作业 Job 这些都可以用来进行同步 有未触发状态和触发状态两种 创建时 未触发状态 终止时 触发状态 但是触发后不会再回到
  • asterisk agi php,php AGI 学习

    AGI Asterisk 网关接口 也就是说 Asterisk 是支持各种扩展的应用网关 AGI 脚本通过通信通道与Asterisk 通信 而不是通过API 方式来编程 AGI 脚本通过STDIN 从Asterisk 获取信息 AGI 脚本