1. 程式人生 > >基於Asterisk的VoIP開發指南——Asterisk 模組編寫指南(1)

基於Asterisk的VoIP開發指南——Asterisk 模組編寫指南(1)

1 開源專案概述

Asterisk是一個開源的軟體包,通常執行在Linux作業系統平臺上。Asterisk可以用三種協議來實現VoIP,同時可以與目前電話使用的標準硬體進行互動通訊,Asterisk在實現VoIP時,不需要任何附加硬體,本文所採用的也是這種使用方式。但是,如果企業沒有與VoIP語音閘道器運營商建立合作關係,想要自己構建這樣的一個平臺,那麼要和數字電話裝置與模擬電話裝置進行互動通訊,Asterisk需要一個PCI硬體的支援,這個硬體生產商中最著名的是Digium平臺提供的。

Asterisk 的結構基本上是十分簡單,但是它不同於大多數的電話產品。基本上,Asterisk擔任的是一箇中間件的功能,它連線了底層的電話技術和上層的電話應用。所以,Asterisk

具有很大的柔韌性,特殊的API介面都圍繞著PBX核心系統。這個核心處理著PBX內部之間的相互聯絡。每一部分都是清晰來自於協議、編碼或內部電話使用的硬體介面的抽象。這些抽象的介面使Asterisk可以與任何的硬體和技術以及將來的硬體和軟體技術完美的結合。從圖2.5可以看出,Asterisk由內部核心和外圍動態可載入模組組成。內部核心由以下六個部分組成:PBX交換核心模組(PBX Switching Core)、排程和I/O管理模組(Scheduler and I/O Manager)、應用呼叫模組(Application Launcher)、編解碼轉換模組(Codec Translator)、動態模組載入器模組(Dynamic Module Loader)
CDR生成模組(CDR Core)

1 Asterisk結構圖

2Asterisk二次開發概述

Asterisk是一個開源的PBX架構;但它並不是一個成品。通常情況下,由於企業應用的多樣性,很難有一個成型的PBX產品可以滿足企業的各種需求。傳統的PBX成品,要麼功能和靈活性不足,要麼配置和維護複雜;而且都具有一個致命的缺點,那就是開放性、可擴充套件性。

 Asterisk具有傳統PBX無法比擬的優點,那就是其靈活性,可擴充套件能力;Asterisk的擴充套件能力是通過開放相應的架構和介面來實現的。這就意味著Asterisk是一個元件而不是一個成型的產品,Asterisk的核心提供了一個基本的可執行環境,而外圍相應的能力則可以通過載入和配置相關的外掛和模組來實現。

Asterisk是一個開源的PBX架構;但它並不是一個成品。Asterisk的擴充套件能力是通過開放相應的架構和介面來實現的。這就意味著Asterisk是一個元件而不是一個成型的產品,Asterisk的核心提供了一個基本的可執行環境,而外圍相應的能力則可以通過載入和配置相關的外掛和模組來實現。

因此,使用Asterisk,一定會面臨二次開發問題,這些二次開發主要圍繞以下幾個方面:

1)內部核心模組

開發擴充套件編解碼能力模組

開發擴充套件相應的通道模組

2外圍動態可載入模組

開發應用部分

開發外圍管理部分

一般來說,Asterisk使用者很少需要去開發編解碼能力模組和通道模組等內部核心模組;而需要開發最多的情況則是外圍動態可載入模組,即外圍管理部分和應用開發,本文也是指這些方面的開發。

3Asterisk通道模型與呼叫流程

3.1 什麼是asterisk通道?

Asterisk通道是指通過asterisk建立起來的一路通話。這類通話都包含一個incoming連線和一個outbound連線。每個電話都是通過一種通道驅動程式建立起來的,比如SIP,ZAP,IAX2等等。每一類的通道驅動,都擁有自己私有的通道資料結構,這些私有的結構從屬於一個通用的Asterisk通道資料結構中,具體定義在channel.hchannel.c中。

3.2 基本的呼叫流程

Asterisk PBX呼叫流程如圖3所示。

1)通過Asterisk的一個電話呼叫在一個通道驅動介面上到達,如SIP Socket

2)通道驅動在該通道上建立一個PBX通道並啟動一個pbx執行緒

3)撥號方案被執行,撥號方案在一些地方通過dial應用(檢視app_dial.c)

強制Asterisk建立一個撥出呼叫,一旦撥出,Asterisk會有以下兩個動作將發生。

1Dial建立一個撥出的PBX通道並請求一種通道驅動建立一個呼叫

2)當呼叫被應答時,Asterisk橋接媒體流,於是在第一個通道上的主叫可以和在第

二個通道也就是撥出通道上的被叫通話。

                                     圖3 Asterisk PBX呼叫流程

4 RADIUS協議的概述

1Radius協議在協議棧中的位置

Radius是一種流行的AAA協議,同時其採用的是UDP協議傳輸模式,AAA協議在協議棧中位置如圖3所示。

3 Radius協議在協議棧中的位置

2Radius協議選擇UDP作為傳輸層協議

NASRadius伺服器之間傳遞的是幾十上百個位元組長度的資料,且Radius要求特別的定時器管理機制,使用者可以容忍幾十秒的驗證等待時間。

②當處理大量使用者,伺服器端採用多執行緒,UDP簡化了伺服器端的實現過程。

TCP是必須成功建立連線後才能進行資料傳輸的,這種方式在有大量使用者使用的情況下實時性不好。Radius要有重傳機制和備用伺服器機制,它所採用的定時,TCP不能很好的滿足。由於資料包可能會在網路上丟失,如果客戶沒有收到響應,那麼可以重新發送該請求包。多次傳送之後如果仍然收不到響應,RADIUS客戶可以向備用的RADIUS伺服器傳送請求包。

Radius依靠自身協議保證報文重傳和伺服器備份機制以確保計費可靠性。

5 認證計費功能概述

IP-PBX呼叫控制功能,主要是VoIP終端使用者的認證計費控制過程,是VoIP系統商業化運營的核心模組。

Radius Client端,也叫NAS,主要的任務就是根據VoIP終端的呼叫請求攜帶的各種屬性,包括賬戶ID、被叫號碼、通話時間等,封裝成標準的Radius資料包傳送到Radius Server端,達到賬戶資訊實時更新的效果。整個NAS端程式主要由兩個模組構成:認證模組和計費模組,並把這兩個模組整合到開源IP-PBX專案 Asterisk中。

5.1 標準RADIUS協議分析

1Radius Packet

RADIUS資料包被包裝在UDP資料報的資料塊(Data field))中,其中的目的埠為1812RADIUS協議包結構如圖4所示。

0123

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 ...(不定長)

+-+-+-+-+-+-+-+-+-+-+-+-+-

Attribute

012

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|Type|Length |Value …(不定長)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4RADIUS協議包結構圖

2)對Radius Packet格式各個域解釋

Code:包型別,一個位元組長,指示RADIUS包的型別,包含不合法的CodeRadius包將被直接丟棄,code域主要包含了以下值型別。

1code=1Access-Request——認證請求資料包

本文AAA功能就是構建code1的認證請求資料包。

2code=2Access-Accept——認證響應資料包

3) code=3Access-Reject——認證拒絕資料包

4code=4Accounting-Request——計費請求資料包

本文AsteriskAAA功能另外一個重點任務就是構建code=4的計費請求資料包,Accounting-Request 資料包中的兩種狀態型別(Acct-Status-Type)的計費請求資料包:StartValue=1):Client開始對指定使用者提供服務,計費開始;StopValue=2):Client停止對指定使用者提供服務,計費結束。

5code=5Accounting-Response——計費響應資料包

因為是要更新賬戶資訊,所以目前本文不需要處理計費響應資料包。

Identifier:包識別符號,一個位元組長,用於匹配請求包和響應包,同一組請求包和響應包的Identifier應相同。協議規定:

1) 在任何時間,發給同一個RADIUS伺服器的不同包的Identifier域不能相同,如果出現相同的情況,RADIUS將認為後一個包是前一個包的拷貝而不對其進行處理。

2) Radius針對某個請求包的響應包應與該請求包在Identifier上相匹配(相同)。

Length:包長度,兩個位元組長,說明資料包的長度,是codeidentifierlengthauthenticator attribute fields的長度總和,有效範圍是20~4096,超出範圍的資料將被視為附加資料(Padding)或直接被忽略。

Authenticator:驗證字,16位元組長,用於驗證訊息的負載,對包進行簽名,該驗證字分為兩種。

1) 請求驗證字---Request Authenticator,用在請求報文中,必須為全域性唯一的隨機值。

2) 響應驗證字---Response Authenticator,用在響應報文中,用於鑑別響應報文的合法性。響應驗證字=MD5(Code+ID+Length+請求驗證字+Attributes+Key)

Attributes:Type指示了Atribute的型別,通用的有幾十種,在系統中使用到的,如表4.1所示。Asterisk AAA模組的構建主要是構建表1列出的這些屬性值的RADIUS資料包。

1 Atribute的屬性列表

屬性值

屬性名稱

屬性意義

1

User-Name

使用者賬戶ID

2

User-Password

使用者密碼

4

Nas-IP-Address

Nasip地址

5

Nas-Port

使用者接入埠號

6

Service-Type

服務型別

7

Framed-Protocol

協議型別

8

Framed-IP-Address

為使用者提供的IP地址

11

Filter-Id

過濾表的名稱

27

Session-Timeout

通知NAS該使用者可用的會話時長(時長預付費)

32

NAS-Identifier

標識NAS的字串

40

Acct-Status-Type

計費請求報文的型別

41

Acct-Delay-Time

Radius客戶端傳送計費報文耗費的時間

44

Acct-Session-Id

計費會話標識

45

Acct-Authentic

在計費包中標識使用者認證通過的方式

46

Acct-Session-Time

通話時長(使用者線上時長)

49

Acct-Terminate-Case

使用者下線原因

5.2選擇一個合適的Radius Client API

上個小節介紹的RADIUS資料包格式,是構建應用協議層資料包的封裝所關注的,在Asterisk中如果需要親自把標準RADIUS資料包的傳送、接收等過程從零開始寫起,那本文就把重點放在了RADIUS UDP資料包與伺服器通訊過程的編寫中了,實際本文關注的是在Asterisk中根據VoIP通訊中的業務需求,構建RADIUS認證計費模組,重點是業務應用層的開發,即如何組織認證包、計費包的資料結構等,而RADIUS資料包傳輸層直接呼叫現成的開源API,目前主要有兩種這樣的開源專案。

1pam_radius

一個PAM模組提供了RADIUS客戶端的功能。它是從開源專案Freeradius中提取出來的,如果要使用需要對程式碼做大量的修改、打補丁後才能使用。

2radiusclient-ng

相對比PAMpam_radius模組而言,radiusclient-ng的動態庫程式碼不用修改就可以拿過來使用,只需安裝radiusclient-ng的動態庫,然後根據配置檔案、開放的API介面修改Asterisk程式碼就可以完成Asterisk AAA模組的構建。

所以在本文使用radiusclient-ng開源軟體包。

相關推薦

基於Asterisk的VoIP開發指南——Asterisk 模組編寫指南(1)

1 開源專案概述 Asterisk是一個開源的軟體包,通常執行在Linux作業系統平臺上。Asterisk可以用三種協議來實現VoIP,同時可以與目前電話使用的標準硬體進行互動通訊,Asterisk在實現VoIP時,不需要任何附加硬體,本文所採用的也是這種使用方式。但是,如果

java安全編碼指南之:方法編寫指南

[toc] # 簡介 java程式的邏輯是由一個個的方法組成的,而在編寫方法的過程中,我們也需要遵守一定的安全規則,比如方法的引數進行校驗,不要在assert中新增業務邏輯,不要使用廢棄或者過期的方法,做安全檢查的方法一定要設定為private等。 今天我們再來深入的探討一下,java方法的編寫過程中還

基於Asterisk的VoIP開發指南(2)——Asterisk AGI程式編寫指南

5. Asterisk AGI程式編寫指南    5.1概述 很多時候,我們需要在撥號方案中做某些業務邏輯的判斷或者外部資料庫的查詢,根據具體地需要,有幾種做法: 1.使用Asterisk的通道變數、Goto函式、Gotoif函式等實現某些簡單跳轉,通過幾個這樣的函式的組合,實現簡單的業務。 2.對

開發筆記12 | Cloud Toolkit 外掛 Command 編寫指南

標準的 Java Web Tomcat 應用 如上圖所示,假設在 Linux 系統的 /root/tomcat/ 目錄下,放置了 Tomcat 的基目錄,因此我們需要將 Java Web 應用的 WAR 包部署到 /root/tomcat/webapps 目錄下去,對應的 Command 配置

Testbench編寫指南(3)模組化工程的模擬方法

Testbench編寫指南(3)模組化工程的模擬方法 文章轉自:https://blog.csdn.net/FPGADesigner/article/details/80816066 文章目錄 Testbench編寫指南(3)模組化工程的模擬方法

sqlmap-tamper編寫指南

pos firebird gre message nor quotes .py 代碼 內置 註:最近遇到了一些奇怪的waf,想自己寫一些tamper但是發現沒有參考材料可以使用,因此在寫了這篇文章,一方便進行自定義的tamper編寫。筆者筆力有限,如有錯誤,敬請讀者們指正。

通達OA應用中心使用手冊(腳本編寫指南)

cit ted 點擊 ble 計算 文本 ppp 必須 組合 腳本編寫必備基礎 1.1 什麽是腳本 腳本是一段 PHP 代碼,可以被應用中心執行以實現特定功能。應用中心支持通過腳本 實現以下功能: 自定義計算函數。 自定義提取觸發

windows基線編寫指南-powershell版

csdn copy event cedit off https error ping 讀取配置 前言: 因為工作的原因,要寫windows下的基線檢查腳本。之前沒接觸過,在網上找了半天也沒找到現成的,無奈只好自己研究,最後還是成功完成了工作。 在我編寫之後發現wi

web程序員開發以太坊入門指南

字符 函數調用 每次 asus 員工 建議 自定義 var data Web工程師以太坊入門 我經常構建使用以太坊的Web應用程序,我理所當然地認為每天都使用的是神奇的工具集。我們的生態系統正在迅速發展,我認為很多新人都感到不知所措。以太坊是一項了不起的技術,但它也是新生的

Testbench編寫指南(2)檔案的讀寫操作

Testbench編寫指南(2)檔案的讀寫操作 2018年05月27日 17:36:13 FPGADesigner 閱讀數:996 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/FPGADesigner/article/

[轉載] Html Email 郵件html頁編寫指南

Html Email 郵件html頁編寫指南 前言 寫過郵件的html的童學應該都知道,郵件的html一般都用table來佈局,為什麼呢?原因是大多數的郵件客戶端(比如Outlook和Gmail),會過濾HTML設定,讓郵件面目全非。 經過多次的郵件編寫實踐及度孃的指導,我發現,編寫HT

25 【python入門指南】如何編寫測試程式碼

python如何編寫測試程式碼 python內建了unittest,使得寫應用層的單元測試變得超乎尋常的簡單。   1,執行單個測試函式 #!/bin/python import unittest class TestMathFunc(unittest.TestCase):

25 【python入門指南】如何編寫測試代碼

case 函數名 assert 編寫 run http min ner 集中管理 python如何編寫測試代碼 python內置了unittest,使得寫應用層的單元測試變得超乎尋常的簡單。 1,執行單個測試函數 #!/bin/python impor

i.mx6ul linux驅動開發基於Device tree機制的驅動編寫

前言 Device Tree是一種用來描述硬體的資料結構,類似板級描述語言,起源於OpenFirmware(OF)。在目前廣泛使用的Linux kernel 2.6.x版本中,對於不同平臺、不同硬體,往往存在著大量的不同的、移植性差的板級描述程式碼,以達到對這些不同平臺和不同硬體特殊適配的需求

基於Arduino開發板使用HC-12遠端無線通訊模組

在本篇文章中,我們將學習如何使用HC-12無線序列通訊模組,該模組能夠在多個Arduino開發板之間進行遠端無線通訊,距離可達1.8km。其中,我列舉了兩個基本的例子,來解釋瞭如何連線HC-12模組並在兩個Arduinos之間進行基本通訊,另外一個例子是通過使用第一個Arduino開發板

《Python程式設計從入門到實踐》記錄之函式編寫指南

在函式編寫時,注意以下幾個細節: 採用文件字串格式(三引號括起來)給函式指定描述性名稱,且只在其中使用小寫zi即和下劃線 如果函式定義長度超過了79字元(PEP8建議長度),可在函式定義中輸入左括號後按回車鍵,並在下一行按兩次Tab鍵,從而將形參列表和只縮排一層的函式體區

preprocessing資料預處理模組使用指南

preprocessing 是sklearn庫的一個數據預處理模組,它提供了一些實用的資料預處理函式和預處理類。下邊就對這些功能進行一些簡單介紹,輔以一些例項,便於大家理解。 安裝: pip install scikit-learn 模組匯入並簡記為sp: import

基於Mycat分散式MySQL資料庫部署實踐指南

Mycat 是一款基於Java開發的開源資料庫中介軟體,是分散式資料庫架構的可選方案。 MySQL、CentOS、Mycat、Java 版本號分別是: # mysql mysql> select version(); +------------+ | version() | +-

python pymssql — pymssql模組使用指南

前言 最近在學習python,發現好像沒有對pymssql的詳細說明,於是乎把官方文件學習一遍,重要部分做個歸檔,方便自己以後查閱。 pymssql是python用來連線Microsoft SQL Server的一個工具庫(package)。其包含兩個模組:

高通camera模組驅動指南資料介紹

本資料提供了攝像機感測器和相關模組的驅動程式開發指南,並描述瞭如何在MSM 8909、MSM 8916、MSM 8992、MSM 8994和MSM8x36 Android平臺。 攝像機感測器框架包括以下元件的配置: Sensor CSIPHY CSID Camera Co