2016/02/03

Asterisk : The Cookbook 食譜 026 - 撥號計劃的互動 Interactive Dialplan

Q026: 前面只提到簡單的撥號計劃,可以進一步談談撥號計劃如何互相引用嗎?

是的,前一則食譜介紹的是靜態的撥號計劃,用來完成固定的動作是夠了。但是如果要在不同情況做不同的動作,就必須要特別的機制,這邊先介紹三個 Applications(): Goto(), Background(), 及 WaitExten()

Goto() 語法: same => n,Goto(context,extension,priority)
Goto() 需要三個參數,譬如: exten => 201,1,Goto(TestMenu,start,1)
如果要讓上面的範例可以作動,必須再定義一個 Context 如下:

[TestMenu]
exten => start,1,Answer()
....

這邊也示範了 Extension 不一定是數字,此處是 start
這個範例應用在一個實際通話中要求使用者輸入轉接分機,當使用者輸入 201 時,就會轉到 TestMenu 分機中。

Background() 語法跟 Playback() 一樣,但是最大的差異是 Playback() 遇到按鍵就中斷了,而 Background() 則不會。在應用上可以像加密輸入,或是邊播放語音說明邊等使用者輸入其他選擇(或是分機),後面的用法就是語音選單。這兩種用法都可以是 DTMF 數字。底下用一個比較實用的範例來說明:

[TestMenu]
  exten => start,1,Answer()
    same => n,Background(enter-ext-of-person)
    same => n,WaitExten(5)
  exten => 1,1,Playback(digits/1)
  exten => 2,1,Playback(digits/2)
...

上面也用到了 WaitExten(),剛好用來做為語音選單的範例。WaitExten() 可以接等待的秒數當參數,沒給的話就用預設值(10秒)。上面範例剛好示範了當使用者在 Background() 期間輸入數字的話,會聽到該分機相對應的聲音。

以本則食譜來說,當使用者撥入 201 分機的話,首先會聽到英文的『請輸入分機號碼,我將為您轉接』,然後等你輸入 1, 或 2。

如果分機是多位數的話,可以參考底下的範例:
[TestMenu]
  exten => start,1,Answer()
    same => n,Background(enter-ext-of-person)
    same => n,WaitExten(5)
  exten => 1,1,Playback(digits/1)
    same => n,Goto(TestMenu,start,1)
  exten => 2,1,Playback(digits/2)
    same => n,Goto(TestMenu,start,1)

講到這邊,你可以知道怎麼設計複雜的分機或是自動轉接的撥號計劃了。
底下就來處理無效的輸入或是處理逾時。

先簡介一下兩個分機號碼,無效輸入對應到 i, 逾時對應到 t。接下來用範例來說明:

[TestMenu]
  exten => start,1,Answer()
    same => n,Background(enter-ext-of-person)
    same => n,WaitExten(5)
  exten => 1,1,Playback(digits/1)
    same => n,Goto(TestMenu,start,1)
  exten => 2,1,Playback(digits/2)
    same => n,Goto(TestMenu,start,1)
  exten => i,1,Playback(pbx-invalid)
    same => n,Goto(TestMenu,start,1)
  exten => t,1,Playback(vm-goodbye)
    same => n,Hangup()

上例中,當使用者輸入數字不在設定中的話,例如 3,就會選擇對應到無效輸入的 i, 此處是播『無效』的錄音檔,然後跳回去重新輸入。如果等太久遲遲沒有收到輸入的話,就會播『再見』的錄音檔,然後結束通話。

說到這邊雖然引入了兩個應用,要跟真人來對比仍然不足,所以接下來再引入另一個應用 Dial()。

我覺得 Dial() 是相當重要的,所以打算單獨來說,看前一篇的範例就知道,Dial() 幾乎是我們實際在設計分機時都會想要用的,而不像這邊提到的 Background(), WaitExten(), i, t, 等等。


0 意見: