• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>

    《FreeSWITCH: VoIP實(shí)戰》:撥號計劃- Dialplan

    2012-08-17 15:51:59   作者:杜金房   來(lái)源:CTI論壇   評論:0  點(diǎn)擊:


      可以看到,由于我們呼叫的是 1235,它在第三行測試 My Echo Test 的 1234 的時(shí)候失敗了,接在接下來(lái)測試 1235的時(shí)候成功了,便執行相對應的 Action - info 這個(gè)APP。它的作用就是把所有 Channel Variables 都打印到 Log 中。

      所有的 Channel Variable 都是可以在 Dialplan 中訪(fǎng)問(wèn)的,使用格式是 ${變量名},如 ${destination_number}。將下列配置加入 Dialplan 中(存盤(pán),reloadxml 不用再說(shuō)了吧?):

    <extension name="Accessing Channel Variable">
      <condition field="destination_number" expression="^1236(\d+)$">
        <action application="log" data="INFO Hahaha, I know you called ${destination_number}"/>
        <action application="log" data="INFO The Last few digists is $1"/>
        <action application="log" data="ERR This is not actually an error, just jocking"/>
        <action application="hangup"/>
      </condition>
    </extension>

    這次我們呼叫 1236789,看看結果:

    Processing Seven <1000>->1236789 in context default
    parsing [default->Echo Test] continue=false
    Regex (FAIL) [Echo Test] destination_number(1236789) =~ /^echo|1234$/ break=on-false
    parsing [default->Show Channel Variable] continue=false
    Regex (FAIL) [Show Channel Variable] destination_number(1236789) =~ /^1235$/ break=on-false
    parsing [default->Accessing Channel Variable] continue=false
    Regex (PASS) [Accessing Channel Variable] destination_number(1236789) =~ /^1236(\d+)$/ break=on-false
    Action log(INFO Hahaha, I know you called ${destination_number})
    Action log(NOTICE The Last few digists is 789)
    Action log(ERR This is not actually an error, just jocking)
    Action hangup()

    [DEBUG] switch_core_state_machine.c:157 sofia/internal/1000@192.168.7.10 Standard EXECUTE

    EXECUTE sofia/internal/1000@192.168.7.10 log(INFO Hahaha, I know you called 1236789)
    [INFO] mod_dptools.c:1152 Hahaha, I know you called 1236789
    EXECUTE sofia/internal/1000@192.168.7.10 log(NOTICE The Last few digists is 789)
    [NOTICE] mod_dptools.c:1152 The Last few digists is 789
    EXECUTE sofia/internal/1000@192.168.7.10 log(ERR This is not actually an error, just jocking)
    [ERR] mod_dptools.c:1152 This is not actually an error, just jocking
    EXECUTE sofia/internal/1000@192.168.7.10 hangup()

       跟前面一樣,我們還是從綠色的行開(kāi)始看。這一次,1236789 匹配了正則表達式 ^1236(\d+),并將 789 存儲在變量 $1 中。然后在 8-11 行看到它解析出的四個(gè) Action(三個(gè) log 一個(gè) hangup)。到這里為止,Channel 的狀態(tài)一直沒(méi)有變,還處在路由查找的階段。在所有 Dialplan 解析完成后,Channel 狀態(tài)才進(jìn)行 Standard Execute 階段。理解這一點(diǎn)是非常重要的,我們后面再做詳細說(shuō)明,但是在這里你要記住路由查找(解析)和執行分屬于不同的階段。當 Channel 狀態(tài)進(jìn)入執行階段后,它才開(kāi)始依次執行所有的 Action。log() 的作用就是將信息寫(xiě)到 Log 中,它的第一個(gè)參數是 leglevel,就是 Log 的級別,有 INFO、Err、DEBUG等,不同的級別在彩色的終端上能以不同的顏色顯示。(詳細的級別請參考http://wiki.freeswitch.org/wiki/Mod_logfile#Log_Levels)。

      你肯定看到彩色的 Log 了,同時(shí)也看到了用 $ 表示的 Channel Variable 被替換成了相應的值。

      同時(shí)你也看到,這次實(shí)驗我們特意增加了幾個(gè) Action。一個(gè) Action 通常有兩個(gè)參數,一個(gè)是 application,代表要執行的 APP,另一個(gè)是 data,就是 APP 的參數,當 APP 沒(méi)有參數時(shí),data也可能省略。

      一個(gè) Action 必須是一個(gè)合法的 XML 標簽,在前面,你看到的 context,extension 等都是成對出現的,如 。但由于 Action 比較簡(jiǎn)單,一般彩用簡(jiǎn)寫(xiě)的形式來(lái)關(guān)閉標簽,即 。注意大于號前面的“/”,如果不小漏掉,在 reloadxml 時(shí)將會(huì )出現類(lèi)似“+OK [[error near line 3371]: unexpected closing tag ]” 的錯誤,而實(shí)際的錯誤位置又通常不是出錯的那一行。這是在編輯 XML 文件時(shí)經(jīng)常遇到的問(wèn)題,又比較難于查找。因此在修改時(shí)要多加小心,并推薦使用具有語(yǔ)法高亮的功能的編輯器來(lái)編輯。

       讀到這里,你或許還有疑問(wèn),既然我們在 info APP 的輸出里沒(méi)看到 destination_number這一變量,它到底是從哪里來(lái)的呢?是這樣的,它在 info 中的輸出是 Caller-Destination-Number,但你在引用的時(shí)候就需要使用 destination_number。還有一些變量,在 info 中的輸出是 variable_xxxx,如 variable_domain_name,而實(shí)際引用時(shí)要去掉 variable_ 前綴。不要緊張,這里有一份對照表: http://wiki.freeswitch.org/wiki/Channel_Variables#Info_Application_Variable_Names_.28variable_xxxx.29

    測試條件 - Conditions
    動(dòng)作與反動(dòng)作 - Action & Anti-Action
    工作機制進(jìn)階
    實(shí)例解析
    ...

      以上的論述應該涵蓋了 Dialplan 的所有概念,當然,要活學(xué)活用,還需要一些經(jīng)驗。下面,我們講幾個(gè)真實(shí)的例子。這些例子大部分來(lái)自默認的配置文件。

       Local_Extension

      我們要看的第一個(gè)例子是 Local_Extension。 FreeSWITCH 默認的配置提供了 1000 - 1019 共 20 個(gè) SIP 賬號,密碼都是 1234 。

    <extension name="Local_Extension">
        <condition field="destination_number" expression="^(10[01][0-9])$">
        //actions
        </condition>
    </extension>

       這個(gè)框架說(shuō)明,用正則表達式 (10[01][0-9])$ 來(lái)匹配被叫號碼,它匹配所有 1000 - 1019 這 20 個(gè)號碼。

      這里我們假設在 SIP 客戶(hù)端上,用 1000 和 1001 分別注冊到了 FreeSWITCH 上,則 1000 呼叫 1001 時(shí),FreeSWITCH 會(huì )建立一個(gè) Channel,該 Channel 構成一次呼叫的 a-leg(一條腿)。初始化完畢后,Channel 進(jìn)入 ROUTING 狀態(tài),即進(jìn)入 Dialplan。由于被叫號碼 1001 與這里的正則表達式匹配,所以,會(huì )執行下面這些 Action。另外,由于我們在正則表達式中使用了 “( )”,因此,匹配結果會(huì )放入變量 $1 中,因此,在這里,$1 = 1001。

    <action application="set" data="dialed_extension=$1"/>
    <action application="export" data="dialed_extension=$1"/>

      set 和 export 都是設置一個(gè)變量,該變量的名字是 dialed_extension,值是 1001。

      關(guān)于 set 和 export 的區別我們在前面已經(jīng)講過(guò)了。這里再重復一次: set 是將變量設置到當前的 Channel 上,即 a-leg。而 export 則也將變量設置到 b-leg 上。當然,這里 b-leg 還不存在。所以在這里它對該 Channel 的影響與 set 其實(shí)是一樣的。因此,使用 set 完全是多余的。但是除此之外,export 還設置了一個(gè)特殊的變量,叫 export_vars,它的值是dialed_extension。所以,實(shí)際上。上面的第二行就等價(jià)于下面的兩行:

    <action application="set" data="dialed_extension=$1"/>
    <action application="set" data="export_vars=dialed_extension"/>

    <!-- bind_meta_app can have these args <key> [a|b|ab] [a|b|o|s] <app> -->
    <action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/>
    <action application="bind_meta_app" data="2 b s record_session::$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
    <action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/>
    <action application="bind_meta_app" data="4 b s execute_extension::att_xfer XML features"/>

    bind_meta_app 的作用是在該 Channel 是綁定 DTMF。上面四行分別綁定了 1、2、3、4 四個(gè)按鍵,它們都綁定到了 b-leg上。注意,這時(shí)候 b-leg 還不存在。所以,請記住這里,我們下面再講。

    <action application="set" data="ringback=${us-ring}"/>

    設置回鈴音是美音(不同國家的回鈴音是有區別的),${us-ring} 的值是在 vars.xml 中設置的。

    <action application="set" data="transfer_ringback=$${hold_music}"/>

    設置呼叫轉移時(shí),用戶(hù)聽(tīng)到的回鈴音。

    <action application="set" data="call_timeout=30"/>

    設置呼叫超時(shí)。

    <action application="set" data="hangup_after_bridge=true"/>
    <!--<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/> -->
    <action application="set" data="continue_on_fail=true"/>

    這些變量影響呼叫流程,詳細說(shuō)明見(jiàn)下面的 bridge。

    <action application="hash" data="insert/${domain_name}-call_return/${dialed_extension}/${caller_id_number}"/>
    <action application="hash" data="insert/${domain_name}-last_dial_ext/${dialed_extension}/${uuid}"/>
    <action application="hash" data="insert/${domain_name}-last_dial_ext/${called_party_callgroup}/${uuid}"/>
    <action application="hash" data="insert/${domain_name}-last_dial_ext/global/${uuid}"/>

    分享到: 收藏

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 桐城市| 翁牛特旗| 甘肃省| 大邑县| 富宁县| 贵德县| 类乌齐县| 马山县| 辛集市| 南溪县| 东乌珠穆沁旗| 南和县| 望城县| 策勒县| 慈溪市| 桂平市| 拜城县| 城固县| 灌南县| 京山县| 巴塘县| 乌兰县| 德钦县| 观塘区| 都兰县| 大方县| 长寿区| 汝南县| 乳山市| 五常市| 黄骅市| 龙胜| 望谟县| 唐山市| 威远县| 宣恩县| 改则县| 新乡市| 晋州市| 铜山县| 慈利县| http://444 http://444 http://444 http://444 http://444 http://444