日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

新一代开源VoIP协议栈--OPAL(OpenH323 v2)

發(fā)布時(shí)間:2023/12/13 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 新一代开源VoIP协议栈--OPAL(OpenH323 v2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

OPAL是Open Phone Abstraction Library的字母縮寫,仍然是Equivalence公司開發(fā)的開源VoIP協(xié)議棧,從2001年便開始開發(fā)了,直到現(xiàn)在還沒有正式發(fā)布過一個(gè)版本,只能從CVS: http://cvs.sourceforge.net/viewcvs.py/openh323/opal下載最新的版本,而且現(xiàn)在的2.05bate版有著非常多的問題,但這些絲毫不能阻止我對(duì)OPAL的看好。OPAL仍然采用PWLIB作為開發(fā)庫,最新的PWLIB實(shí)際已經(jīng)只剩PTLIB,Equivalence公司已經(jīng)停止了對(duì)PWLIB的GUI開發(fā)了,GUI全面轉(zhuǎn)向更為強(qiáng)大的wxWindows。OPAL作為Openh323的下一代協(xié)議棧最大的特點(diǎn)是加入了對(duì)SIP協(xié)議的支持,OPAL保留了Openh323大部分代碼,并加入了對(duì)EndPoint,Connection等抽象描述的基類,使得添加新的協(xié)議和設(shè)備變得更加簡單和方便。

OPAL中最重要的類是新加的:OpalManager,它跟Openh323中的H323EndPoint地位一樣,它定義了OPAL系統(tǒng)中最基本的操作,所以每個(gè)應(yīng)用程序必須從OpalManager派生一個(gè)類,然后重載虛函數(shù)實(shí)現(xiàn)自己的操作。
OpalManager::SetUpCall(partyA,partyB,token); 呼叫,partyA是會(huì)話發(fā)起人,partyB是會(huì)話接受人
OpalManager::OnIncomingConnection(connection); 接聽,返回TRUE則接聽,返回FLASH則拒絕
OpalManager::AdjustMediaFormats(connection,mediaFormats); 調(diào)整媒體格式
OpalManager::ClearCall(token,reason,sync) 清除呼叫,sync如果為NULL則不等待快速返回
OpalEndPoint是描述端點(diǎn)的基類,H323,SIP,PSTN,IVR,LID,聲卡的端點(diǎn)都是繼承于這個(gè)類,在這里值得注意的是連聲卡設(shè)備也看做一種端點(diǎn)。
OpalPCSSEndPoint則是EndPoing中比較重要的一個(gè)類,畢竟打電話還是聲卡用的多,OpalPCSSEndPoint的構(gòu)造函數(shù)必須引用派生的OpalManager類的實(shí)例。

下面具體例子SimpleOPAL來講解:
opal = new MyManager; //新建一個(gè)MyManager的實(shí)例
if (opal->Initialise(args)) //調(diào)用MyManager::Initialise()函數(shù)初始化
opal->Main(args); //等待用戶輸入命令
cout << "Exiting " << GetName() << endl;
delete opal; //擦pp
部分Initialise()函數(shù)代碼:
SetVideoInputDevice(video); //設(shè)置輸入視頻設(shè)備
...
SetVideoOutputDevice(video); //輸出視頻設(shè)備
...
SetAudioJitterDelay(minJitter, maxJitter); //聲音抖動(dòng)緩存的最小和最大值
...
SetMediaFormatMask(args.GetOptionString('D').Lines()); //屏蔽的媒體格式
SetMediaFormatOrder(args.GetOptionString('P').Lines()); //媒體格式的使用順序
...
SetTranslationAddress(args.GetOptionString("translate")); //設(shè)置外部IP地址
...
Set***Ports(rgs.GetOptionString("tcp-base").AsUnsigned(),
args.GetOptionString("tcp-max").AsUnsigned()); //設(shè)置相關(guān)的端口
SetSTUNServer(args.GetOptionString("stun")); //使用STUN服務(wù)器
...
pcssEP = new MyPCSSEndPoint(*this); //新建一個(gè)MyPCSSEndPoint實(shí)例
pcssEP->SetSoundDevice(args, "sound", PSoundChannel::Recorder)//設(shè)置相關(guān)的播放聲音設(shè)備
...
h323EP = new H323EndPoint(*this); //h323EP的初始化
h323EP->DisableFastStart(args.HasOption('f')); //關(guān)閉快速撥號(hào)模式
h323EP->DisableH245Tunneling(args.HasOption('T')); //關(guān)閉H245通道模式
h323EP->AddAliasName(aliases[i]); //添加昵稱
h323EP->SetInitialBandwidth(initialBandwidth); //限制帶寬
h323EP->StartListeners(listeners) //現(xiàn)在才開始監(jiān)聽,默認(rèn)是TCP:1720
h323EP->SetGatekeeperPassword(args.GetOptionString('p')); //注冊(cè)網(wǎng)守所需的密碼
h323EP->UseGatekeeper(gkHost, gkIdentifer, gkInterface) //注冊(cè)網(wǎng)守
...
sipEP = new SIPEndPoint(*this); //SIP也來了
sipEP->SetUserAgent(args.GetOptionString("sip-user-agent"));//設(shè)置用戶代理,UserAgent就相當(dāng)于最初openh323的endpoint
sipEP->SetProxy(args.GetOptionString("sip-proxy")); //設(shè)置SIP代理,此處proxy相當(dāng)于h323里的Gatekeeper
sipEP->SetMIMEForm(args.HasOption("use-long-mime")); //MIME頭的格式
sipEP->StartListeners(listeners)//監(jiān)聽開始,默認(rèn)是TCP:5060和UDP:5060
Main()函數(shù)部分代碼:
if (pcssEP != NULL && !pcssEP->incomingConnectionToken) { //小心,有電話來了
if (cmd == "n")
pcssEP->ClearCall(pcssEP->incomingConnectionToken, //打死我都不接
OpalConnection::EndedByRefusal);
else if (cmd == "y")
pcssEP->AcceptIncomingConnection(pcssEP-> //喂,小莉嗎?
incomingConnectionToken);
}
...
OpalCall * call = FindCallWithLock(currentCallToken); //讓我看看是那一個(gè)通話
if (call != NULL) {
cout << "Clearing call " << *call << endl;
call->Clear(); //廢話那么多,打IP電話也要錢的,掛拉
call->Unlock();
...
if (potsEP != NULL) //是打電腦還是打座機(jī)呢?
SetUpCall("pots:*", params[1], currentCallToken); //打座機(jī)吧(PSTN)
else
SetUpCall("pc:*", params[1], currentCallToken); //打電腦不要錢,嘿嘿

OPAL中的例子MFC根本無法使用,Openphone的GUI使用了wxWindows,所以必須安裝了wxWindows才能正常編譯,opalgw這玩意我試過好多次根本無法讓別人注冊(cè),看來OPAL要走的路還很長,不過Equivalence公司開發(fā)已經(jīng)漸漸的從Openh323轉(zhuǎn)向了OPAL,相信不久一個(gè)穩(wěn)定的OPAL將會(huì)被發(fā)布.

總結(jié)

以上是生活随笔為你收集整理的新一代开源VoIP协议栈--OPAL(OpenH323 v2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。