基于Android的VoIP系統(tǒng)設(shè)計(jì)
本文提出一種基于PJSIP協(xié)議棧的解決方案,通過(guò)Android本地開(kāi)發(fā)工具(NDK),實(shí)現(xiàn)一個(gè)高效、穩(wěn)定且功能強(qiáng)大的VoIP系統(tǒng),具有較高的參考和實(shí)用價(jià)值。
1 VoIP設(shè)計(jì)方案
1.1 設(shè)計(jì)目標(biāo)
本方案所設(shè)計(jì)的系統(tǒng)包含以下功能:首先,完成用戶終端(如手機(jī))中語(yǔ)音數(shù)據(jù)的采集與編碼,并通過(guò)RTP(實(shí)時(shí)傳輸協(xié)議)/RTCP(RTP傳輸控制協(xié)議)進(jìn)行傳輸和控制;其次,完成會(huì)話的控制,包括會(huì)話的注冊(cè)、發(fā)起、維護(hù)與結(jié)束、注銷等;再次,作為一個(gè)應(yīng)用程序,必須實(shí)現(xiàn)一個(gè)良好的界面,與用戶交互;最后,作為一個(gè)開(kāi)放系統(tǒng),需具有良好的可擴(kuò)展性。
1.2 總體設(shè)計(jì)
本方案基本上符合Android的NDK框架的開(kāi)發(fā)規(guī)范,將系統(tǒng)分為4層,如圖1所示。最上層為應(yīng)用層,該層將在Android SDK的框架內(nèi),采用Java語(yǔ)言來(lái)實(shí)現(xiàn);第二層為JNI層,SIP協(xié)議棧有很多種實(shí)現(xiàn),其中,采用C語(yǔ)言的SIP協(xié)議棧在效率、速度、系統(tǒng)占用方面有著超越其他庫(kù)(如Java協(xié)議棧)的優(yōu)勢(shì),因此,該方案將在第三層采用純C語(yǔ)言實(shí)現(xiàn)的PJSIP協(xié)議棧。為了讓Java應(yīng)用層能調(diào)用協(xié)議棧層,在兩層之間需要一個(gè)銜接的橋梁,這就是JNI層。最后一層是驅(qū)動(dòng)層,這部分一般是由手機(jī)廠商來(lái)實(shí)現(xiàn)的,本文將不做重點(diǎn)介紹。
?
2 VoIP的具體實(shí)現(xiàn)
這里將實(shí)現(xiàn)一個(gè)完整的VoIP系統(tǒng),包括協(xié)議棧的實(shí)現(xiàn)、JNI的編寫(xiě)以及上層UI的設(shè)計(jì)實(shí)現(xiàn)等。
2.1 SIP協(xié)議棧及UA
SIP協(xié)議棧直接關(guān)系到整個(gè)系統(tǒng)的質(zhì)量與效率,本文將采用純C語(yǔ)言開(kāi)發(fā)的PJSIP庫(kù)。該庫(kù)采用C語(yǔ)言開(kāi)發(fā),且源碼開(kāi)放,在兼容性與效率上有明顯優(yōu)勢(shì),不僅體積小(完整的SIP封裝也不過(guò)150 KB),同時(shí)還實(shí)現(xiàn)了一個(gè)內(nèi)存池,使得安全系數(shù)與運(yùn)行效率大為提高,該系統(tǒng)所采用的就是優(yōu)化后的PJSIP庫(kù)。
2.1.1 PJSIP協(xié)議棧
PJSIP協(xié)議棧遵循標(biāo)準(zhǔn)的SIP協(xié)議,采用分層架構(gòu):SIP/SDP消息編碼解析層、傳輸管理層、SIP終端、事務(wù)層、會(huì)話層以及應(yīng)用層等。由于SIP協(xié)議采用文本消息發(fā)送請(qǐng)求和響應(yīng),所以首先需要將SIP消息按照巴斯克范式(ABNF)編碼和解析,這就是SIP/SDP消息編碼解析層所完成的功能。傳輸管理層用來(lái)管理用戶代理與服務(wù)器之間的請(qǐng)求和相應(yīng);SIP終端是PJSIP中轉(zhuǎn)機(jī)制的實(shí)現(xiàn),它主要負(fù)責(zé)管理各個(gè)SIP組建,例如像SIP終端實(shí)例注冊(cè)組件,分發(fā)消息到事務(wù)層、會(huì)話層及應(yīng)用層,回傳處理結(jié)果,管理定時(shí)器、I/O隊(duì)列等;事務(wù)層通過(guò)狀態(tài)機(jī)機(jī)制管理SIP信令,每一次狀態(tài)機(jī)狀態(tài)的改變都將觸發(fā)回調(diào)函數(shù);會(huì)話層負(fù)責(zé)會(huì)話的發(fā)起與響應(yīng),一般與應(yīng)用層結(jié)合在一起,用于用戶交互,不同的平臺(tái)有不同的實(shí)現(xiàn),本文使用Andriod的GUI來(lái)實(shí)現(xiàn)。
PJSIP是一個(gè)高度封裝的庫(kù),實(shí)際上它是通過(guò)PJSUA子庫(kù)來(lái)實(shí)現(xiàn)應(yīng)用的。一個(gè)完整的PJSUA生命周期,首先需要初始化,通過(guò)函數(shù)init()來(lái)實(shí)現(xiàn)。在這個(gè)函數(shù)中,將創(chuàng)建代理、初始化變量和堆棧,以及創(chuàng)建一個(gè)UDP傳輸并在最后啟動(dòng)代理;第二步將為UA添加用戶,如果需要的話,還要向服務(wù)器注冊(cè)用戶;當(dāng)用戶添加成功后,此時(shí)可以建立一個(gè)呼叫連接,發(fā)起會(huì)話;當(dāng)會(huì)話連接成功后,就可以使用SRTP協(xié)議實(shí)時(shí)傳輸加密后的數(shù)據(jù),進(jìn)行通話。最后的過(guò)程是掛起或銷毀呼叫。
2.1.2 UA原理
UA(User Agency)是協(xié)議棧的具體實(shí)現(xiàn),PJSIP通過(guò)封裝了的PJSUA來(lái)實(shí)現(xiàn),在這一點(diǎn)上,大部分的SIP庫(kù)都大同小異,在此將介紹UA的工作原理。
一個(gè)典型的UA包含UAC(User Agency Client)和UAS(User Agency Server)兩部分。會(huì)話由UAC發(fā)起。當(dāng)呼叫發(fā)起時(shí),UAC將首先發(fā)送“IN-VITE”消息給SIP代理服務(wù)器,服務(wù)器收到“INVITE”消息后將返回一個(gè)應(yīng)答“200 OK”,并回答“ACK”進(jìn)行確認(rèn),同時(shí)通知主叫用戶(即會(huì)話發(fā)起用戶)上線通話。如果主叫端(用戶端)主動(dòng)結(jié)束會(huì)話,UAC將返回“BYE”消息,同時(shí)通知服務(wù)器;如果用戶端收到服務(wù)器傳來(lái)的“BY-E”消息,回答“200”,并結(jié)束會(huì)話。
服務(wù)器端,UAS收到UAC(用戶端)發(fā)來(lái)的“INVITE”消息,首先從消息中提取出主、被叫對(duì)象,然后檢查當(dāng)前是否有空閑信道,若沒(méi)有則返回“486 BUSY HERE”(即系統(tǒng)忙)消息;接著將檢查被叫用戶是否在服務(wù)區(qū),如果被叫對(duì)象不在服務(wù)范圍,則返回“404 NOT FOUND”(即用戶不在服務(wù)區(qū));若被叫用戶成功上線,則返回“200 OK”,同時(shí)準(zhǔn)備開(kāi)始會(huì)話。
SIP協(xié)議棧一般使用SIP統(tǒng)一資源定位符(URL)來(lái)標(biāo)識(shí),它根據(jù)URL來(lái)尋址,如集群用戶“200”,“300”分別對(duì)應(yīng)SIP用戶為“200@192.168. 1.100”,“300@192.168.1.100”。本文中也使用這種方式來(lái)測(cè)試通信。
2.2 JNI的實(shí)現(xiàn)
PJSIP庫(kù)和Java類連接是通過(guò)JNI來(lái)實(shí)現(xiàn)的,這也是Android NDK的實(shí)現(xiàn)機(jī)制,JNI是SUN公司推出的用于Java調(diào)用其他語(yǔ)言的接口。
首先需要一個(gè)中間類,這個(gè)類中主要建立一些方法用于調(diào)用C/C++本地函數(shù)。它們的類型均為“publicstatic native int”,以便其他的Java類能夠調(diào)用。
非常好我支持^.^
(1) 100%
不好我反對(duì)
(0) 0%
相關(guān)閱讀:
- [電子說(shuō)] 社區(qū)說(shuō)|多才多藝: 探索 Android 應(yīng)用更多可能 2023-10-24
- [電子說(shuō)] 浩辰軟件正式登陸上交所科創(chuàng)板 2023-10-23
- [電子說(shuō)] 鴻蒙原生應(yīng)用,對(duì)開(kāi)發(fā)者意味著什么? 2023-10-22
- [電子說(shuō)] Android端自定義鈴聲 MobPush對(duì)安卓端自定義鈴聲的教程 2023-10-21
- [電子說(shuō)] Android推送問(wèn)題排查技巧 針對(duì)MobPush安卓端推送問(wèn)題的解決辦法 2023-10-21
- [電子說(shuō)] 如何使用Proxyman抓取Android的https請(qǐng)求? 2023-10-19
- [編程語(yǔ)言及工具] 基于OkHttp 3.10.0的源碼案例解析 2023-10-17
- [電子說(shuō)] 基于MacroBenchmark的性能測(cè)試量化指標(biāo)方案 2023-10-17
( 發(fā)表人:Spring )