基于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.mzph.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;若远端主机的网络功能没有…