freeswitch dialplan(转)


freeswitch dialplan学习总结





原创

2014年09月14日 16:27:19

        <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配置文件组成,格式如下:

    1. <context name=“mydialplan”>  
    2.     <extension name=“ext1”>  
    3.         <condition field=“xxx” expression=“xxx”>  
    4.              <action application=“app” data=“args”/>  
    5.         </condition>  
    6.     </extension>  
    7. </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最新状态特别说明一下,如下例子:

    1.  <extension name=“test_dialplan”>  
    2.    <condition field=“destination_number” expression=“7777” break=“never”>  
    3.   <action application=“info”/>  
    4. </condition>  
    5.    <condition field=“destination_number” expression=“8888” break=“on-false”>  
    6.   <action application=“info”/>  
    7. </condition>  
    8. <condition field=“destination_number” expression=“9999”>  
    9.   <action application=“info”/>  
    10. </condition>  
    11.  </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>
    
    阅读更多

    没有更多推荐了,返回首页