一直在看<Asterisk,電話未來之路CHN2>這個電子文檔,卻越看越糊途。於是在N+X次的Baidu後找到這個文檔:
[separator]
===================================================
http://skytony.spaces.live.com/blog/cns!3ADCAF7D549E5C1E!209.entry
設定檔 “extensions.conf” 包含了Asterisk的撥號方案(dial plan)。它的所有操作的控制和執行流程的主要方案。它控制呼入和呼出是如何被處理和路由。這裡是你配置串連行為的地方。 "extensions.conf"的內容以“節”的形式組織。它可以靜態設定和定義,作為上下文被執行。設定節有general 和 globals 兩種形式,由系統管理員完全定義。一種特殊類型的“contexts”是 macros,由使用者自訂,命名首碼是“macro-”,這是可重用的模式,如同程式設計語言裡的“過程”。extensions.conf中每一節都由 []中的節名開始。這使得extensions.conf具有和windows世界裡傳統的ini檔案非常相似的結構。 Asterisk v1.2中的新東西: 預設情況下,有一個新的選項“autofallthrough”被設定成了“yes”. 這個設定改變了以前的規則使得遇忙,阻塞,掛起的呼叫被立即終止。如果你正在為IVR寫一個extension.你必須使用“WaitExten”應用程式。 [general] extentions.conf檔案的頂部,配置幾個設定。[globals] 接著,在[globals]節中,你可以定義全域變數/常量,以及他們的初始值。 Contexts 和 Extensions 在[general]和[globals]之後,extentions.conf檔案的剩餘部分就是dialplan的定義了。dialplan是由contexts的集合組成的。每個context是由extensions的集合組成。 Extension 模式 當你在context中定義extension時,你不僅使用文字數字,字母,還要匹配extension模式。 Context包括的內容 一個extension context可以嵌套另一個,參考一下下面的範例: Context "default":
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator
Context "local":
Extension Description
_9NXXXXXX Local calls
include => "default"
Context "longdistance":
Extension Description
_91NXXNXXXXXX Long distance calls
include => "local" 這裡我們定義三種 extension第一種content: default 允許撥打三個電話extension: Mark, Wil, and the Operator. 第二種content: local 一個擴充模式:允許撥打7位元字型大小碼(本地呼叫),同時也包括 “default” context,這樣也允許使用者撥打 Mark,Wil,或者是操作員。 第三種content: longdistance 一種允許撥打長途呼叫的擴充模式。它同時也包括上述的兩種模式 (default 和 local) 使用擴充context,你可以謹慎的控制哪些人使用計費服務(內線,市話,長途) 如果一個撥叫號碼匹配多個模式,你可以參閱一下“擴充模式的排序” 當Asterisk從一個通道上收到一個呼入串連,Asterisk從context定義中查詢通道命令。context根據使用者撥打的 extension定義了不同的命令集。例如,如果使用者撥打的是“123”,context可以提供提供一套命令集來指導如何去做。如果使用者撥“9”, context可以提供另一套命令集來指導做什麼,同時context可以提供一套命令集來控制使用者撥打的任何以“555”開頭的號碼。 某些類型的友好串連,比如來自外線的呼入,使用者沒有撥打extension,在這種情況下,... 比方說,舉個例子,你有一個通道“Zap/1”,它串連到你辦公室中的一個電話手持功能。假如在Zap通道的的設定檔 (zapata.conf)中,你為Zap通道1定義了context=john.這樣當你使用那個手持功能撥打一個號碼時,Asterisk在 extension.conf中尋找名為“john”的context,找出它所應該做的(工作)。在extensions.conf中定義一個名為john的context,應該以下面的樣子開始: [john] 每一個context,你需要定義一個或者多個extensions,Asterisk根據不同的號碼撥叫用來比較。每個extension,通過命令集列表告訴了Asterisk應該做什麼。 Extensions extension 有兩種類型: literal 和 pattern literal extension 可以是一個號碼,就像123。它也可以包括出現在傳統電話中的標準的符號*和#,因此,12#89*是一個有效extension.某些電話撥號盤有一些特殊的標著 A,B,C 或者 D 的 DTMF鍵。extension也可以使用這些字母來定義。實際上,extension的名字可以包含任何字母和數字以及某些標點符號。 extension名字是大小寫敏感的?是的。有時是大小寫敏感的,有時不是。當使用者使用他們的VoIP電話撥打名為"OFFICE"的 extension 時,Asterisk不會執行名為“Office”的extension中定義的命令。另一方面,extension的名字不是大小寫敏感的,因此你不能在一個content中定義僅僅是大小寫不同的extension.因此你不能為“OFFICE”extension定義一套程式集,同時為"office"extension也定義一套程式集。 預定義的Extension名稱。Asterisk為特定的目標指定了一些extension名稱。
- i:Invalid
- s:Start
- h:Hangup
- t:Timeout
- T:AbsoluteTimeout
- o:Operator
詳細資料: Asterisk standard extensions
定義Extension
不同於傳統的PBX,extension是和電話,介面,菜單等聯絡在一起的。在Asterisk中,一個extension是定義成命令執行列表的。就像Dial和GotoIf命令,具有基於不同的條件轉到某個地方的能力。
當一個extension被撥叫,標為優先順序1的命令被執行,緊接著是2,等等。
這將一直持續到:
- 呼叫被掛起。
- 命令傳回碼-1(表示失敗)
- 下一個更高優先順序的命令不存在。(注意:Asterisk不會跳過丟失的優先順序別)
- 呼叫被路由到一個新的extension
extension.conf 檔案中的句法,一個extension執行的每一步是下面這個格式的:
exten = extension,priority,Command(parameters)
這裡等號也可以用一個箭頭來修飾,就是“=〉”,一種在很多例子中經常可以被看到的格式。
好了,假如一個“context”,名為“john”。在每一個context中,你可以定義一個或多個 extension.每一個extension中,你定義一組命令集。你如何定義這些extension和命令?你需要一個文字編輯器來編輯 extensions.conf檔案。當然,也可以使用某些不錯的工具:GUI tool.
extension中的執行步驟和命令列組件是下面的樣子:
- extension 是extension的標籤,可以是字串常量或者是動態模式-匹配許多可能的電話號碼。
- priority 通常是正數(特例參見注意)。它是一個extension中的每個命令列的排序號碼。第一個可執行命令的priority值為“1”。因此當Asterisk將一個呼叫轉入一個extension時,它將首先尋找priority值為1的命令。如果沒有優先值為1的行,那麼這個extension將不會匹配這個撥入的號碼。當執行完優先值為1的命令之後,Asterisk將把priority的值增加到2,除非命令本身決定下一個要執行的優先值。如果extension中沒有定義下一個priority,Asterisk將完成對這個 extension的處理,即使是存在一個比丟失的命令的優先順序更高的命令。
注意:特殊情況下,字串也會被用於指定優先順序(參見 Asterisk standard extensions)。
- command 是命令的名稱(也被稱為“應用程式”)。詳見 Asterisk Commands List.
- parameters 依賴於命令。某些命令沒有參數,在這種情況下省略參數。
範例
exten=>123,1,Answer
exten=>123,2,Playback(tt-weasels)
exten=>123,3,Voicemail(44)
exten=>123,4,Hangup
這是單個名為“123”的extension的定義。但一個呼叫被安排到 extension 123,Asterisk將自己回答這個呼叫,播放一個名為“tt-weasels”的音效檔,提示使用者是否留下語音信箱,然後掛斷電話。
應該注意的是,Asterisk沒有關注這幾行代碼在extensions.conf檔案中的順序。你可以以不同的順序混合這幾行代碼,就像下面的例子,它與之前的例子沒有什麼不同,因為Asterisk使用priority來標示每一行的執行順序。
exten=>123,4,Hangup
exten=>123,1,Answer
exten=>123,3,Voicemail(44)
exten=>123,2,Playback(tt-weasels)
定義extension時的其它選項包括被稱為“ex-girlfriend”邏輯的選項。這個邏輯將匹配extension,不管是來自外部還是內部,關鍵是看撥入人的呼叫ID(caller id).例如:
exten=>123/100,1,Answer()
exten=>123/100,2,Playback(tt-weasels)
exten=>123/100,3,Voicemail(123)
exten=>123/100,4,Hangup()
只有當呼入人的ID號為100時,這個extension才被匹配,並且執行接下來的選項。這個也可以通過模式比對來完成,如下所示:
exten=>1234/_256NXXXXXX,1,Answer()
and so on ...
只有以256開頭的Caller ID才會匹配“1234”這個模式。這在保持本地呼叫時是很有用的。
你甚至可以做這樣的事情:
exten=>s,1,Answer
exten=>s/9184238080,2,Set(CALLERID(name)=EVIL BASTARD)
exten=>s,2,Set(CALLERID(name)=Good Person)
exten=>s,3,Dial(SIP/goodperson)
定義context的文法關鍵字有: exten,include,ignorepat以及switch
詳見:How Does Asterisk Handle "Match As You Go" Dialing?
這種extension的排序辦法存在的一個弊端是-如果你需要插入或刪除一個priority時,你必須手動重新全部編號。我正在搞這麼一個工具用來處理這件事情,感興趣的話,可以嘗試一下:give it a try
Asterisk1.2以後的版本有一個新的方法處理這件事情。第一個優先順序給它編號,接下來的優先順序給它命名成“n”. 深入的瞭解:Asterisk Priorities
變數和運算式
支援變數的結構 ${VARIABLENAME}
使用運算式的結構${EXPRESSION} ,這裡運算式可以是常用運算式,比較運算式,加法運算式等等。
標準變數見: Asterisk variables 。運算式的描述見: Asterisk readme.variables
extensions.conf 檔案中的全域變數和通道變數的更多資訊,見Using Variables in Asterisk Dialplans
1.2版本中的新的撥號功能,見:Using Functions in Asterisk Dialplans
載入
在設定發生了改變之後,如果想重新載入撥號方案,無需載入所有的Asterisk設定檔。可以使用extension載入命令:Asterisk CLI
一個大檔案還是幾個小檔案?
當在extension.conf檔案中使用 #include<filename> 聲明時,包含了其它的檔案。用這個辦法你可以啟動這樣一個系統:extensions.conf是主檔案,users.conf包含你的本機使用者,services.conf包含各種服務-例如會議系統。使用這個方法,撥號方案可能更容易維護。#include<filename>聲明不同於include<context>聲明。#include聲明在所有的設定檔中都可以使用。
轉到其它的Asterisk
文法:
[iaxprovider]
switch=>IAX2/user:[key]@server/context
指定轉到其它的伺服器。user 和 key 需要在被呼入的伺服器的iax.conf檔案中定義。
context是被轉入的伺服器的extensions.conf檔案中的context.
例子: Asterisk - dual servers
從外部控制 extensions.conf
Asterisk extensions from mysql
所有的 .conf 檔案都可以使用 #include 聲明包含另一個.conf 檔案。
使用範例:
#include "my-extra-config-file"
[globals]
ALL= Zap/1&SIP/1000&SIP/1001
[default]
exten=>s,1,Answer
exten=>s,2,Playback(welcome-message)
exten=>s,3,Goto(context-in-include-file,s,1) ;go to include 檔案中定義的 context
:
:
範例:
使用宏建立extension
[globals]
PHONE1=Zap/1
PHONE2=SIP/6002
[macro-oneline]
exten=>s,1,Dial(${ARG1},20,t)
exten=>s,2,Voicemail(u${MACRO_EXTEN})
exten=>s,3,Hangup
exten=>s,102,Voicemail(b${MACRO_EXTEN})
exten=>s,103,Hangup
[local]
exten=>6601,1,Macro(oneline,${PHONE1})
exten=>6602,1,Macro(oneline,${PHONE2})