2016/02/03

Asterisk : The Cookbook 食譜 027 - 撥號計劃的互動 2 Dial()

Q027: Dial() 在撥號計劃中扮演相當重要的角色,可以說明它的用法嗎?

先直接寫 Dial() 的語法: Dial(destination,[timeout, option, URI])
首先,必須要有目標,後面是逾時、選項、URI。

distination 就是目標,我們從實例來看:
Dial(DAHDI/1) 指的是用 DAHDI 技術(裝置),後面接其使用的資源 1(此處指的是通道)。
Dial(SIP/7001), 這個出現在前面的食譜中,指的是用 SIP 技術裡面的 [7001] Context。
Dial(DAHDI/1&SIP/7001&IAX2/Softphone), 這個範例是同時播到三個目標。可以想像老人機中,同時撥電話、傳簡訊、送 email ...

以 IAX2 協定來看的話,其語法可以像底下這樣:
Dial(technology/user[:password]@remote_host[:port][/remote_extension])
實例如 exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)

以 DAHDI 裝置來看的話,可以如下:
Dial(DAHDI/[gGrR]channel_or_group[/remote_extension])
exten => 501,1,Dial(DAHDI/4/18005551212)

第二個參數是逾時秒數,直接看範例,底下等60秒逾時:
exten => 7001,n,Dial(SIP/7001,60)

第三個參數是 option, 這個是針對 Dial() 而非前面的 destination, 也是需要另外的篇幅說明,這邊就只提一個,'m'。m 選項需要在其他的 Context 中設定 Hold Music。一般在撥號時,對方會聽到嘟嘟聲,有了m 之後聽到設定中的錄音檔(就像來電答鈴)。底下是個範例:

exten => 502,1,Dial(DAHDI/1,10,m)
  same => n,Playback(vm-nobodyavail)
  same => n,Hangup()

第四個參數是根據前面的 destination 來決定的,如果 destination 需要一個 URI 傳入的話才會用到它,例如 XMPP 這種即時通訊才會用到。因為相當少用就不多說了。

允許某個參數不填,直接跳過即可,例如底下省略逾時:
exten => 1,1,Dial(DAHDI/1,,m)

底下先用一個範例來表達 Dial(),請自行研讀:
[TestMenu]
  exten => start,1,Answer()
    same => n,Background(enter-ext-of-person)
    same => n,WaitExten(5)
  exten => 1,1,Dial(SIP/0000FFFF0001,10)
    same => n,Playback(vm-nobodyavail)
    same => n,Hangup()
  exten => 2,1,Dial(SIP/0000FFFF0002,10)
    same => n,Playback(vm-nobodyavail)
    same => n,Hangup()
  exten => i,1,Playback(pbx-invalid)
    same => n,Goto(TestMenu,start,1)
  exten => t,1,Playback(vm-goodbye)
    same => n,Hangup()

最後講講變數,沒錯,撥號計畫也因為有了變數使得整個設定更加彈性。
變數是區分大小寫的,習慣上會把變數都指定成大寫。順便說一下,通道則習慣用 Pascal 命名法。

在撥號計劃中,有三大類的變數:整體變數、通道變數、環境變數

整體變數定義在 [globals] Context 中,可以往前翻翻 Q025 這篇。整體變數可以在所有通道任何時候引用。在 [globals] Context 定義變數不像上面那樣,是採用更直接的方式,範例如下:

[globals]
LEIF=SIP/0000FFFF0001

通道變數就讓我們在底下直接用範例來說明:
exten => 301,1,Set(LEIF=SIP/0000FFFF0001)
  same => n,Dial(${LEIF})
還記得嗎?我們說撥號計劃是一系列的步驟。上面第一行只是設定變數 LEIF 而已,在第二行引用時,必須用 ${} 括住。

環境變數則是在執行 Asterisk 的時候由系統產生的,因為你在設定檔中看不到,引用方式也比較特別,語法 ${ENV(var)},範例如下:
${ENV(PATH)}

後面還有一項更複雜的項目需要說明,樣式比對。

0 意見: