安装和使用 - nsnake/perl-agiengine GitHub Wiki
入门
程序依赖:
- Perl 5.10及以上版本。其中还需要以下Perl模块:
- DBD::mysql
- JavaScript::V8 (可选)
- Mysql agiengine使用的是per-fork方式工作,因而你需要指定一个能够正常使用的Mysql服务器。如果不需要使用数据库,需要修改源代码的中的数据连接部分。
如何使用
直接从git中获取源码,赋予agiengine.pl可执行权限即可
chmod +x agiengine.pl
系统配置
目录结构
- etc: 配置文件目录
- lib: agiengine依赖的模块
- log: 日志存放目录
- modules: agiengine的执行模块
- pid: pid文件目录
设置
agiengine的配置文件存放于etc下agiengine.conf,其中的配置参数如下. agiengine
- host:agiengine要绑定的IP地址,默认是全部能用的IP,如果只需要本机修改为127.0.0.1.
- port:监听的端口,默认4573,注意这是asterisk agi默认请求的端口.
- user/group:设置agiengine启动时的用户权限
- min_servers/min_spare_servers/max_spare_servers/max_servers/max_requests:此处的参数关系到agiengine的处理能力,具体含义可以参考apache的配置手册
- background: 0在前端运行,适合调试使用. 1作为服务运行
- log_enable: 0不记录日志,1记录日志
- log_file: 日志文件位置,请确保该文件的权限
- log_level:日志的等级
database
- autoconn: 是否自动连接数据库,1:自动 0:自己需要的时候在连接
- dbhost: 数据库地址
- dbuser:用户名
- dbpasswd:密码
- dbname:数据库名
- dbport:端口
- dbsock:unix sock文件地址,可以不填
ami
- host:asterisk地址
- prot:ami的端口
- user:ami 用户名
- pass:密码
启动agiengine
配置完成后就可以尝试启动agiengine,启动方式很简单
执行:#./agiengine.pl --start
如果看到类似如下信息:
2012/04/06-10:13:55 agiengine (type Net::Server::PreFork) starting! pid(4868)
Using default listen value of 128
Binding to TCP port 4573 on host * Setting gid to "0 0"
Setting up serialization via flock
Beginning prefork (1 processes)
Starting "1" children
Parent ready for children.
Child Preforked (4869)
2012/04/06-10:13:55 Database Connected !
恭喜你成功了.
获取帮助:
#./agiengine.pl --help
编写agiengine可使用的模块
需要知道的:
在正式开始之前,我们需要了解下modules目录.在该目录下有2个子目录,分别是:
- dynamic:动态模块加载目录,agiengine按需请求时自动加载
- static:静态模块加载目录,agiengine启动时自动全部加载
dynamic与static的区别
agiengine启动的时候会先载入static下所有的文件,这样在每次获得新请求的时候会首先查找请求的模块是否在启动的时候已经被加载,如果已加载则直接执行,否则就在dynamic下查找并加载。也就是说static中的是加载一次,然后重复使用,而dynamic则是按需加载使用
同样的,通过dynamic加载后的模块也可以使用static中已经加载的模块中的函数,也就是说相当于公用类一样。
使用static可以减少不必要的加载请求提高性能,但也增加额外的内存占用,建议只把频繁使用的模块放在static目录。
注意:修改了static下模块的内容需要重启agiengine才能生效,但修改dynamic下的模块则是下次请求自动生效,所以把模块放在dynamic下可以更方便的调试。
所有模块的文件名后缀为am,例如如demo.am,如果是js的,则为jam.
编写第一个agiengine的模块
在dynamic目录下新建一个文件名为demo.am的文件并输入以下代码:
`
sub demo {
my $self = shift;
my $AGI = $self->{server}{agi}; #AGI object
$AGI->noop('this only demo!');
$AGI->noop($AGI->get_agiaccountcode());
#$AGI->get_agicallerid();
#$AGI->get_agicalleridname();
#$AGI->get_agicallingani2();
#$AGI->get_agicallingpres();
#$AGI->get_agicallingtns();
#$AGI->get_agicallington();
#$AGI->get_agichannel();
#$AGI->get_agicontext();
#$AGI->get_agidnid();
#$AGI->get_agirequest();
foreach(0..5){
$AGI->say_digits($_);
sleep 1;
}
}
`
这只是一个简单的例子,作用就是显示你的accountcode并且给你播报0到5的数字,当然光这样是不行的,你还需要在asterisk中加入一个context来执行这个流程。一下内容需要你有asterisk的基础,如有问题,请自行学习相关知识。
在extensions.conf中加入 ` [demo]
exten => 1,AGI(agi://127.0.0.1/demo)
exten => n,hangup
`
另外,你的SIP账户可能是这样的 `
[8001]
type=friend
defaultuser=8001
accountcode=8001
secret=8001
context=demo
host=dynamic
nat=yes
qualify=2000
canreinvite=no
callgroup=
pickupgroup=
dtmfmode = rfc2833
` 现在启动你的agiengine,重新加载你的asterisk配置。随便拨打一个号码,正确情况下你将听到0到5的数字,恭喜你,你的第一个模块编写成功了。