《FreeSWITCH中的XML拨号计划.docx》由会员分享,可在线阅读,更多相关《FreeSWITCH中的XML拨号计划.docx(14页珍藏版)》请在优知文库上搜索。
1、FreeSWITCH中的XML拨号计划dialplan本文是arlyard。翻译的,内容来自。介绍FS的配置文件都在conf目录下,都是xml文件。拨号方案的配置文件主要在dialplan目录下。Xml文件可以直接进行编辑,这使得配置FS的拨号方案非常灵活、方便。官方文档中,FS的拨号方案叫做XMLDialplanoXml配置文件中允许使用Perl兼容的正则表达式来匹配一个号码域,如10010-9匹配1000到1019的号码。正则表达式的用法参考。FS运行时,会先解析所有Xml文件,形成一个完整的配置方案。变量XMLDialPlan可以通过变量和表达式检测各种状况,当然如果判断条件不允许,该分
2、支中的变量是不会起作用的。XMLDialplan实际上是用于呼叫路由(CallRouting),而不是用于繁杂的条件检测和评估。FS支持lua、JavaScriptPerLPython等脚本语言,这是比直接单纯使用复杂的XML方案更好的选择。FS的拨号方案分为两步骤:查找和执行(huntingandexecuting)o首先查找时,基于条件判断,执行或撤销一个动作(action),把所有的应用解析出来,然后按顺序执行。也就是说,在查找的时候,执行阶段的信道变量(Channelvariables)是不会起作用的。比如XML文件中配置了,但是这个应用在前期的查找中,不符合条件的话就得不到执行,不过
3、也可以通过使用脚本语言来修改条件,或者XML中使用条件求值使它在解析阶段就得到执行。注:自SVNRevl4906起,允许某些应用使用inline关键字,这意味着它们可以在解析阶段求值,并应用于以后的条件匹配中。主叫描述文件(CallerPrOfi字段与信道变量(ChannelVariableS)的区别:在组织你的Dialplan时,这两者之间的区别可能是最令人头痛的,注意,前者是直接的字符串描述而后者使用变量语法注意,$.表示获取一个变量的值。XMLDialPlan解析当呼叫到达ROUTING状态时,拨号方案配置文件就会被解析。解析完后得到一个完整的建立channel的步骤,这些步骤由解析xm
4、l中action或antiaction标示得至少对于熟悉Asterisk的人来说,可能期望在一个action中获得的值能影响下action的判断。在FreeSWITCH中不是这样了。除非用$apifunc(apiargSvar-name)w这样的字段,在解析阶段从一个模块中调用一个可插入式的API,这情况仅应用于显示实时信息,如时间或其他可快速访问获取的信息,而不应该被滥用。XMLDialPlan剖析XMLDialplan中有几大要素:context(上下文)、extension(分机号)、condition(条件)、action(动作),它们会被按顺序处理,直到action被处理,actio
5、n告诉FS要执行的操作。对一个分机号,可以有多个condition(条件判断)和actionoExtension通俗的说就是电话号码,当然FS可以为其他设备分配号码,甚至是一个特殊的应用分配一个号码,如会议号。XMLDialplan目录可以考虑把分机号的xml配置文件放置到conf/dialplan/default目录,该目录中的分机号会被优先于Enumextension被解析到拨号方案中。Xml文件会按名字排序,排前面的xml文件会被优先加载,如OOLMYExtxmI会优先于002_Yu.xml。默认已经有IOoo至I1019分机号的ml文件。Enumextension放在最后,如果执行到这
6、一步时,它会匹配所有的分机号。ContextContexts是extensions(分机号)的逻辑分组。我们可能会有多个分机号在一个context中。Contet需要一个叫name,的参数,它的值是any的话表示匹配任何J情况。Name是用于表示ConteXt的,freeswitch.xml文件中默认包含几个context:默认extensionEXtenSiOn是一个呼叫的目的地,所以它不仅仅表示电话号码,虽然我叫它分机号需要给出一个name和conditions和actions以告诉FS如何找到它。这里name是唯一的,标识一分机号供后面使用。一个附加的参数叫做continue,默认把它设
7、置为false,设为true表示FS在当前分机号的所有action都解析完后会继续解析后续的所有分机号的actions如下,添加一个action:bridge,桥接到分机号500:找号码为500的分机,找到则解析action!-IfyoudontwanttobridgeacalltoalocalregistereduserzbuttoaSIPURLusetheinsteadof?%:第一行原型如下:第二行表示条件判断:如果有分机的号码是500则继续解析下面的action/break表示判断后的行为,有以下值:* On-true:第一次匹配后停止查找* On-false:默认值,第一次失败后停止
8、查找* Always:不管匹配与否都停止* Never:无论匹配与否都继续查找经过网关的呼叫gateway是mod,sofia的关键字,表示一个呼叫需要经过一个配置好的网关:当呼叫网关上的号码100/bridge到网关上conditionCondition是模式匹配标签,帮助FS决定是否处理对当前extension的呼叫。可以比较的参数有contextxrdnis、destination.numberxcaller_id_name等;filed段和expression段都可以有参数。Field段表示要匹配的对象(目的?上下文。),expression段表示要匹配的表达式。下面是一个网关的例子:
9、/field域和expression域/网关ip和端口FS注册这个网关来呼叫PSTN上的电话。ActionandAnti-Action当conditions判断匹配的话,就会执行action,否则执行Anti-actionoACtiOn有两个参数:叩PliCation表示已经注册的要执行的应用,如bridge;data是application的参数。使用Anti-action的时候不可以使用$1,因为正则表达式不匹配,第一个参数是无效的。InlineActions如果在action中把附加参数inline设置为true,则该action在dialplan查找期间就得到执行:可以内联执行的act
10、ion有:* check_aclz* evalz* event,* export,* log,* presence,* set,* sejglobal,* set_profile_var;* SetjJSer;* sleep,* unset,* VerbOSe_events,* cidlookupz* curl,* easyroutez* enumz* lcr,* nibblebill,* odbc_query内联执行的应用不会记录到Cdr中。EXAMPLES如果你要在单独的xml文件中加入自己的分机号,需要注释掉你不需要的enumextension(应该就是default.xml中默认配置的
11、分机号,如1000到1019)。使用include把xml文件包含到XMLDialplan.Example 1如下:第一个conditions:当呼叫方的ip是192.168.1.1时,呼叫就会被处理,第二个conditions:拨打的号码会被提取到$1,提供给后面的actiono下面例子是错误的:因为目的号码的匹配时在不同的conditions域action取不到$1的值。当然可以定义变量来保存目的号码,如下:注意,在extension内部使用set设置的变量不能用在后续的condition匹配中,因为set的求值是在执行阶段,而condition的匹配要先于set。如果你确实需要根据变量的
12、值来决定执行action,需要在变量被填充值时使用execute_extension或transfer应用。注:新的的版本允许使用inline关键字来执行set,月解的话你就可以在后续的condition中使用。Example 2这个例子判断来自固$定ip和由1开头的号码。这里$1表示1后面的数值,$0才表示整个号码:Example 3接受00开头的号码才巴号码交给FS处理时才巴00前缀去掉,如接到OOl23把123交给FS这里(d+)表示数字,任意个,(.+)表示任意个字符Example 4接受带前缀的号码,处理时除掉前缀,在给它加上新的前缀.Example 5这个例子演示profiles的用法,profile是对这段的描述,所以需要需要终端支持才可以配置,如mod_SOfia,sip终端,它的profiles如下这两个profile不同之处在编码选择上,一个g711ulaw,一个alaw,使用方法如下:在sip_profile文件夹中包含了internal.xmlexternal.xml,