首页 > 新闻 > 专家观点 >

《FreeSWITCH: VoIP实战》:拨号计划- Dialplan

2012-08-17 15:51:59   作者:杜金房   来源:CTI论坛   评论:0  点击:


  你可以看到,前面的正则表达式匹配都没有成功(Regex (FAIL)),只是到最后匹配到 ^9196$才成功(你看到 Regex (PASS)了),成功后先应答(answer),然后执行 echo。

   在这一节里,我们花了很多篇幅来讲解如此简单的问题。但实际上,我是想让你知道,这一节最重要的不是讲 Dialplan,而是告诉你如何看 Log。在邮件列表上,大多数新手遇到的问题都可以很轻松的从 Log 中看出来,但他们不知道怎么看,或者是看了也不理解。所以,在这里,我想请你再看一下我们的第一个例子。永远记住:遇到 Dialplan 的问题,按F8打开DEBUG级别的日志,从绿色的行开始看起(当然,如果你的终端不能显示颜色,那么,从 Processing 一行看起)。我们的第一个例子虽然只有短短的四行 Log,但是它包含了所有你需要的信息。

  默认的配置文件结构

  系统默认提供的配置文件包含三个 Context:default、features和 public,它们分别在三个 XML 文件中。default 是默认的 dialplan,一般来说注册用户都可以使用它来打电话,如拨打其它分机或外部电话等。而 public 则是接收外部呼叫,因为从外部进来的呼叫是不可信的,所以要进行更严格的控制。如,你肯定不想从外部进来的电话再通过你的网关进行国内或国际长途呼叫。

  当然,这么说不是绝对的,等你熟悉了 Dialplan 的概念之后,可以发挥你的想象力进行任何有创意的配置。

  其中,在 default 和 public 中,又通过 INCLUDE 预处理指令分别加入了 default/ 和 include/ 目录中的所有 XML 文件。 这些目录中的文件仅包含一些额外的 Extension。由于 Dialplan 在处理是时候是顺序处理的,所以,一定要注意这些文件的装入顺序。通常,这些文件都按文件名排序,如 00_,01_等等。如果你新加入 Extension,可以在这些目录里创建文件。但要注意,这些文件的优先级比直接写在如 default.xml 中低。我前面已经说过,由于你不熟悉系统提供的默认的 Dialplan,很可能出现与系统冲突的情况。当然,你已经学会如何查看 Log,所以能很容易的找到问题所在。但在本书中,我还是坚持将新加的 Extension 加在 Dialplan 中的最前面,以便于说明问题。

  实际上,由于在处理 Dialplan 时要对每一项进行正则表达式匹配,是非常影响效率的。所以,在生产环境中,往往要删除这些默认的 Dialplan,而只配置有用的部分。但我们还不能删,因为里面有好多例子我们可以学习。

   正则表达式

   Dialplan 使用 Perl 兼容的正则表达式(PCRE, Perl-compatible regular expressions)匹配。熟悉编程的同学肯定已经很熟悉它了,为了方便不熟悉的同学,在这里仅作简单介绍:

^1234$         ^ 匹配字符串开头,$ 匹配结尾,所以本表达式严格匹配 1234
^1234|5678$    | 是或的意思,表示匹配 1234 或 5678
^123[0-9]$     [ ] 表式匹配其中的任意一个字符,其中的 - 是省略的方式,表示 0 到 9,它等于 [0123456789]
               也就是说它会匹配 1230,1231,1232 ... 1239
^123\d$        同上,\d 等于 [0-9]
^123\d+$       + 号表示1个或多个它前面的字符,因为 + 前面是 \d,所以它就等于1个或多个数字,实际上,
               它匹配任何以123开头的至少4位数的数字串,如1230,12300,12311,123456789等
^123\d*$       *号与+号的不同在于,它匹配0个或多个前面的字符。
               所以,它匹配以123开头的至少3位数的数字串,如 123,123789
^123           跟上面一样,由于没有结尾的$,它匹配任何以123开头的数字串,但除此之外,它还匹配后面是字母的情况,如 123abc
123$           匹配任何以123结尾的字符串
^123\d{5}$     {5}表示精确匹配5位,包含它前面的一个字符。在这里,它匹配以123开头的所有8位的电话号码
^123(\d+)$     ( )在匹配中不起作用,跟^123\d+是相同的,但它对匹配结果有作用,
               匹配结果中除123之外的数字都将存储在$1这个变量中,在下一步使用
^123(\d)(\d+)$ 如果用它跟12345678匹配,则匹配成功,结果是 $1 = 4, $2 = 5678

  简单的正则表达式比较容易理解,更深入的学习请查阅相关资料。正则表达式功能很强大,但配置不当也容易出现错误,轻者造成电话不通,重者可能会造成误拨或套拨,带来经济损失。

   信道变量 - Channel Variables

  在 FreeSWITCH 中,每一次呼叫都由一条或多条“腿”(Call Leg)组成,其中的一条腿又称为一个 Channel(信道),每一个 Channel 都有好多属性,用于标识 Channel 的状态,性能等,这些属性称为 Channel Variable(信道变量),简写为 Channel Var 或 Chan Var 或 Var。

  通过使用 info 这个 APP,可以查看所有的 Channel Var。我们先修改一下 Dialplan。

<extension name="Show Channel Variable">
  <condition field="destination_number" expression="^1235$">
    <action application="info" data=""/>
  </condition>
</extension>

  加入 default.xml 中,为了复习上一节的内容,我们这一次加入 My Echo Test 这一 Extension 的后面,存盘,然后在 FreeSWITCH 命令行上执行 reloadxml。从软电话上呼叫 1235,可以看到有很多 Log输出,还是从绿色的行开始看:

Processing Seven <1000>->1235 in context default
parsing [default->Echo Test] continue=false
Regex (FAIL) [Echo Test] destination_number(1235) =~ /^echo|1234$/ break=on-false
parsing [default->Show Channel Variable] continue=false
Regex (PASS) [Show Channel Variable] destination_number(1235) =~ /^1235$/ break=on-false
Action info()
...
EXECUTE sofia/internal/1000@192.168.7.10 info()
2010-10-23 09:46:31.662281 [INFO] mod_dptools.c:1171 CHANNEL_DATA:
Channel-State: [CS_EXECUTE]
Channel-Call-State: [RINGING]
Channel-State-Number: [4]
Channel-Name: [sofia/internal/1000@192.168.7.10]
Unique-ID: [cfea988b-2dc4-42ec-b731-2cd7ea864fc6]
Caller-Direction: [inbound]
Caller-Username: [1000]
Caller-Dialplan: [XML]
Caller-Caller-ID-Name: [Seven]
Caller-Caller-ID-Number: [1000]
Caller-Network-Addr: [192.168.7.10]
Caller-ANI: [1000]
Caller-Destination-Number: [1235]
variable_direction: [inbound]
variable_uuid: [cfea988b-2dc4-42ec-b731-2cd7ea864fc6]
variable_sip_local_network_addr: [123.130.140.154]
variable_remote_media_ip: [123.130.140.154]
variable_remote_media_port: [8000]
variable_sip_use_codec_name: [PCMA]
variable_sip_use_codec_rate: [8000]
variable_sip_use_codec_ptime: [20]
variable_read_codec: [PCMA]
variable_read_rate: [8000]
variable_write_codec: [PCMA]
variable_write_rate: [8000]
variable_endpoint_disposition: [RECEIVED]
variable_current_application: [info]

相关阅读:

分享到: 收藏

专题