freeswitch dialplan学习总结
<ul class="article_tags clearfix csdn-tracking-statistics tracking-click" data-mod="popu_377">
<li class="tit">标签:</li>
- voip /
- freeswitch /
- dialplan /
Dialplan 是freeswitch 对一个呼入电话的路由查询。通过 show dialplan 命令可以查看到当前freeswitch可以支持的哪些 dialplan.
常用的 dialplan 有 XML、LUA、inline等。
XML Dialplan 主要由一系列xml配置文件组成,格式如下:
- <context name=“mydialplan”>
- <extension name=“ext1”>
- <condition field=“xxx” expression=“xxx”>
- <action application=“app” data=“args”/>
- </condition>
- </extension>
- </context>
<context name="mydialplan"> <extension name="ext1"> <condition field="xxx" expression="xxx"> <action application="app" data="args"/> </condition> </extension> </context>
更详细的配置可以参考 conf/dialplan/default.xml 文件。其中配置文件中的 name 字段是可以重复存在的, freeswitch并没有对该属性做检查,freeswitch 只在找到匹配的extension时,将其 action 记录到执行队列。注意:在dialplan的匹配过程中,并不会执行 action(带有inline属性的action除外,该类型的action会立即执行,一般用来设置一个变量值),需要等到dialplan结束时,才会进入执行阶段!
对于dialplan解析何时结束,这是可控的。
1、在extension 后面可以添加 continue 属性
continue = “true” :表示不管该extension中是否有condition匹配,都继续执行dialplan
continue = “false”:表示如果该extension中有匹配的condition,那么就停止了dialplan。false是默认值
2、在condition 后面可以添加 break 属性,break可以是下面几个值
“on-false” :表示在第一次匹配失败时停止(但继续处理其他的extension),这是默认配置
“on-true” :表示在第一次匹配成功时停止,不成功则继续路由该condition后面的其他 condition
“always” :不管是否匹配都停止该 extension 中的 condition 路由
“never” :不管是否匹配都继续该 extension 中的 condition 路由
默认情况下,在没有任何 continue、break属性的时候,在找到 匹配后,就会结束dialplan.
从上面两点可以看出,continue是用来限制是否继续下一个 extension; break 是用来限制是否继续下一个 condition
有点特殊地方就是 break=”on-false”的时候,如果该 conditon 没有被匹配,则结束后面的 condition, 然后跳到下一个 extension。看似 break 影响了 extension 的流程,其实这样是可以理解的,因为 break=”on-false” 表示没有匹配到就退出,此时该extension 的最新匹配状态被标示为不匹配,如果extension没有被匹配,则默认会进入下一个extension.
这里的extension最新状态特别说明一下,如下例子:
- <extension name=“test_dialplan”>
- <condition field=“destination_number” expression=“7777” break=“never”>
- <action application=“info”/>
- </condition>
- <condition field=“destination_number” expression=“8888” break=“on-false”>
- <action application=“info”/>
- </condition>
- <condition field=“destination_number” expression=“9999”>
- <action application=“info”/>
- </condition>
- </extension>
<extension name="test_dialplan"> <condition field="destination_number" expression="7777" break="never"> <action application="info"/> </condition> <condition field="destination_number" expression="8888" break="on-false"> <action application="info"/> </condition> <condition field="destination_number" expression="9999"> <action application="info"/> </condition> </extension>
当我们拨打 7777 时,第一个 condition 被匹配,但是 break=’never” 则会继续下一个 condition,此时extension被标示为匹配状态。路由到第二个 condition时,发现不匹配,同时 break=”on-false” 所以应该停止后面的 condition,结束该 extension, 并且将 extension 的匹配状态标示为不匹配,extension的匹配状态决定了是否进行下一个extension.
可以看出,extension 的 匹配状态是最后一个 condition 的匹配状态!
</div> <script> $(".MathJax").remove(); </script> </article>