Asterisk撥號計劃之匹配規則和優先級詳解

1. Asterisk撥號計劃簡介
    本身查資料正則表達式

2. Asterisk配置
    先添加SIP分機 801,用軟電話註冊分機後,修改801分機的context=test-inc ,由於咱們下面要探究Asterisk 基於相似正則表達式的匹配以及include=>包含指令優先級。在asterisk撥號計劃配置文件extensions.conf 中加入以下撥號規則

[test-inc]
include => inc1
include => inc2
include => inc3
exten => _.,1,NooP(==00==)
[inc1]
exten => _33XX,1,NooP(==11==)
[inc2]
exten => _22.,1,NooP(==22==)
[inc3]
exten => 3333,1,NooP(==3333==)測試

3. 先直接給出結論
    1)在同一個context中,對於正則匹配的規則,分機越詳細的規則 對應的APP就會被優先匹配執行。例如:
exten=> _X5X.,n,APP1 和 exten=> _15X.,n,APP2 ,後面的正則匹配表達式「_15X.」 明顯就比前面的要詳細和明確,因此對於 exten爲 1581000000的手機號,那麼優先執行後面的撥號計劃,也就是執行APP2spa

    2)容器類context(也就是有include=>包含子context的上下文),好比上面的[test-inc]中的明確給出的撥號計劃語句,老是比它用 include=> 指令包含的context中的優先級要高,即便子context裏面的正則匹配比它的父context還要詳細和明確,只要撥號的分機extension可以匹配父context中的分機正則表達式分機,那麼撥號計劃的流程絕對不會執行到子context。 例如上面的例子中,父context 有一個 exten => _.,1,NooP(==00==) 這樣的_.的所有匹配的分機正則表達式,那麼全部sip分機配置中凡是設置了context=test-inc 的分機撥號後都只能執行NooP(==00==)。由於_.是萬能匹配的,全部的分機均可以在父context [test-inc]中找到匹配,因此子context中的撥號規則永遠也不會執行。
測試:請用801撥打3333測試,你會發現 asterisk CLI> 輸出的是執行NooP(==00==) ,而不是 NooP(==3333==) ,請自行測試。
另外:若是父context中匹配不了分機撥打的extension,那麼asterisk纔會考慮去匹配子context中的規則。ip

    3)某個父context中的include=> 中的優先級是 從上到下而遞減的。 舉例來講: [test-inc] 中匹配優先級inc1 > inc2 > inc3 。具體體如今某個撥號規則,在父context中沒有匹配,那麼aterisk將會查找include=>子context 中的撥號規則去尋求匹配,可是是有優先級順序的。好比某個來電的分機匹配了 inc1中的extension規則,即便在 inc2,inc3中有更加明確的正則表達式匹配,結果也不會去匹配inc2或者inc3中的規則的。
註釋掉上面的「exten => _.,1,NooP(==00==)」 ,而後重載撥號規則,再撥打3333 ,你將會發現執行的是[inc1]中的 「NooP(==11==)」 而非「[inc3]」中的 「NooP(==3333==)」 。請自行測試。路由

4. 明白了上述幾點,也就會明白爲何FreePBX生成的撥號規則總會一個 include => XXXX-custom 放在每一個context的第一行,並且FreePBX會有調整出局路由優先級的概念了io

相關文章
相關標籤/搜索