<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 基于A(yíng)ndroid的VoIP系統的設計與實(shí)現

基于A(yíng)ndroid的VoIP系統的設計與實(shí)現

作者: 時(shí)間:2011-04-21 來(lái)源:網(wǎng)絡(luò ) 收藏


2 的具體
這里將一個(gè)完整的,包括協(xié)議棧的、JNI的編寫(xiě)以及上層UI的實(shí)現等。
2.1 SIP協(xié)議棧及UA
SIP協(xié)議棧直接關(guān)系到整個(gè)的質(zhì)量與效率,本文將采用純C語(yǔ)言開(kāi)發(fā)的PJSIP庫。該庫采用C語(yǔ)言開(kāi)發(fā),且源碼開(kāi)放,在兼容性與效率上有明顯優(yōu)勢,不僅體積小(完整的SIP封裝也不過(guò)150 KB),同時(shí)還實(shí)現了一個(gè)內存池,使得安全系數與運行效率大為提高,該所采用的就是優(yōu)化后的PJSIP庫。
2.1.1 PJSIP協(xié)議棧
PJSIP協(xié)議棧遵循標準的SIP協(xié)議,采用分層架構:SIP/SDP消息編碼解析層、傳輸管理層、SIP終端、事務(wù)層、會(huì )話(huà)層以及應用層等。由于SIP協(xié)議采用文本消息發(fā)送請求和響應,所以首先需要將SIP消息按照巴斯克范式(ABNF)編碼和解析,這就是SIP/SDP消息編碼解析層所完成的功能。傳輸管理層用來(lái)管理用戶(hù)代理與服務(wù)器之間的請求和相應;SIP終端是PJSIP中轉機制的實(shí)現,它主要負責管理各個(gè)SIP組建,例如像SIP終端實(shí)例注冊組件,分發(fā)消息到事務(wù)層、會(huì )話(huà)層及應用層,回傳處理結果,管理定時(shí)器、I/O隊列等;事務(wù)層通過(guò)狀態(tài)機機制管理SIP信令,每一次狀態(tài)機狀態(tài)的改變都將觸發(fā)回調函數;會(huì )話(huà)層負責會(huì )話(huà)的發(fā)起與響應,一般與應用層結合在一起,用于用戶(hù)交互,不同的平臺有不同的實(shí)現,本文使用Andriod的GUI來(lái)實(shí)現。
PJSIP是一個(gè)高度封裝的庫,實(shí)際上它是通過(guò)PJSUA子庫來(lái)實(shí)現應用的。一個(gè)完整的PJSUA生命周期,首先需要初始化,通過(guò)函數init()來(lái)實(shí)現。在這個(gè)函數中,將創(chuàng )建代理、初始化變量和堆棧,以及創(chuàng )建一個(gè)UDP傳輸并在最后啟動(dòng)代理;第二步將為UA添加用戶(hù),如果需要的話(huà),還要向服務(wù)器注冊用戶(hù);當用戶(hù)添加成功后,此時(shí)可以建立一個(gè)呼叫連接,發(fā)起會(huì )話(huà);當會(huì )話(huà)連接成功后,就可以使用SRTP協(xié)議實(shí)時(shí)傳輸加密后的數據,進(jìn)行通話(huà)。最后的過(guò)程是掛起或銷(xiāo)毀呼叫。
2.1.2 UA原理
UA(User Agency)是協(xié)議棧的具體實(shí)現,PJSIP通過(guò)封裝了的PJSUA來(lái)實(shí)現,在這一點(diǎn)上,大部分的SIP庫都大同小異,在此將介紹UA的工作原理。
一個(gè)典型的UA包含UAC(User Agency Client)和UAS(User Agency Server)兩部分。會(huì )話(huà)由UAC發(fā)起。當呼叫發(fā)起時(shí),UAC將首先發(fā)送“IN-VITE”消息給SIP代理服務(wù)器,服務(wù)器收到“INVITE”消息后將返回一個(gè)應答“200 OK”,并回答“ACK”進(jìn)行確認,同時(shí)通知主叫用戶(hù)(即會(huì )話(huà)發(fā)起用戶(hù))上線(xiàn)通話(huà)。如果主叫端(用戶(hù)端)主動(dòng)結束會(huì )話(huà),UAC將返回“BYE”消息,同時(shí)通知服務(wù)器;如果用戶(hù)端收到服務(wù)器傳來(lái)的“BY-E”消息,回答“200”,并結束會(huì )話(huà)。
服務(wù)器端,UAS收到UAC(用戶(hù)端)發(fā)來(lái)的“INVITE”消息,首先從消息中提取出主、被叫對象,然后檢查當前是否有空閑信道,若沒(méi)有則返回“486 BUSY HERE”(即系統忙)消息;接著(zhù)將檢查被叫用戶(hù)是否在服務(wù)區,如果被叫對象不在服務(wù)范圍,則返回“404 NOT FOUND”(即用戶(hù)不在服務(wù)區);若被叫用戶(hù)成功上線(xiàn),則返回“200 OK”,同時(shí)準備開(kāi)始會(huì )話(huà)。
SIP協(xié)議棧一般使用SIP統一資源定位符(URL)來(lái)標識,它根據URL來(lái)尋址,如集群用戶(hù)“200”,“300”分別對應SIP用戶(hù)為“200@192.168. 1.100”,“300@192.168.1.100”。本文中也使用這種方式來(lái)測試通信。
2.2 JNI的實(shí)現
PJSIP庫和Java類(lèi)連接是通過(guò)JNI來(lái)實(shí)現的,這也是 NDK的實(shí)現機制,JNI是SUN公司推出的用于Java調用其他語(yǔ)言的接口。
首先需要一個(gè)中間類(lèi),這個(gè)類(lèi)中主要建立一些方法用于調用C/C++本地函數。它們的類(lèi)型均為“publicstatic native int”,以便其他的Java類(lèi)能夠調用。
2.2.1 新建PJSIP類(lèi)
為各個(gè)待實(shí)現的類(lèi)新建一個(gè)包,可以命名為“com.a(chǎn)ndroid.voip.pjsip”,在該包中添加該系統相關(guān)的一些類(lèi),主要有如下6個(gè)類(lèi):
b.JPG
這些類(lèi)分別為上節中原理各個(gè)步驟的實(shí)現。這部分僅僅是為C庫的調用提供一個(gè)接口,因此具體的實(shí)現將放在本地C/C++程序中。

本文引用地址:http://dyxdggzs.com/article/156376.htm



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>