基于pjsip實現p2p語音對講

目的

為實現跨網絡的語音對講,使位于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:alice@example.com
--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

至此,大部分nat后的設備都可以進行p2p的通訊了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS2017 啟動調試報錯無法啟動程序 當前狀態中非法

昨天還可以使用,今天就莫名報了這個錯誤,百度了一下: 1. 第一種嘗試方法是右擊解決方案中的項目(圖標有帶球的),打開屬性選擇“WEB”選項,修改特定頁為Home,結果還是報錯。 2.我又關閉Windows防火墻,依舊報…

ABAP WRITE

1、空行 WRITE /. 2、AS CHECKBOX DATA: check1 TYPE c LENGTH 1 VALUE X, check2 TYPE c LENGTH 1 VALUE . START-OF-SELECTION. WRITE: / check1 AS CHECKBOX, Checkbox 1, / check2 AS CHECKBOX, Checkbox 2. AT LINE-SELECTION. READ: LINE 1 FIELD VALUE check1, LINE 2 …

java 星期幾、得周一、得周日、上周、下周、相差、日期工具類

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 import org.apache.commons.lang3.StringUtils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut…

蘋果前CEO斯卡利變身創業導師:欲尋下個喬布斯

喬布斯和約翰斯卡利 導語:國外媒體今天撰文稱,蘋果前CEO約翰斯卡利(John Sculley)雖然早已離開蘋果,但仍然活躍在科技行業。他現在將目光轉向了醫療科技領域,希望從中挖掘出下一個喬布斯。 以下為文章全文: 下一個喬布…

記錄一次kernel內存泄漏的查找定位過程

Bug描述:壓力測試一個小工程時發現內存逐漸減少,10個小時后出現OOM Bug定位過程: 對整個工程模塊進行分解,逐步縮小范圍,由于整個工程包括幾個相對獨立的小模塊,而整個工程采用單進程多線程的模型&#x…

python3.6+selenium_Testsuits測試套件

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2018/11/23 11:23 # File : unittest_test2_2.pyTestsuits測試套件 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.commo…

PBRT筆記(7)——反射模型

基礎術語 表面反射可以分為4大類: diffuse 漫反射glossy specular 鏡面反射高光perfect specular 完美反射高光retro-reflective distributions 后反射分布幾何坐標系以及工具函數 pbrt中的反射是在反射坐標系中進行計算的。坐標系由著色點處法向量與兩個切向量組成…

Linux grep命令、Linux cd命令、Linux pwd命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux grep命令用于查找文件里符合條件的字符串。 grep指令用于查找內容包含指定的范本樣式的文件,如果發現某文件的內容符…

忠告:創業公司與大公司正面競爭易死

移動互聯網的興起給了創業公司足夠的發展空間,也提供了一個相對公平的競爭平臺。但機遇永遠與挑戰并存。   對于初創公司,最大的挑戰莫過于在移動互聯網大潮中生存下來。IDG資本合伙人高翔認為,初創公司不要和大公司正面競爭,應…

海康螢石攝像機遠程監控機制分析

背景介紹 有一個遠程監控的需求,正常情況下采用服務器轉發視頻流對服務器要求很高,所以p2p看似是一個比較好的方案,但是p2p打洞卻不是一件容易的事情,所以打算分析下海康螢石攝像機遠程監控的機制,是否采用了p2p的方式…

實體類中存在List集合,怎么在xml文件中,對應

public class AppointmentDTO {/**訂單id**/private String appointmentId;/**訂單里面的商品list**/private List<CommodityShowInAppoinment> list;/**訂單里面的商品數量**/private Integer count;/**訂單實際付款的金額**/private Float totalMoney; } 怎么弄呢&…

git管理復雜項目代碼

背景 我初學前端的時候接觸git&#xff0c;那時候只要會add/commit什么的就好了&#xff0c;網上的教程大多都停留在從頭到尾一個個介紹git的命令&#xff0c;關于各種用法&#xff0c;特別是多個分支來回交叉沖突的實際處理&#xff0c;很少有這方面的介紹&#xff0c;經過很多…

實現一個通用的生產者消費者隊列(c語言版本)

背景&#xff1a;筆者之前一直從事嵌入式音視頻相關的開發工作&#xff0c;對于音視頻的數據的處理&#xff0c;生產者消費者隊列必不可少&#xff0c;而如何實現一個高效穩定的生產者消費者隊列則十分重要&#xff0c;不過按照筆者從業的經驗&#xff0c;所看到的現象&#xf…

美媒:小米新浪達成合作 采取行動對抗騰訊

來自美媒的報道稱&#xff0c;兩家中國最具發展潛力的科技公司&#xff0c;新浪和小米將會共同合作&#xff0c;結合各自的通信應用程序來共同對抗移動通信的挑戰&#xff0c;尤其是擁有2億用戶的強勁對手微信。 來自中國的消息稱&#xff0c;這次新浪與小米的合作將會涉及到新…

Linux expr命令、Linux wc命令、Linux let 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 expr命令是一個手工命令行計數器&#xff0c;用于在UNIX/LINUX下求表達式變量的值&#xff0c;一般用于整數值&#xff0c;也可用于字符…

【English】六、am,is,are 分別用在什么地方

is&#xff1a;第三人稱單數am&#xff1a;第一人稱單數are&#xff1a;第二人稱單數&#xff0c;第一、二、三人稱的復數 用于第一人稱, I am ......(我是.......)用于第三人稱, He is ......(他是......) 或She is ......(她是......), It is ......(它是.......)用于第二人…

誤刪了公司數據庫,但我還是活下來了

專欄 | 九章算法 網址 | www.jiuzhang.com 上周我與同事們進行了一次關于職業生涯中搞砸了一些事情的簡短談話。這確實會淪為他人笑柄&#xff0c;卻更給我們帶來了珍貴的教訓。重要的是&#xff0c;我們應該分享那些曾經的錯誤&#xff0c;這樣其他人就可以從其中學習。下文是…

改良程序的11技巧

有很多理由都能說明為什么我們應該寫出清晰、可讀性好的程序。最重要的一點&#xff0c;程序你只寫一次&#xff0c;但以后會無數次的閱讀。當你第二天回頭來看你的代碼時&#xff0c;你就要開始閱讀它了。當你把代碼拿給其他人看時&#xff0c;他必須閱讀你的代碼。因此&#…

歷時四年,給Google提交的Android Framework Bug終于被Fixed了

歷時四年&#xff0c;Google終于修復了一個我發現的Android Framework Bug 2014年在做一個Android終端設備開發過程中&#xff0c;發現了一個Android Framework層的Bug&#xff0c;給Google提交了issue和解決方案&#xff0c;和外界傳言一致Google一般不太在意個人開發者提交的…

Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux ping命令用于檢測主機。 執行ping指令會使用ICMP傳輸協議&#xff0c;發出要求回應的信息&#xff0c;若遠端主機的網絡功能沒有…