999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于SIP的嵌入式UA語音終端設(shè)計

2013-09-12 04:24:54沙愛軍沈衛(wèi)康毛其林
電子測試 2013年20期

沙愛軍,沈衛(wèi)康,毛其林

(南京工程學院通信工程學院,江蘇南京,211167)

0 引言

SIP(Session Initiation Protocol)會話初始協(xié)議,最新的SIP 規(guī)范為RFC 3261。作為應用層控制信令協(xié)議,SIP具有簡單、靈活的特點,正逐步取代H.323 協(xié)議成為 VoIP 的標準協(xié)議。

SIP 基于客戶機/服務器結(jié)構(gòu)。用戶代理(User Agent ),即SIP 終端,是SIP 系統(tǒng)中的最終用戶,可分為:用戶代理客戶端UAC,用于發(fā)起呼叫請求;用戶代理服務器UAS,用于響應呼叫請求,一個終端往往既可以充當UAC,也可以充當UAS。

在一個VoIP網(wǎng)絡(luò)中,UA作為終端設(shè)備,需求大,而且對移動便攜和價格也有要求。嵌入式設(shè)備具有便攜、專用、可裁剪、性價比等優(yōu)點,本文將在嵌入式平臺上實現(xiàn)一個基于SIP的的語音電話終端,并對系統(tǒng)實現(xiàn)中所需的關(guān)鍵技術(shù)和工作過程進行介紹。

1 UA實現(xiàn)框架

需求分析可知,作為一個語音電話終端,需要如下幾個方面的功能:(1)要有音頻采集/播放設(shè)備以及相關(guān)的編解碼算法;(2)要有網(wǎng)卡處理設(shè)備,傳輸雙方的信令和音頻數(shù)據(jù);(3)要采用實時傳輸協(xié)議保證語音傳輸質(zhì)量?;谏鲜龇治?,系統(tǒng)的實現(xiàn)框架可設(shè)計如圖1,后面將具體闡述。

圖1 UA 實現(xiàn)框架

2 終端的硬件設(shè)備和操作系統(tǒng)

硬件平臺采用一款ARM開發(fā)板:CPU為三星公司生產(chǎn)的主頻可達400MHz的S3C2440A;音頻處理設(shè)備采用Philips公司生產(chǎn)的UDA1341TS,可實現(xiàn)A/D的相互轉(zhuǎn)換, S3C2440A 通過 L3接口可以控制和配置 UDA1341TS,L3 接口有 L3MODE、L3DATA和 L3CLOCK 三根信號線,音頻的驅(qū)動采用OSS架構(gòu),類似其他驅(qū)動,音頻驅(qū)動的實現(xiàn)分為初始化、打開設(shè)備、讀寫操作、設(shè)備查詢/控制、釋放設(shè)備和注銷設(shè)備等部分;開發(fā)板帶有網(wǎng)絡(luò)芯片DM9000,滿足聯(lián)網(wǎng)的要求;系統(tǒng)還帶有串口等其他設(shè)備。本次使用的內(nèi)核Linux-2.6.32.2 已經(jīng)能支持UDA1341 音頻芯片的驅(qū)動,但提供的是針對SMDK2440,SMDK2440的錄音通道,使用的是VIN1,而在本開發(fā)板使用的則是VIN2,因此需修改內(nèi)核驅(qū)動linux-2.6.32.2/sound/soc/codecs/ uda134x.c中添加uda134x_write(codec, 2, 2|(5U<<2)),把錄音通道改為VIN2。

軟件平臺采用linux-2.6.32.2,Linux作為一種開源操作系統(tǒng),具有較高的穩(wěn)定和可移植性,可以根據(jù)需要進行內(nèi)核、驅(qū)動的裁剪配置,這里將TCP、UDP協(xié)議以及聲卡,網(wǎng)卡、串口等相關(guān)的驅(qū)動配置進去。

3 信令協(xié)議SIP及其協(xié)議棧

SIP協(xié)議作為會話控制協(xié)議,用來建立、修改和終止多媒體會話,其重要性不言而喻。這里對SIP再做點介紹。

SIP采用分層結(jié)構(gòu),最低層是語法和編碼,第2層是傳輸層,第3層是事務層。最上層是事務用戶。每個有狀態(tài)的SIP 實體,都是事務用戶,當發(fā)送請求時,將創(chuàng)建一個客戶端事務實例,并將請求與目的IP 地址、端口一起發(fā)送。SIP消息分為兩大類:請求(Request)和 響應(Response。請求消息分為 6 種:REGISTER、INVITE、ACK、BYE、CANCEL、OPTIONS。響應消息分為6類:1xx,2xx,3xx,4xx,5xx,6xx。其中1xx是臨時響應(Provisional Response),其余是最終響應(Final Response)。

目前符合RFC3261規(guī)范的開源SIP協(xié)議棧有OPAL,VOCAL,sipX ,oSIP[5]等,oSIP 結(jié)構(gòu)簡單、功能齊全,可移植性好,因此本次選用了oSIP。

oSIP協(xié)議棧主要分為3大部分:狀態(tài)機模塊、解析器模塊、工具和對話模塊。其核心是狀態(tài)機模塊。狀態(tài)機有4種類型:ICT、IST、NICT以及 NST,對不同的事務,oSIP用不同的狀態(tài)機處理,并推動自身狀態(tài)的改變。解析器模塊主要完成對SIP 消息結(jié)構(gòu)剖析、SDP 消息的結(jié)構(gòu)剖析以及URI 結(jié)構(gòu)的剖析。工具模塊主要提供一些處理工具用于對話管理和SDP協(xié)商。

eXosip是對oSIP的擴展,它對oSIP協(xié)議棧進行了部分封裝,增加了registration、 call、dialog等過程的解析,使得調(diào)用接口更加友好,使用eXosip可以簡化開發(fā)任務。

4 流媒體處理部分Mediastreamer2和oRTP和語音編解碼算法

流媒體處理分為3個部分Mediastreamer2和ORTP以及編解碼算法。這3個本來是獨立的,由于它們相互協(xié)作處理用于處理音頻流,因此這里一起介紹。

Mediastreamer2負責媒體流的處理,采用純C開發(fā),是一個功能強大且小巧的流引擎,最小依賴只需oRTP和LIBC,可根據(jù)需要添加其他庫,如SPEEX。Mediastreamer2媒體庫將語音模塊的工作分為幾大MSFilter實體:對聲卡的讀寫soundread/soundwrite,調(diào)用音頻庫的encode/decode,接收/發(fā)送RTP數(shù)據(jù)包的rtpsend/rtprecv等,利用函數(shù)指針將一系列的FILTER組合起來,多個MSFilter進行連接,形成一個MSFilter chain。

oRTP負責流媒體如何安全可靠的傳輸,是用C語言編寫的RTP的開源協(xié)議棧,并且實現(xiàn)了RTCP,RTP在初始化的時候會對全局變量RtpProfile賦值,RtpProfile中的PayloadType數(shù)組的每個元素對應一種媒體流,包括了名稱,采樣率,聲音位數(shù),靜音格式,占用帶寬等媒體流屬性。rtp_session_send_with_ts和rtp_session_recv_with_ts分別是oRTP發(fā)送和接收的主要函數(shù)。

語音壓縮編解碼算法很多,常見的有G.711PCM、GSM等算法,本次采用的G.711PCM算法,如需要更多算法,還可以使用SPEEX庫。

5 UA的程序設(shè)計

本次UA部分實現(xiàn)了注冊、呼叫、應答、掛斷、退出 等電話呼叫的基本功能。UA主程序的流程圖如圖2示。

圖2 UA主流程圖

圖3 mysip_init()執(zhí)行流程圖

(1)系統(tǒng)首先調(diào)用add_port_set(),設(shè)置注冊時所用的注冊服務器地址和端口號,通話時對端的sip url地址及本地sip端口和rtp端口號、用戶名和密碼等;然后調(diào)用mysip_init()。

(2)在mysip_init()中,進行一系列初始化,見圖3。首先調(diào)用eXosip_init()對eXosip變量、osip庫初始化,設(shè)置回調(diào)函數(shù)以及傳輸方式;mysip_init()接著調(diào)用eXosip_listen_addr(),eXosip_listen_addr()則對開始監(jiān)聽sip端口,并執(zhí)行eXosip_execute ()去讀取各種osip事件,并進行處理:對于要發(fā)送的message,管理程序會主動調(diào)用接口發(fā)送,對于接收到的message,可能會創(chuàng)建新的call、新的transaction,生成新的transaction的event,還有exosip的event,其中exosip的event是上報給管理程序的;在mysip_init()中會創(chuàng)建一個新的線程ua_exosip來處理這些eXosip事件,為便于描述,在(3)中再討論這些事情,該線程創(chuàng)建后,會對UAC和UAS事件分別作出處理,見圖4;mysip_init()繼續(xù)完成初始化的調(diào)用ortp()和ms_init(),分別對oRTP協(xié)議棧和對Mediastreamer2初始化。

(3)ua_exosip()線程創(chuàng)建后就一直獨立運行,在程序初始化完成后,它的運行要和主程序的循環(huán)讀取用戶輸入的命令并做出響應的運行結(jié)合起來。

在ua_exosip中的exosip事件處理有很多,這里僅僅選取了UAS端收到的EXOSIP_CALL_INVITE, EXOSIP_CALL_ACK以及UAC端收到的EXOSIP_CALL_RINGING,EXOSIP_CALL_ANSWERED在圖4中展示。

(4)在主程序中進入一個死循環(huán)中,循環(huán)中不斷讀取當前輸入的命令,并根據(jù)命令的輸入,執(zhí)行相應的處理函數(shù)。圖2中,列舉了一些常見的命令,當輸入r時,代表要向注冊服務器注冊,將執(zhí)行函數(shù)sregister()完成此功能;當輸入i時,代表作為UAC,將執(zhí)行函數(shù)sinvite()發(fā)起一次呼叫;當輸入a時,代表作為UAS,將執(zhí)行函數(shù)sanswer()接聽電話;當按下h時,代表掛斷電話,將執(zhí)行shang();當按下q時,代表退出系統(tǒng),將執(zhí)行squit()。這里分別以UAC端的sinvite()和UAS端的sanswer()為例,介紹實現(xiàn)過程。

圖5為UAC端的sinvite()過程,由于這是一個呼叫發(fā)起請求,將主要調(diào)用eXosip_call_build_initial_invite(&invite, dest_call, source_call, NULL, "invite")和eXosip_call_send_initial_invite (invite)等,它們將構(gòu)造一個invite 請求信息,創(chuàng)建一個新的call,并為該invite創(chuàng)建一個新的transaction,創(chuàng)建完call和transaction后,會根據(jù)要發(fā)送的invite生成一個transaction的event,并將event添加到transaction的event隊列中,最后喚醒處理線程對transaction上的event處理。

圖6 為UAS端的sanswer()過程。當接收方接聽一個電話時,將向發(fā)起方發(fā)送200OK的信息,此時將建立起來一次dialog。但正式的通話要等到發(fā)起方發(fā)出ack信息之后。

(5)終端的運行分析

結(jié)合圖4、圖5、圖6來分析一次執(zhí)行的過程。當在主程序中輸入i命令時,UAC將調(diào)用sinvite()發(fā)起一次呼叫,向接收端發(fā)送呼叫請求(INVITE),接收端UAS收到了來自EXOSIP層的EXOSIP_CALL_INVITE,則將執(zhí)行圖4中的EXOSIP_CALL_INVITE分支下的處理程序,顯示“收到來自xx的呼叫”,本地振鈴,發(fā)送“180”消息給UAC;當UAC收到來自EXOSIP層的EXOSIP_CALL_RINGING時,會顯示“對方已振鈴”;UAS端打算接聽電話,在主程序中輸入a命令,則調(diào)用sanswer()接聽,這里將進行媒體協(xié)商,并發(fā)送200OK消息給UAC,表明已應答,一次dialog建立;UAC收到來自EXOSIP報告的EXOSIP_CALL_ANSWERED,將“顯示對方已通話”,并構(gòu)建、發(fā)送ACK消息給UAS,獲取編碼方式,調(diào)用start_media()函數(shù)進行媒體流的建立,為隨時準備利用RTP傳輸通話語音;UAS收到來自EXOSIP報告的EXOSIP_CALL_ACK,將會顯示“通話開始”,同時調(diào)用start_media()函數(shù)進行媒體流的建立。start_media()中將調(diào)用Mediastreamer2和oRTP來進行音頻數(shù)據(jù)的RTP傳輸。

6 測試及結(jié)論

在移植好開發(fā)板所用的內(nèi)核和文件系統(tǒng)后,再交叉編譯libosip、libexosip、mediastream、ortp等庫和應用程序myua.c等,得到可執(zhí)行文件myua,將可執(zhí)行文件和前述生成的動態(tài)庫拷貝到開發(fā)板的相應目錄下,就可以運行。

圖4 ua_exosip中的exosip事件處理

圖5 UAC端的sinvite()過程

圖6 UAS端的sanswer()過程

系統(tǒng)的運行環(huán)境:在一個局域網(wǎng)內(nèi),由一臺在ubuntu下運行的brekeke sip sever擔任服務器,提供注冊員、代理服務、定位等功能;客戶端由兩個移植了UA的開發(fā)板組成,地址和用戶名見圖7。運行時,假設(shè)1002(此時擔當UAC)向1001(此時擔當UAS)發(fā)起呼叫:先將兩者分別運行注冊;再在1002上輸入i,則會發(fā)起一次呼叫;1001收到后輸入a應答;1002收到發(fā)ACK則兩者建立語音通話。

圖7 系統(tǒng)的運行環(huán)境

測試表明,局域網(wǎng)內(nèi)RTP包的丟包率為0,通話通話質(zhì)量較為清晰,通話情況良好。進一步的工作可以實現(xiàn)視頻通話,增加SPEEX等語音編碼,使其能用于更多的場合。

[1]Rosenberg J.SIP: Session Initiation Protocol[S].RFC3261 ,IETF , 2002

[2]張遼.基于ARM 的嵌入式 IP 電話系統(tǒng)設(shè)計與實現(xiàn)[D].武漢:華中科技大學,2012.1.

[3]劉剛,趙劍川.Linux系統(tǒng)移植 [M].北京: 清華大學出版社, 2011.1.

[4]友善之臂.Mini2440 之Linux 移植開發(fā)實戰(zhàn)指南[EB].http://www.arm9.net/.2010.04

[5]潘健等.基于Mediastreamer2的嵌入式語音終端的實現(xiàn)[J],湖北工業(yè)大學學報,2012,27(5):48-51

[6]胡斌.VoIP系統(tǒng)中基于RTP/RTCP協(xié)議的語音及視頻傳輸?shù)脑O(shè)計與實現(xiàn)[D].廈門:廈門大學,2009.05

主站蜘蛛池模板: 中文国产成人精品久久一| 2022精品国偷自产免费观看| 国产不卡一级毛片视频| 日本不卡视频在线| 欧美亚洲第一页| 美女免费精品高清毛片在线视| 专干老肥熟女视频网站| 亚洲欧美日韩天堂| 国产精品人人做人人爽人人添| 欧美成人手机在线观看网址| 欧美色丁香| 囯产av无码片毛片一级| 日本三级黄在线观看| 亚洲美女一级毛片| 蜜桃视频一区| 免费欧美一级| 亚洲欧美精品日韩欧美| 欧美亚洲另类在线观看| 国产精品女同一区三区五区| 午夜精品区| 手机永久AV在线播放| 亚洲AⅤ永久无码精品毛片| 天堂中文在线资源| 99青青青精品视频在线| 亚洲第一成年网| 亚洲无码91视频| 在线日韩一区二区| 亚洲精品成人片在线播放| 亚洲中文在线看视频一区| 无码高潮喷水在线观看| 久久这里只有精品23| 国产成人啪视频一区二区三区| 国产亚洲视频播放9000| 欧美日韩一区二区在线免费观看| 国产全黄a一级毛片| 亚洲欧洲天堂色AV| 色AV色 综合网站| 香蕉国产精品视频| 欧美有码在线观看| aa级毛片毛片免费观看久| 少妇高潮惨叫久久久久久| 999国产精品| 欧美亚洲一二三区| 中文字幕久久亚洲一区| 日本影院一区| 成人精品午夜福利在线播放| 欧洲一区二区三区无码| 欧美成人怡春院在线激情| 久久国产高清视频| 天天摸天天操免费播放小视频| 中文字幕久久波多野结衣| 欧美福利在线播放| 欧美乱妇高清无乱码免费| 丁香婷婷激情综合激情| 免费人成网站在线观看欧美| 中文字幕 91| 久久中文字幕2021精品| 日韩精品毛片人妻AV不卡| 青青热久免费精品视频6| 中文字幕久久精品波多野结| 色综合久久88色综合天天提莫| 毛片在线看网站| 日韩精品无码免费一区二区三区| 真实国产精品vr专区| 亚洲国产精品无码久久一线| 丰满人妻中出白浆| 国产精品白浆无码流出在线看| 欧美精品v| 国产乱人激情H在线观看| 国内精品手机在线观看视频| 99视频在线精品免费观看6| 国产精品三级专区| 91精品综合| 在线免费观看a视频| 三区在线视频| 久久人搡人人玩人妻精品| 在线播放91| 四虎永久在线精品国产免费| 在线播放真实国产乱子伦| 亚洲午夜天堂| 国产女人18水真多毛片18精品| 欧美yw精品日本国产精品|