《FreeSWITCH中的XML拨号计划.docx》由会员分享,可在线阅读,更多相关《FreeSWITCH中的XML拨号计划.docx(14页珍藏版)》请在第一文库网上搜索。
1、FreeSWITCH中的XM1拨号计划dia1p1an本文是ar1yard。翻译的,内容来自。介绍FS的配置文件都在conf目录下,都是xm1文件。拨号方案的配置文件主要在dia1p1an目录下。Xm1文件可以直接进行编辑,这使得配置FS的拨号方案非常灵活、方便。官方文档中,FS的拨号方案叫做XM1Dia1p1anoXm1配置文件中允许使用Per1兼容的正则表达式来匹配一个号码域,如10010-9匹配1000到1019的号码。正则表达式的用法参考。FS运行时,会先解析所有Xm1文件,形成一个完整的配置方案。变量XM1Dia1P1an可以通过变量和表达式检测各种状况,当然如果判断条件不允许,该分
2、支中的变量是不会起作用的。XM1Dia1p1an实际上是用于呼叫路由(Ca11Routing),而不是用于繁杂的条件检测和评估。FS支持1ua、JavaScriptPer1Python等脚本语言,这是比直接单纯使用复杂的XM1方案更好的选择。FS的拨号方案分为两步骤:查找和执行(huntingandexecuting)o首先查找时,基于条件判断,执行或撤销一个动作(action),把所有的应用解析出来,然后按顺序执行。也就是说,在查找的时候,执行阶段的信道变量(Channe1variab1es)是不会起作用的。比如XM1文件中配置了,但是这个应用在前期的查找中,不符合条件的话就得不到执行,不过
3、也可以通过使用脚本语言来修改条件,或者XM1中使用条件求值使它在解析阶段就得到执行。注:自SVNRev14906起,允许某些应用使用in1ine关键字,这意味着它们可以在解析阶段求值,并应用于以后的条件匹配中。主叫描述文件(Ca11erPrOfi字段与信道变量(Channe1Variab1eS)的区别:在组织你的Dia1p1an时,这两者之间的区别可能是最令人头痛的,注意,前者是直接的字符串描述而后者使用变量语法注意,$.表示获取一个变量的值。XM1Dia1P1an解析当呼叫到达ROUTING状态时,拨号方案配置文件就会被解析。解析完后得到一个完整的建立channe1的步骤,这些步骤由解析xm
4、1中action或antiaction标示得至少对于熟悉Asterisk的人来说,可能期望在一个action中获得的值能影响下action的判断。在FreeSWITCH中不是这样了。除非用$apifunc(apiargSvar-name)w这样的字段,在解析阶段从一个模块中调用一个可插入式的API,这情况仅应用于显示实时信息,如时间或其他可快速访问获取的信息,而不应该被滥用。XM1Dia1P1an剖析XM1Dia1p1an中有几大要素:context(上下文)、extension(分机号)、condition(条件)、action(动作),它们会被按顺序处理,直到action被处理,actio
5、n告诉FS要执行的操作。对一个分机号,可以有多个condition(条件判断)和actionoExtension通俗的说就是电话号码,当然FS可以为其他设备分配号码,甚至是一个特殊的应用分配一个号码,如会议号。XM1Dia1p1an目录可以考虑把分机号的xm1配置文件放置到conf/dia1p1an/defau1t目录,该目录中的分机号会被优先于Enumextension被解析到拨号方案中。Xm1文件会按名字排序,排前面的xm1文件会被优先加载,如OO1MYExtxmI会优先于002_Yu.xm1。默认已经有IOoo至I1019分机号的m1文件。Enumextension放在最后,如果执行到这
6、一步时,它会匹配所有的分机号。ContextContexts是extensions(分机号)的逻辑分组。我们可能会有多个分机号在一个context中。Contet需要一个叫name,的参数,它的值是any的话表示匹配任何J情况。Name是用于表示ConteXt的,freeswitch.xm1文件中默认包含几个context:默认extensionEXtenSiOn是一个呼叫的目的地,所以它不仅仅表示电话号码,虽然我叫它分机号需要给出一个name和conditions和actions以告诉FS如何找到它。这里name是唯一的,标识一分机号供后面使用。一个附加的参数叫做continue,默认把它设
7、置为fa1se,设为true表示FS在当前分机号的所有action都解析完后会继续解析后续的所有分机号的actions如下,添加一个action:bridge,桥接到分机号500:找号码为500的分机,找到则解析action!-Ifyoudontwanttobridgeaca11toa1oca1registereduserzbuttoaSIPUR1usetheinsteadof?%:第一行原型如下:第二行表示条件判断:如果有分机的号码是500则继续解析下面的action/break表示判断后的行为,有以下值:* On-true:第一次匹配后停止查找* On-fa1se:默认值,第一次失败后停止
8、查找* A1ways:不管匹配与否都停止* Never:无论匹配与否都继续查找经过网关的呼叫gateway是mod,sofia的关键字,表示一个呼叫需要经过一个配置好的网关:当呼叫网关上的号码100/bridge到网关上conditionCondition是模式匹配标签,帮助FS决定是否处理对当前extension的呼叫。可以比较的参数有contextxrdnis、destination.numberxca11er_id_name等;fi1ed段和expression段都可以有参数。Fie1d段表示要匹配的对象(目的?上下文。),expression段表示要匹配的表达式。下面是一个网关的例子:
9、/fie1d域和expression域/网关ip和端口FS注册这个网关来呼叫PSTN上的电话。ActionandAnti-Action当conditions判断匹配的话,就会执行action,否则执行Anti-actionoACtiOn有两个参数:叩P1iCation表示已经注册的要执行的应用,如bridge;data是app1ication的参数。使用Anti-action的时候不可以使用$1,因为正则表达式不匹配,第一个参数是无效的。In1ineActions如果在action中把附加参数in1ine设置为true,则该action在dia1p1an查找期间就得到执行:可以内联执行的act
10、ion有:* check_ac1z* eva1z* event,* export,* 1og,* presence,* set,* sejg1oba1,* set_profi1e_var;* SetjJSer;* s1eep,* unset,* VerbOSe_events,* cid1ookupz* cur1,* easyroutez* enumz* 1cr,* nibb1ebi11,* odbc_query内联执行的应用不会记录到Cdr中。EXAMP1ES如果你要在单独的xm1文件中加入自己的分机号,需要注释掉你不需要的enumextension(应该就是defau1t.xm1中默认配置的
11、分机号,如1000到1019)。使用inc1ude把xm1文件包含到XM1Dia1p1an.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应用。注:新的的版本允许使用in1ine关键字来执行set,月解的话你就可以在后续的condition中使用。Example 2这个例子判断来自固$定ip和由1开头的号码。这里$1表示1后面的数值,$0才表示整个号码:Example 3接受00开头的号码才巴号码交给FS处理时才巴00前缀去掉,如接到OO123把123交给FS这里(d+)表示数字,任意个,(.+)表示任意个字符Example 4接受带前缀的号码,处理时除掉前缀,在给它加上新的前缀.Example 5这个例子演示profi1es的用法,profi1e是对这段的描述,所以需要需要终端支持才可以配置,如mod_SOfia,sip终端,它的profi1es如下这两个profi1e不同之处在编码选择上,一个g711u1aw,一个a1aw,使用方法如下:在sip_profi1e文件夹中包含了interna1.xm1externa1.xm1,