版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/voidreturn/article/details/65634390
目的
為實作跨網絡的語音對講,使位于NAT後的兩個裝置進行p2p的語音通訊,此處選用pjsip開源項目來實作。
未解決的問題:對稱型的NAT無法實作p2p打洞,pjsip采用turn服務進行轉發,不能稱之為純粹的p2p。
pjisp簡介
PJSIP是一個開放源代碼的SIP協定棧,它支援多種SIP的擴充功能 。它的實作是為了能在嵌入式裝置上高效實作SIP/VOIP。(摘自百度百科)
項目網址:
http://www.pjsip.org/pjsip的編譯
下載下傳并解壓相應pjsip源碼後,在根目錄運作./configure;make dep;make指令即可完成編譯。
注:pjsip依賴libasound庫,可通過apt-get install libasound2-dev進行安裝
pjsip測試程式說明
pjsip提供的文檔比較多,比較分散,如果不仔細浏覽各個文檔,不太容易搞清楚build完的整個工程要如何使用,以及生成的測試程式要如何使用。
首先:工程編譯成功後,在pjsip-apps/bin/目錄下會生成一些測試程式。其中sample目錄下有很多單一功能的測試程式。不過我們更關心的是bin目錄下的pjsua-x86_64-unknown-linux-gnu(這裡吐槽下pjsip的文檔,大部分文檔中隻會提到pjsua,而不會提到字尾,也沒有指出生成目錄,導緻找了半天找不到pjsua)
pjsua-xxx的使用說明文檔:
http://www.pjsip.org/pjsua.htm運作pjsua需要的前置條件
config-file
大家先大緻浏覽上面的pjsua文檔說明,對整個pjsua的選項有個了解。然後我們關注到最後的config_file。
# This is a comment in the config file.
--id sip:[email protected]
--registrar sip:example.com
--realm *
--username alice
--password secret
sipserver
不了解sip的開發者對上面的sip:example.com 可能會有些疑惑,不知道這個sip:example.com指的是什麼?
pjsua這裡隻是一個用戶端,要完成sip的通訊,需要一個sip伺服器,我們可以自己搭建,也可以找一些線上的免費sipserver(我隻找到一個minisipserver是免費線上可用的,不過十分不穩定)。
自己搭建可以選擇opensip等開源的sipserver。
我選擇的是minisipserver windows安裝版,配置十分簡單,具體安裝配置參考:
http://blog.csdn.net/cazicaquw/article/details/7345327安裝好後添加兩個分機user1:123456,user2:123456後即可進行下一步測試操作。
測試環境搭建
需要三台pc進行測試,兩台pc運作./pjsua用戶端,一台運作sipserver。另外需要三台路由器,兩台pc用戶端運作分别運作在兩台路由器下,sipserver運作在上級路由網絡。
運作pjsip
按照前面的說明,分别生成user1和user2兩個conf檔案。
在兩個用戶端系統運作指令:./pjsua-x86_64-unknown-linux-gnu –config-file userX.conf
然後按照提示說明即可完成sip呼叫的過程。不過大機率情況下,你應該是不能進行語音對講的。因為兩個pjsua處于兩個不同網絡下,需要nat穿透。
nat穿透之–stun-srv
檢視pjsip文檔,我們發現可以通過–stun-srv選項進行nat穿透。–stun-srv後跟stun server的位址,pjsip的文檔提供了一個公網的stun server位址:stun.pjsip.org,不過由于我們的sipserver搭建在内網,是以不能使用這個server,如果你安裝minisipserver時留意過會發現,minisipserver也啟動了一個stun server服務。這樣我們隻需要在–stun-srv後跟上我們的minisipserver的位址即可了。
再次運作pjsua用戶端,進行呼叫,應該就可以進行語音對講了。
如果你仍然不能聽到語音,請抓包确認是否有rtp,udp包從對端發過來。如果沒有,請聯系我,并告知你的路由器型号,我正想找一個這種路由器。
nat穿透之–turn-srv
前面如果你遇到語音不通的情況,大概應該是你的路由器的nat模式是對稱型的,stun是無法穿透對稱型nat的,此處需要用到turn,按照協定介紹turn是對stun的一種補充,對于無法穿透的對稱型nat,需要借助turn進行轉發,我的了解turn已經不是純粹的p2p了。
turn server搭建:
這裡我們選擇restund作為turn server
restund的安裝參考:
http://nil.uniza.sk/sip/installing-and-configuring-restund-stunturn-server(注意啟動restund服務時,修改/etc/restund.conf裡面的server ip)
我們需要将該restund server部署到sipserver同一網絡中。
–turn-srv參數:
pjsip文檔中關于–turn-srv的sample大概是這樣子的:
Another example to use TURN and ICE:
$ ./pjsua --use-ice --use-turn --turn-srv turn.pjsip.org --turn-user [username] --turn-passwd ***
不了解turn的對這裡的–turn-user和–turn-passwd會十分疑惑。
我們檢視restund服務配置/etc/restund.auth:
#
# restund.auth
#
# this file contains a list of authenticated users, with one
# user per line in the format:
#
# username:HA1
#
# the HA1 value can be calculated using util/genha1.sh
#
# sample user for testing:
#
# username = demo
# realm = myrealm
# password = secret
#
demo:c5dcdebd926706f33065ec3b65bf103c
這裡的預設的username就是demo,password就是secret了。
這樣上面的參數可以這麼填寫:
./pjsua --use-ice --use-turn --turn-srv restund_ip:3478 --turn-user demo --turn-passwd secret