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>
更詳細的配置可以參考 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>
當我們撥打 7777 時,第一個 condition 被匹配,但是 break='never" 則會繼續下一個 condition,此時extension被標示為匹配狀態。路由到第二個 condition時,發現不匹配,同時 break="on-false" 所以應該停止后面的 condition,結束該 extension, 並且將 extension 的匹配狀態標示為不匹配,extension的匹配狀態決定了是否進行下一個extension.
可以看出,extension 的 匹配狀態是最后一個 condition 的匹配狀態!