基于A(yíng)sterisk的VoIP開(kāi)發(fā)指南——Asterisk模塊編寫(xiě)指南
2008/06/12
1.開(kāi)源項目概述圖1 Asterisk結構圖
2.Asterisk二次開(kāi)發(fā)概述
Asterisk是一個(gè)開(kāi)源的PBX架構;但它并不是一個(gè)成品。通常情況下,由于企業(yè)應用的多樣性,很難有一個(gè)成型的PBX產(chǎn)品可以滿(mǎn)足企業(yè)的各種需求。傳統的PBX成品,要么功能和靈活性不足,要么配置和維護復雜;而且都具有一個(gè)致命的缺點(diǎn),那就是開(kāi)放性、可擴展性。
Asterisk具有傳統PBX無(wú)法比擬的優(yōu)點(diǎn),那就是其靈活性,可擴展能力;Asterisk的擴展能力是通過(guò)開(kāi)放相應的架構和接口來(lái)實(shí)現的。這就意味著(zhù)Asterisk是一個(gè)組件而不是一個(gè)成型的產(chǎn)品,Asterisk的核心提供了一個(gè)基本的可運行環(huán)境,而外圍相應的能力則可以通過(guò)加載和配置相關(guān)的插件和模塊來(lái)實(shí)現。
Asterisk是一個(gè)開(kāi)源的PBX架構;但它并不是一個(gè)成品。Asterisk的擴展能力是通過(guò)開(kāi)放相應的架構和接口來(lái)實(shí)現的。這就意味著(zhù)Asterisk是一個(gè)組件而不是一個(gè)成型的產(chǎn)品,Asterisk的核心提供了一個(gè)基本的可運行環(huán)境,而外圍相應的能力則可以通過(guò)加載和配置相關(guān)的插件和模塊來(lái)實(shí)現。
因此,使用Asterisk,一定會(huì )面臨二次開(kāi)發(fā)問(wèn)題,這些二次開(kāi)發(fā)主要圍繞以下幾個(gè)方面:
(1)內部核心模塊
圖2 Asterisk PBX呼叫流程
4.RADIUS協(xié)議的概述
(1)Radius協(xié)議在協(xié)議棧中的位置
Radius是一種流行的AAA協(xié)議,同時(shí)其采用的是UDP協(xié)議傳輸模式,AAA協(xié)議在協(xié)議棧中位置如圖3所示。
圖3 Radius協(xié)議在協(xié)議棧中的位置
(2)Radius協(xié)議選擇UDP作為傳輸層協(xié)議
5.認證計費功能概述
IP-PBX呼叫控制功能,主要是VoIP終端用戶(hù)的認證計費控制過(guò)程,是VoIP系統商業(yè)化運營(yíng)的核心模塊。
Radius Client端,也叫NAS,主要的任務(wù)就是根據VoIP終端的呼叫請求攜帶的各種屬性,包括賬戶(hù)ID、被叫號碼、通話(huà)時(shí)間等,封裝成標準的Radius數據包發(fā)送到Radius
Server端,達到賬戶(hù)信息實(shí)時(shí)更新的效果。整個(gè)NAS端程序主要由兩個(gè)模塊構成:認證模塊和計費模塊,并把這兩個(gè)模塊整合到開(kāi)源IP-PBX項目
Asterisk中。
5.1 標準RADIUS協(xié)議分析
(1)Radius Packet
RADIUS數據包被包裝在UDP數據報的數據塊(Data field))中,其中的目的端口為1812,RADIUS協(xié)議包結構如圖4所示。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attributes ...(不定長(cháng))
+-+-+-+-+-+-+-+-+-+-+-+-+-
Attribute:
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Value …(不定長(cháng))
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
圖4 RADIUS協(xié)議包結構圖
(2)對Radius Packet格式各個(gè)域解釋
Code:包類(lèi)型,一個(gè)字節長(cháng),指示RADIUS包的類(lèi)型,包含不合法的Code的Radius包將被直接丟棄,code域主要包含了以下值類(lèi)型。
1)code=1 Access-Request——認證請求數據包
本文AAA功能就是構建code=1的認證請求數據包。
2)code=2 Access-Accept——認證響應數據包
3) code=3 Access-Reject——認證拒絕數據包
4)code=4 Accounting-Request——計費請求數據包
本文Asterisk的AAA功能另外一個(gè)重點(diǎn)任務(wù)就是構建code=4的計費請求數據包,Accounting-Request
數據包中的兩種狀態(tài)類(lèi)型(Acct-Status-Type)的計費請求數據包:Start(Value=1):Client開(kāi)始對指定用戶(hù)提供服務(wù),計費開(kāi)始;Stop(Value=2):Client停止對指定用戶(hù)提供服務(wù),計費結束。
5)code=5 Accounting-Response——計費響應數據包
因為是要更新賬戶(hù)信息,所以目前本文不需要處理計費響應數據包。
Identifier:包標識符,一個(gè)字節長(cháng),用于匹配請求包和響應包,同一組請求包和響應包的Identifier應相同。協(xié)議規定:
1) 在任何時(shí)間,發(fā)給同一個(gè)RADIUS服務(wù)器的不同包的Identifier域不能相同,如果出現相同的情況,RADIUS將認為后一個(gè)包是前一個(gè)包的拷貝而不對其進(jìn)行處理。
2) Radius針對某個(gè)請求包的響應包應與該請求包在Identifier上相匹配(相同)。
Length:包長(cháng)度,兩個(gè)字節長(cháng),說(shuō)明數據包的長(cháng)度,是code、identifier、length、authenticator
attribute fields的長(cháng)度總和,有效范圍是20~4096,超出范圍的數據將被視為附加數據(Padding)或直接被忽略。
Authenticator:驗證字,16字節長(cháng),用于驗證消息的負載,對包進(jìn)行簽名,該驗證字分為兩種。
1) 請求驗證字---Request Authenticator,用在請求報文中,必須為全局唯一的隨機值。
2) 響應驗證字---Response Authenticator,用在響應報文中,用于鑒別響應報文的合法性。響應驗證字=MD5(Code+ID+Length+請求驗證字+Attributes+Key)。
Attributes:Type指示了Atribute的類(lèi)型,通用的有幾十種,在系統中使用到的,如表4.1所示。Asterisk
AAA模塊的構建主要是構建表1列出的這些屬性值的RADIUS數據包。
表1 Atribute的屬性列表
屬性值 |
|
屬性意義 |
1 |
User-Name |
用戶(hù)賬戶(hù)ID |
2 |
User-Password |
用戶(hù)密碼 |
4 |
Nas-IP-Address |
Nas的ip地址 |
5 |
Nas-Port |
用戶(hù)接入端口號 |
6 |
Service-Type |
服務(wù)類(lèi)型 |
7 |
Framed-Protocol |
協(xié)議類(lèi)型 |
8 |
Framed-IP-Address |
為用戶(hù)提供的IP地址 |
11 |
Filter-Id |
過(guò)濾表的名稱(chēng) |
27 |
Session-Timeout |
通知NAS該用戶(hù)可用的會(huì )話(huà)時(shí)長(cháng) (時(shí)長(cháng)預付費) |
32 |
NAS-Identifier |
標識NAS的字符串 |
40 |
Acct-Status-Type |
計費請求報文的類(lèi)型 |
41 |
Acct-Delay-Time |
Radius客戶(hù)端發(fā)送計費報文耗費的時(shí)間 |
44 |
Acct-Session-Id |
計費會(huì )話(huà)標識 |
45 |
Acct-Authentic |
在計費包中標識用戶(hù)認證通過(guò)的方式 |
46 |
Acct-Session-Time |
通話(huà)時(shí)長(cháng)(用戶(hù)在線(xiàn)時(shí)長(cháng)) |
49 |
Acct-Terminate-Case |
|
5.2 選擇一個(gè)合適的Radius Client API
上個(gè)小節介紹的RADIUS數據包格式,是構建應用協(xié)議層數據包的封裝所關(guān)注的,在A(yíng)sterisk中如果需要親自把標準RADIUS數據包的發(fā)送、接收等過(guò)程從零開(kāi)始寫(xiě)起,那本文就把重點(diǎn)放在了RADIUS
UDP數據包與服務(wù)器通信過(guò)程的編寫(xiě)中了,實(shí)際本文關(guān)注的是在A(yíng)sterisk中根據VoIP通信中的業(yè)務(wù)需求,構建RADIUS認證計費模塊,重點(diǎn)是業(yè)務(wù)應用層的開(kāi)發(fā),即如何組織認證包、計費包的數據結構等,而RADIUS數據包傳輸層直接調用現成的開(kāi)源API,目前主要有兩種這樣的開(kāi)源項目。
(1)pam_radius
一個(gè)PAM模塊提供了RADIUS客戶(hù)端的功能。它是從開(kāi)源項目Freeradius中提取出來(lái)的,如果要使用需要對代碼做大量的修改、打補丁后才能使用。
(2)radiusclient-ng
相對比PAM的pam_radius模塊而言,radiusclient-ng的動(dòng)態(tài)庫代碼不用修改就可以拿過(guò)來(lái)使用,只需安裝radiusclient-ng的動(dòng)態(tài)庫,然后根據配置文件、開(kāi)放的API接口修改Asterisk代碼就可以完成Asterisk
AAA模塊的構建。
所以在本文使用radiusclient-ng開(kāi)源軟件包。
基于A(yíng)sterisk的VoIP開(kāi)發(fā)指南—實(shí)現基本呼叫功能 2008-06-12 |
基于A(yíng)sterisk的VoIP開(kāi)發(fā)—Asterisk AGI程序編寫(xiě)指南 2008-06-12 |
無(wú)線(xiàn)IPPBX系統的設計與實(shí)現 2008-06-12 |
淺論美國寬帶電話(huà)(VOIP)監管的新動(dòng)向 2008-06-11 |
網(wǎng)絡(luò )電話(huà)(VoIP)成功應用美軍軍事系統 2008-06-06 |