Asterisk-Java 教程(中文版)…
2016-09-18 08:48
357 查看
原文地址:Asterisk-Java 教程(中文版) -- FastAGI协议作者:天那边的米高FastAGI协议
通过FastAGI协议能够用最简单的方法使我们的JAVA应用程序和Asterisk交互。AGI脚本能够处理任何呼入或通过Manager
API发起的呼出。
AGI(Asterisk Gateway
Interface)让你可以向Asterisk的拨号计划发送脚本,传统的脚本和Asterisk之间的通讯是通过标准输入和标准输出,并且脚本必需和Asterisk运行在同一服务器上。
这此缺点已经由FastAGI解决,FastAGI基于AGI通过TCP/IP
Socket连接替代标准输入和标准输出做为沟通的媒介。
你可以使用FastAGI运行Java应用程序(可以在不同的机器上运行Asterisk) ,它仅启动一次AGI
脚本直到它被关闭。使用此协议结合Java的多线程支持可以构建非常快的脚本。
Asterisk-Java提供了一个容器帮助你运行你的JAVA脚本,并接收Asterisk服务器连接的,解析请求或通过URL调用你的脚本。
Hello AGI!
写AGI脚本你必需实现AgiScript的接口,你可以通过继承实现了AgiScript接口的BaseAgiScript并覆盖它的方法来进一步简化这一工作。
一个简单的AGI脚本的例子:
import org.asteriskjava.fastagi.AgiChannel;
import org.asteriskjava.fastagi.AgiException;
import org.asteriskjava.fastagi.AgiRequest;
import org.asteriskjava.fastagi.BaseAgiScript;
public class HelloAgiScript extends BaseAgiScript
{
public void service(AgiRequest request, AgiChannel channel)
throws AgiException
{
// Answer the channel...
answer();
// ...say hello...
streamFile("welcome");
// ...and hangup.
hangup();
}
}
编译:
$ javac -cp asterisk-java.jar HelloAgiScript.java
$
下一步,在Asterisk拨号规则里为你的脚本添加一个呼叫。
你可能需要在extensions.conf默认的节里添加一个分机1300:
[default]
...
exten => 1300,1,Agi(agi://localhost/hello.agi)
用运行Asterisk-Java机器的IP地址代替代码中的“localhost”。
重新加载Asterisk确保更改生效。
现在你必须映射脚本的名称hello.agi到我们刚刚创建的HelloAgiScript。默认情况下通过启动AgiServer时调用classpath
路径下的fastagi-mapping.properties属性文件来完成。如:
hello.agi = HelloAgiScript
您的目录现现在应包含以下文件:
$ ls -l
-rw-r--r-- 1 srt srt 163689 2005-03-11 22:07
asterisk-java.jar
-rw-r--r-- 1 srt srt 26 2005-03-11 20:50
fastagi-mapping.properties
-rw-r--r-- 1 srt srt 624 2005-03-11 22:07
HelloAgiScript.class
-rw-r--r-- 1 srt srt 438 2005-03-11 20:50 HelloAgiScript.java
最后我们运行 AgiServer:
$ java -jar asterisk-java.jar
如果是 Asterisk-Java 0.3.1 或更早的版本,你需要用
$ java -cp asterisk-java.jar:.
org.asteriskjava.fastagi.DefaultAgiServer
在Windows平台:
$ java -cp asterisk-java.jar;.
org.asteriskjava.fastagi.DefaultAgiServer
如果你看到一些类似于如下的日志输出表示AgiServer已经成功开始运行:
Mar 11, 2005 10:20:12 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Thread pool started.
Mar 11, 2005 10:20:12 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Listening on *:4573.
When you call extension 1300 you will see the AGI script being
launched:
Mar 11, 2005 10:22:47 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Received connection.
Mar 11, 2005 10:22:47 PM
org.asteriskjava.fastagi.AgiConnectionHandler run
INFO: Begin AgiScript HelloAgiScript on
AgiServer-TaskThread-0
Mar 11, 2005 10:22:48 PM
org.asteriskjava.fastagi.AGIConnectionHandler run
INFO: End AgiScript HelloAgiScript on AgiServer-TaskThread-0
扩展范例
查看BaseAgiScript的文档,你将发现更多的可以用在你的脚本中的方法。如你想用的方法不在BaseAgiScript中,或你想用你的命令扩展FastAGI,你可以用channel.sendCommand(AgiCommand)方法发送任意的命令。
使用AGI命令你可以通过URL传递参数给你的脚本,在AgiRequest中你可以通过调用getParameter(String)或getParameterValues(String)读取这些参数。
如果你想传递名称为user,值为john的参数给你的脚本hello.agi,你可以这样写:
exten =>
1300,1,Agi(agi://localhost/hello.agi?user=john)
你可以传递多个参数,参数中的特殊字符必需为URL编码。
如果你要写一个复杂的脚本,请注意您的AgiScript必须是线程安全的。只有一个实例被用来处理所有请求,这是一个类似于servlet容器的引擎。
配置
你可以通过设置两个属性来调整DefaultAgiServer:bindPort、poolSize;
bindPort为设置TCP端口服务器侦听端口。FastAGI默认端口为4573,如果你修改了,在extensions.conf中请使用你设置的新端口。如你将bindPort属性修改为1234,在extensions.conf中设置如下:
exten =>
1300,1,Agi(agi://localhost:1234/hello.agi)
DefaultAgiServer为AgiScripts使用一个固定大小的线程池。poolSize确定有多少线程可以同时使用,因此,你应该将它设置为AgiServer能够处理的并发的数量。poolSize默认值为10。
这些属性配置可以通过classpath下的fastagi.properties的文件进行配置。
如下:
bindPort = 1234
poolSize = 20
通过FastAGI协议能够用最简单的方法使我们的JAVA应用程序和Asterisk交互。AGI脚本能够处理任何呼入或通过Manager
API发起的呼出。
AGI(Asterisk Gateway
Interface)让你可以向Asterisk的拨号计划发送脚本,传统的脚本和Asterisk之间的通讯是通过标准输入和标准输出,并且脚本必需和Asterisk运行在同一服务器上。
这此缺点已经由FastAGI解决,FastAGI基于AGI通过TCP/IP
Socket连接替代标准输入和标准输出做为沟通的媒介。
你可以使用FastAGI运行Java应用程序(可以在不同的机器上运行Asterisk) ,它仅启动一次AGI
脚本直到它被关闭。使用此协议结合Java的多线程支持可以构建非常快的脚本。
Asterisk-Java提供了一个容器帮助你运行你的JAVA脚本,并接收Asterisk服务器连接的,解析请求或通过URL调用你的脚本。
Hello AGI!
写AGI脚本你必需实现AgiScript的接口,你可以通过继承实现了AgiScript接口的BaseAgiScript并覆盖它的方法来进一步简化这一工作。
一个简单的AGI脚本的例子:
import org.asteriskjava.fastagi.AgiChannel;
import org.asteriskjava.fastagi.AgiException;
import org.asteriskjava.fastagi.AgiRequest;
import org.asteriskjava.fastagi.BaseAgiScript;
public class HelloAgiScript extends BaseAgiScript
{
public void service(AgiRequest request, AgiChannel channel)
throws AgiException
{
// Answer the channel...
answer();
// ...say hello...
streamFile("welcome");
// ...and hangup.
hangup();
}
}
编译:
$ javac -cp asterisk-java.jar HelloAgiScript.java
$
下一步,在Asterisk拨号规则里为你的脚本添加一个呼叫。
你可能需要在extensions.conf默认的节里添加一个分机1300:
[default]
...
exten => 1300,1,Agi(agi://localhost/hello.agi)
用运行Asterisk-Java机器的IP地址代替代码中的“localhost”。
重新加载Asterisk确保更改生效。
现在你必须映射脚本的名称hello.agi到我们刚刚创建的HelloAgiScript。默认情况下通过启动AgiServer时调用classpath
路径下的fastagi-mapping.properties属性文件来完成。如:
hello.agi = HelloAgiScript
您的目录现现在应包含以下文件:
$ ls -l
-rw-r--r-- 1 srt srt 163689 2005-03-11 22:07
asterisk-java.jar
-rw-r--r-- 1 srt srt 26 2005-03-11 20:50
fastagi-mapping.properties
-rw-r--r-- 1 srt srt 624 2005-03-11 22:07
HelloAgiScript.class
-rw-r--r-- 1 srt srt 438 2005-03-11 20:50 HelloAgiScript.java
最后我们运行 AgiServer:
$ java -jar asterisk-java.jar
如果是 Asterisk-Java 0.3.1 或更早的版本,你需要用
$ java -cp asterisk-java.jar:.
org.asteriskjava.fastagi.DefaultAgiServer
在Windows平台:
$ java -cp asterisk-java.jar;.
org.asteriskjava.fastagi.DefaultAgiServer
如果你看到一些类似于如下的日志输出表示AgiServer已经成功开始运行:
Mar 11, 2005 10:20:12 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Thread pool started.
Mar 11, 2005 10:20:12 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Listening on *:4573.
When you call extension 1300 you will see the AGI script being
launched:
Mar 11, 2005 10:22:47 PM org.asteriskjava.fastagi.DefaultAgiServer
run
INFO: Received connection.
Mar 11, 2005 10:22:47 PM
org.asteriskjava.fastagi.AgiConnectionHandler run
INFO: Begin AgiScript HelloAgiScript on
AgiServer-TaskThread-0
Mar 11, 2005 10:22:48 PM
org.asteriskjava.fastagi.AGIConnectionHandler run
INFO: End AgiScript HelloAgiScript on AgiServer-TaskThread-0
扩展范例
查看BaseAgiScript的文档,你将发现更多的可以用在你的脚本中的方法。如你想用的方法不在BaseAgiScript中,或你想用你的命令扩展FastAGI,你可以用channel.sendCommand(AgiCommand)方法发送任意的命令。
使用AGI命令你可以通过URL传递参数给你的脚本,在AgiRequest中你可以通过调用getParameter(String)或getParameterValues(String)读取这些参数。
如果你想传递名称为user,值为john的参数给你的脚本hello.agi,你可以这样写:
exten =>
1300,1,Agi(agi://localhost/hello.agi?user=john)
你可以传递多个参数,参数中的特殊字符必需为URL编码。
如果你要写一个复杂的脚本,请注意您的AgiScript必须是线程安全的。只有一个实例被用来处理所有请求,这是一个类似于servlet容器的引擎。
配置
你可以通过设置两个属性来调整DefaultAgiServer:bindPort、poolSize;
bindPort为设置TCP端口服务器侦听端口。FastAGI默认端口为4573,如果你修改了,在extensions.conf中请使用你设置的新端口。如你将bindPort属性修改为1234,在extensions.conf中设置如下:
exten =>
1300,1,Agi(agi://localhost:1234/hello.agi)
DefaultAgiServer为AgiScripts使用一个固定大小的线程池。poolSize确定有多少线程可以同时使用,因此,你应该将它设置为AgiServer能够处理的并发的数量。poolSize默认值为10。
这些属性配置可以通过classpath下的fastagi.properties的文件进行配置。
如下:
bindPort = 1234
poolSize = 20
相关文章推荐
- java基础教程学习笔记总结 7-10节
- Asterisk-Java 教程(中文版) --FastAGI协议
- java基础教程学习笔记总结 11-18节
- java基础教程之学习知识笔记 1-2节
- 【孙鑫Java教程笔记】第二课 Java …
- 超详细获得免费iTunes Store帐户教程
- iBus 1.3删除乱码名文件及文件夹指导教程
- 新手必看 WinSCP软件详细使用教程
- 仅需几分钟 1.1.1版iPhone傻瓜破解教程
- 使用GPRS 让你的iPhone能上网能通话教程
- 3分钟搞定 新iPhone1.1.2/1.1.3软破教程
- 实现任意文件下载 FileDownload使用教程
- 中文版iPhone不再稀奇 一键汉化就搞定
- BossPrefs v1.62详细教程及技巧
- 新版iPhone PC Suite完全详细使用教程
- ZiPhone GUI一键软破工具详细使用教程
- iPhone LumaQQ聊天软件详细使用教程
- Total Video视频转换软件使用教程
- iPhone Dev免费软件破解教程(中英均有)
- iPhone必用 installer软件详细使用教程