5. Asterisk AGI程序编写指南
5.1概述
很多时候,我们需要在拨号方案中做某些业务逻辑的判断或者外部数据库的查询,根据具体地需要,有几种做法:
1.使用Asterisk的通道变量、Goto函数、Gotoif函数等实现某些简单跳转,通过几个这样的函数的组合,实现简单的业务。
2.对终端接入用户的呼叫请求中的某些属性,进行简单的数据库增删改查,在Asterisk官方发布的asterisk-addons开发包中安装MYSQL模块,具体地方法在这不细述。使用类似下面的方式:
exten => _0[0-9].,1, MYSQL(Connect connid dhhost dbuser dbpass dbname)
exten => _0[0-9].,2., MYSQL(Query resultid ${connid} query-string)
exten => _0[0-9].,3,MYSQL(Fetch fetchid ${resultid} var1/ var2/ .../ varN)
exten => _0[0-9].,4,MYSQL(Disconnect ${connid})
3.如果碰到了结合了1、2的业务需求,这时候拨号方案配置文件中就会出现大量地与业务逻辑有关的复杂代码,造成技术人员阅读上不方便,并且代码也不好维护,如下面这段配置文件:
……
exten => 888,1,MYSQL(Connect connid localhost ipcontact passwd ipcontact)
exten => 888,n,GotoIf($["${connid}" = ""]?error,1)
exten => 888,n,MYSQL(Query resultid ${connid} SELECT/ `number`/ FROM/ `phones`/ WHERE/ `channel`=/'${chan}/')
……
exten => 888,n,GotoIf($["${foundRow}" = "1"]?done) ; leave loop if no row found
exten => 888,n,NoOp(${number})
exten => 888,n,Goto(fetchrow) ; continue loop if row found
exten => 888,n(done),MYSQL(Clear ${resultid})
exten => 888,n,MYSQL(Disconnect ${connid})
……
上面综合了通道变量、Goto、Gotoif、MYSQL数据查询等操作,其实如果配置文件中只是几行这样的操作阅读起来没问题,但业务需求具有可变性,代码维护起来就比较麻烦。所以,我们就寻找另外一种方案,即在配置文件中不进行数据库查询等重量级的操作,而是将它交到一个外部应用程序或者脚本中,即封装到Asterisk的AGI后台中,可以实现各种复杂的业务需求。使用类似PHP、JAVA、C等编程语言内置的判断语句,而不是Asterisk封装的类似Goto、Gotoif等函数,会更加快地实现业务需求,代码也更好维护。下面先看看如何在拨号方案中使用AGI程序。
5.2 使用AGI脚本
执行AGI脚本时,Application应用就是'agi',参数是脚本的文件名,同时脚本需要满足以下条件:
l 必须可执行,chomd 755
l 必须放置在指定目录,如标准目录:/var/lib/asterisk/agi-bin
l 必须指定完整的extension信息
比如说执行一个用PHP语言实现的AGI程序,有可能就是这样:

本文介绍了如何使用Asterisk AGI进行VoIP开发,包括AGI程序编写背景、使用场景、脚本执行、AGI技术原理及PHP AGI类库的使用。通过AGI,可以将复杂业务逻辑移到外部脚本,提高代码可读性和维护性。示例展示了主叫号码透传功能的实现,通过AGI设置主叫号码,以便被叫方看到有意义的来电显示。
最低0.47元/天 解锁文章
484

被折叠的 条评论
为什么被折叠?



