stun服务器搭建
① webrtc stun服务器必须是公网ip吗
一般需要公网IP,如果不是公网IP,那么只能让两个都能连上该服务器的设备进行通信
也就是限制了它应尽的功能,这个stun服务器主要用来穿透防火墙,进行两个网络的通信,如果在同一个内网通信,就没有太大的意义,但也是可以实现的
② STUN/TURN服务器搭建
服务器 :
公网服务器 购买带有公网IP的云服务器
镜像 :
ubuntu 16.04
ubuntu16镜像已经带有coturn的源 可以直接apt-get安装
STUN/TURN的默认端口是3478
除此之外还可以通过 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 测试ice
先简单介绍一下代理的分类:
代理分:Level 1~Level 5 五个等级;
或者也可以分为3类:·
A .全匿名代理不改变你的Request
Fields,使服务器端看来就像有个真正的客户浏览器在访问它。当然,你的真实IP是隐藏起来的。服务器的网管不会认为你使用了代理。
B· 普通匿名代理能隐藏你的真实IP,但会更改你的Request
Fields,有可能会被认为使用了代理,但仅仅是可能,一般说来是没问题的。不过不要受它的名字的误导,其安全性可能比全匿名代理更高,有的代理会剥离你的部分信息(就好比防火墙的Stealth
Mode),使服务器端探测不到你的操作系统版本和浏览器版本。
C· 透明代理(简单代理)改编你的Request Fields,并会传送真实IP。
你访问的网站会把你看的一清二楚,知道你用了代理,知道代理的IP,也知道你的真实IP。
一般Level3?-Level5属于 透明代理; Level 1-Level3 属于匿名代理! 全匿名代理有时也称为超级代理!
不想让网管(国内代理服务器}或者ISP(国外代理服务器)知道我想去哪去过哪,那把你的连接请求用SSL加密就行了.
有了匿名功能再加上加密的连接,隐身术终于练成!
制作和使用这个代理需要的软件是CCPROXY 6.2,STUNNEL,OPENSSL,SOCKSCAP.都是免费软件,CC3个用户就够了.
假设你已经有了一台远程机器A做代理服务器,你自己的机器为B.
在A机上,我们要开一个SOCKS5的本地代理端口,并且用SSL加密他的传输.首先,在CCPROXY里启用SOCKS5的代理服务,假设端口是 1080,创建一个用户,验证方式为用户名/密码/IP混合,假设用户名密码都是123,IP为127.0.0.1,记得顺便把"禁止局域网外用户访问" 勾上,因为远程的B机不会直接访问这个服务,免得老人人来扫密码.下面是关键,打开CCPROXY.INI文件,修改并确认下面2个参数:
EnableProxyConnection=0
EnableReferer=0
这样别人就不知道你使用了代理,也不知道你从哪儿来.好像CC6.0也支持这两个参数,不过官方是6.3才在FAQ里面写出来.
然后配置STUNEEL.CONF文件,内容如下:
cert=stunnel.pem
key = stunnel.pem
taskbar=no #这个参数可以隐藏STUNELL的图标,如果做坏事就用$%#%#
client=no
[socks2ssl]
accept = 80 #在80端口监听,准备接受外部连接.
connect = 127.0.0.1:1080 #连接CCPROXY开的SOCKS5服务端口
把监听端口设为80的原因是极端的假设B机前面的防火墙只允许B机访问80端口,如果没这个限制,随便设一个.
代理服务器做好了,我们要配置一下B机这个客户端.
首先是客户端的STUNNEL.CONF
client = yes
[ssl2SOCKS]
accept = 127.0.0.1:8282 #在本地启用8282端口的SOCKS5代理服务
connect = AAA.AAA.AAA.AAA:80 #连接到你的代理服务器A,地址或者域名+端口
然后设置SOCKSCAP,设置代理类型SOCKS5,地址127.0.0.1,端口8282,用户密码验证(启动SOCKSCAP会让你输入,就是前面设置的123了),DNS解析选先本地再远程.
最后,把你的浏览器,例如IE,拉入SOCKSCAP,可以去 http://proxyjudge.org/
验证你的匿名度了!通常就是下面这样的结果.
REMOTE_HOST=AAA.AAA.AAA.AAA
REMOTE_ADDR=AAA.AAA.AAA.AAA
HTTP_ACCEPT=*/*
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTP_ACCEPT_LANGUAGE=zh-cn
HTTP_CONNECTION=Keep-Alive
HTTP_HOST=proxyjudge.net
HTTP_REFERER=http://proxyjudge.org/
HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;
Maxthon; SV1)
--------------------------------------------------------------------------------
REMOTE_HOST
Result
IP Addr.
Comment
I have no idea because DNS lookup failure.
HTTP Env. value
Result
NoProxy!
Comment
Like no proxy server.
AnonyLevel : 1
REMOTE_HOST that is IP addr. is precious.
或者B机上面装个个人防火墙例如ZONEALARM,启用它的隐私保护,那么
HTTP_ACCEPT_LANGUAGE
HTTP_USER_AGENT
这些本机信息也都会被隐藏.
后记:最初只是通过CCPROXY+STUNNEL建一个HTTP的SSL服务器通道,然后本机也是直接用STUNNEL连接出来的HTTP代理,但是验证匿名度的时候始终是Level2,3,让人很不爽.知道后来看了一些关于CCPROXY和SOCKS5的资料,试着转换角度弄一下,终于成功了.其实用SOCKSCAP还有一个好处,他可以过滤某些数字开头的IP
跳过代理直接连接,如果你的代理服务器驾在国外,你只要把国内主要的一些IP数字开头例如:202.96. 61.141等等加到那个过滤列表里面,就可以解决国外代理访问国内网站很慢的问题了.
④ centos下 Janus Server 搭建笔记
Janus 是一个开源的,通过 C 语言实现了对 WebRTC 支持的 Gateway;Janus 自身实现得很简单,提供插件机制来支持不同的业务逻辑,配合官方自带插件就可以用来实现高效的 Media Server 服务。
本文主要介绍如何在 Centos 7.0 下搭建起 janus 服务器,实现 janus 官方 Demo 浏览器与 Android APP Demo(janus-gateway-android)之间的音视频通话。
目前浏览器仅支持 FireFox 浏览器,因为 Chrome 浏览器打开音视频采集的话需要 HTTPS 加密访问!
效果图如下:
编译运行 Janus Server 需要依赖较多的一些第三方库
2.1 安装依赖
Ubuntu 下通过 aptitude 批量安装依赖工具包,这里建议 Ubuntu 镜像源(/etc/apt/source.list)不要为了追求速度而改用了国内的某些镜像源,如 网易 163,这可能会导致某些工具包下载失败,建议依然使用官方自带的镜像源。
yum list | grep nice
yum install gtk-doc
批量安装命令:
如果出现某个工具包下载失败,请修改镜像源为官方地址,并执行以下命令
以更新镜像源,完成后重新安装。
2、 安装 WebSocket
janus 支持 WebSocket 是可选项,如果不安装,编译 janus 时,默认不支持 WebSocket 的链接请求,而 Android APP Demo 是通过 WebSocket 与 janus 进行通信的,因为我们希望 Android APP Demo 能与浏览器(HTTP)进行视频通话,所以就必须要在编译 janus 时支持 WebSocket。
依次执行以下命令,分别进行下载,编译,安装:
安装成功后,在编译 janus 时,janus 默认会增加对 WebSocket 的集成,或者通过增加编译参数 --enable-websockets 打开 WebSocket 开关,或 --disable-websockets 关闭 WebSocket 开关。
3、 安装 Http Server
Janus 源码目录下的 html 下自带 Web Demo(html & javaScript ),Janus 编译完成并 Start 以后,需要通过 http server 访问 Janus Web Demo,其中包括:
以上 janus 插件均可通过相应的 http 链接进行访问体验。
以下介绍一种快速,便捷,轻巧的 HTTP Server 安装方式:
通过 Node.js (基于 Chrome V8 引擎的 JavaScript 运行环境) 进行安装,首先安装 Node.js:
安装成功后,通过 npm (npm 是 Node.js 的包管理器,是全球最大的开源库生态系统) 进行安装 httpserver:
启动方式:
进入到 html 目录,执行 http-server 命令即可,如:
输入 http url 即可访问。
注:需首先 build & start janus Server!
4、 安装 libsrtp
Janus 需要至少 version 1.5 以上的 libsrtp,如果系统中已经安装了 libsrtp,则首先卸载后,手动安装新版本,这里我们安装 libsrtp 2.0,依次执行以下命令:
5、 编译 Janus
通过 Git 下载 Janus 源码,并编译安装:
configure 执行成功后,会输出 janus 所支持的 协议及插件,如下:
6、 运行 Janus
如果全部安装以上步骤进行编译的 janus ,那么 janus 的全局配置文件存放目录为 :
或者在启动 janus 时,加上相应的启动参数,参数可通过 janus --help 查看;
janus 默认的配置中是没有 WebSocket 的配置的,直接启动 Janus 会因没有 WebSocket 配置文件而报错。幸运的是在配置目录中 Janus 已经给我们提供了一个 WebSocket 的示例配置文件 : janus.transport.websockets.cfg.sample,(如果我们要通过 WebSocket 连接 Janus,则需要有个 WebSocket 的配置文件)这里我们可以直接拷贝这个示例文件:
通过查看此配置文件,可以得知 Janus 默认的 WebSocket 的端口号为 8188, 记住这个端口号,在 Android APP Demo 中会使用到!
启动 Janus:
根据需要可以选择是否加上后面两个启动参数。
我们使用 PC 下的 浏览器 与 Android APP Demo 进行联调。
1、 启动 Web Demo
进入到 janus 目录下的 html 目录,启动 http-server
这样外部便可以通过 http://100.100.32.64:8080 进行访问了,进入首页后,找到 videoRoom,Start
2、 启动 Android APP Demo
修改源代码
janus-gateway-android 支持两个 Demo 测试:EchoTest 和 VideoRoom,默认情况下会启用 EchoTest,这个 Demo 仅仅是连接服务器后,将数据再发回本地进行本地测试,我们要改为与房间内的其它用户(浏览器)进行视频通话,则需要启用另外一个测试用例 VideoRoom,按照如下方式修改代码:
JanusActivity.java 类中新增 VideoRenderer.Callbacks 数组(视频房间中可能会有多人),暂定义为 2 个,实际连接人数不要超过此数字:
OnCreate 方法中初始化以上定义的数组:
APP Demo 是通过 WebSocket 连接 Janus Server,所以修改 VideoRoomTest.java 中 JANUS_URL 地址为我们启动的 Janus 服务器 WebSocket 地址,IP 为 janus server 地址,端口默认为 8188:
3、联调测试
Janus Server 默认会开启两个视频房间:1234 和 5678,分别使用 VP8 和 VP9 视频编码器,所以我们通过 Brower 和 Android APP Demo 进行联调测试时,暂不需要设置房间 ID。
效果图:
修改/opt/janus/etc/janus/janus.jcfg
nat: {
stun_server = "stun.voip.eutelia.it"
stun_port = 3478
nice_debug = false
⑤ 华为云CentOS7 部署STUN/TURN服务 Coturn
记录一下部署coturn服务的过程,以下步骤是作者亲自实践并确认码中含好用的,可放心食用。
服务器环境: 华为云服务器 CentOS7
解压并进入目录
插入以下内容
配置立即生效
先找到配置文件
例如:返回/usr/turnserver/share/examples/turnserver/etc/turnserver.conf
编辑配置
配置文件末尾添加以下内容
由于是在华为云上,需要开放端口的访问,关培州闭对应端口的防火墙,包括端口3478和端口范围迟笑49152-65535,UDP和TCP都需要
测试地址
补充说明:
⑥ coturn服务器配置
注:为了更好的体验,将内容复制到工具中效果才好
#coturn服务器配置
##操作系统:建议使用ubuntu16+
##安装步骤:
以下安装以ubuntu16为例
### 安装软件包
* apt update
* apt install coturn
### 配置coturn服务器
#### 复制DTLS、TLS支持的备塌证书文件(目录中已经有相应的证书)
* cp /usr/share/coturn/examples/etc/turn_server_cert.pem /etc/turn_server_cert.pem
* cp /usr/share/coturn/examples/etc/turn_server_pkey.pem /etc/turn_server_pkey.pem
#### 编辑/etc/turnserver.conf文件
listening-device=eth0 #网卡
listening-port=3478 #对外服务的商品,需要在防火墙、云服务器安全组放通,协议为UDP/TCP,出入站都需要
listening-ip=127.0.0.1 #内网地址
tls-listening-port=5349 #备用端口
listening-ip=172.17.0.4 #局域网地址
relay-ip=172.17.0.4 #局域网地址
external-ip=81.0.187.0 #外网地址
lt-cred-mech
server-name=stun.xxx.cn #域名
realm=stun.xxx.cn #域名
min-port=50001 #穿透需要用到的开始端口 需要在防火墙,云服务器安全组中放通
max-port=50009 #穿透需要用到的结束端口
user=test:test #用户名:密码 测试或者客户端接入时需要用到
userdb=/var/db/turndb #数据文件的位置,如果没有该文件,启动会有错误提示
cert=/etc/turn_server_cert.pem #密钥相关 上面步骤准备枯明的
pkey=/etc/turn_server_pkey.pem #密钥相关 上面步骤准备的
no-stdout-log
log-file=/var/tmp/turn.log #日志文件
pidfile="/var/run/turnserver.pid" #pid文件位置
no-stun #不使用stun服务 主要用于测试turn中继方式时来关闭stun 更多类容可以参考配置文件自带的说明
### 编辑/etc/default/coturn文件
* 默认是不需要改的,但还是检查一下
* TURNSERVER_ENABLED=1
## 安装完成,重启服务
* service coturn restart
## 端口放通
* 参考各系统、服务器,不赘述
## 测试
* 使用自带工具
turnutils_uclient ip或者域名 -u 用户名 -w 密码
## 客户端使用
iceServers: [{
'urls': 'stun:stun.xxxx.cn:3478',
'credential': "没滚告test",
'username': "test"
}
,{
'urls': 'turn:stun.xxxx.cn:3478',
'credential': "test",
'username': "test"
}];
⑦ 【Freeswitch】【媒体NAT穿越案例一】通过stun服务获取FS的公网IP
所有的通话,实质上是点对点的信息传输。(P2P, point to point)
这里的点是指网路上的点,每一个点是有公网IP的;但是实际情况是,很多节点隐藏在NAT之后,它们只有内网地址。那么之前点之前的连接是贺凳无法直连的。
为了能实现点对点的传输,所以内网地址的节点必须获取到它可以使用的公网地址。
下面的例子是讨论FS在NAT后的情况,如下图所示
那么FS怎么样才能获取到公网IP呢
有两种方案,
配置项都禅启旅是一样,在external.xml中(因为作者只使用external.xml所以在此配置,各位根据实际需要)
配置项为 ext-rtp-ip
像上图样例中,可以配置
注意同样有一个项叫ext-sip-ip,它是走sip的,是信令层使用的。这里我们只讨论RTP,所以配置ext-rtp-ip。
同样,可以配置为stun服务器地址,如
配置完毕后,可以登陆FS控制台,输入 sofia status profile external 来查看配置情况
网旁液路上有很多免费的stun server地址可以使用,那么是否可以工作呢?
有两个检查办法,
因为这个ext-rtp-ip是写入SDP中的,所以最直接的方式就是抓包,然后看信令中的SDP消息。下面是SDP样例如
⑧ WebRTC之STUN与TURN以及ICE
在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。
很多时候,我们希望处于不同内部网络中的两台主机能够直接进行通信,即所谓的P2P通信,避免通过其他公共服务器的中转的方式来降低实时通信的延迟。
由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。
这种技术通常称为NAT穿透(NAT Traversal),而更多关于NAT的介绍我们在《 WebRTC之NAT穿墙 》已经做了简单的介绍。
如果对NAT穿透还不了解的话建议先温习一下。
而今天的主角是STUN、TURN和ICE,它们是实现NAT穿透的不同技术方案。
STUN,首运唤昌先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。
在新的RFC5389修订中把STUN协议定位于为穿透NAT提供工具,而不是一个完整的解决方案,英文全称是Session Traversal Utilities for NAT,
即NAT会话穿透。STUN在RFC5389与RFC3489中除了名称变化外,最大的区别是在新的定义中支持TCP穿透。
STUN是典型的客户端/服务器模式,客户端发起请求,服务端进行响应,默认端口是3478。
两种STUN规范:分别是 RFC3489 和 RFC5389 。
RFC3489通过UDP进行穿墙。目前的服务器对于UDP的限制比较多,导致这种模式穿墙的成功率不高。
RFC5389是在RFC3489的升级版,但是含义确是不一样的,一系列的穿墙攻击,纳入了TCP穿墙。
所有的STUN消息都包含20个字节(每个字节占8位,总共是160位)的消息头,其中2个字节(也就是16位)的消息类型,
2个旁扒字节的消息长度,这个长度不包含消息头的长度还有16个字节的事务ID,请求与响应事务ID相同。
消息头之后就是是消息体,消息体可以是0或多个属性,每个属性进行TLV编码,包括16位的属性类型、16位的属性长度和变长属性值。
更加具体的消息交互协议笔者目前还不打算深入研究,因为目前我的目的是为了学习并使用WebRTC,还没到达弄清楚WebRTC的每一个细节点的高深境界。
四种主要NAT类型中有三种是可以使用STUN进行穿透:完全圆锥型NAT、受限圆锥型NAT和链则端口受限圆锥型NAT,对称型NAT则不能使用。
上面说到对称型NAT无法使用STUN成功进行穿透,这时候就需要TURN出场了。
TURN协议的目的就是为了解决对称型NAT无法穿越的问题。
TURN(Traversal Using Relay NAT,通过Relay方式穿越NAT),是一种数据传输协议。允许通过TCP或UDP方式穿透NAT。
TURN也是一个Client/Server协议,也和STUN使用同样的消息格式。
但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port",也就是中继转发地址。
这时TURN server会建立peer,即远端端点(remote endpoints),开始进行中继(relay)的动作,TURN client利用relay port将数据传送至peer,再由peer转传到另一方的TURN client。
说白了笔者觉得TURN协议更像一个中继转发协议,并不是真正意义上的P2P通信(不知道笔者这样的理解对不对)
ICE(Interactive Connectivity Establishment,互动式连接建立)。ICE定义了穿越方法而不是协议。
既然我们NAT穿透可以使用STUN也可以使用TURN,那么什么时候使用STUN什么时候使用TURN呢?这就是ICE做的事情。
更通俗地讲ICE更像一个NAT穿透的管理者,使用者只需要告诉ICE我要穿墙即可,至于怎么穿墙那就是ICE的事情了。
ICE整合了STUN与TURN。ICE使得两个NAT后的端点通信更加便捷。ICE使用STUN进行打洞,若失败,则使用TURN进行中转。
下面说说ICE的主要工作:
1、收集候选地址也就是收集Candidate
所谓的Candidate就是一个由IP和端口组成的地址。而Candidate又有三种类型:
2、对Candidate Pair进行排序
ICE收集到了候选者地址后,两个对等端都拥有了若干自己和对方的候选地址,并将其配对,组成Candidate Pair。
每对Candidate Pair都有对应的优先级,ICE需要对每对Candidate Pair进行优先级的排序。
3、对候选地址进行连通性检测
ICE对排序好的Candidate Pair进行发送检测和接收检测,发送和检测是同时进行的,如果发送消息出去之后还能收回和发送出去一样的信息则说明连通性是通的
《P2P技术详解(四):P2P技术之STUN、TURN、ICE详解》
微信公号:思想觉悟
⑨ 使用docker搭建STUN/TURN服务器
前言 STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT。 TURN,首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展 简单的说,TURN与STURN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。 ICE的全称Interactive Connectivity Establ.shment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。 STUN和TURN服务器和ICE可以参考阅读: P2P技术详解(三):P2P技术之STUN、TURN、ICE详解 本文介绍如何通过DOCKER搭建STUN和TURN服务器,步骤如下 1:创建Dockerfile,内容如下: FROM ubuntu:14.04 MAINTAINER Patxi Gortázar <[email protected]> RUN apt-get update && apt-get install -y \ curl \ libevent-core-2.0-5 \ libevent-extra-2.0-5 \ libevent-openssl-2.0-5 \ libevent-pthreads-2.0-5 \ libhiredis0.10 \ libmysqlclient18 \ libpq5 \ telnet \ wget RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz \ && tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz \ && dpkg -i coturn_4.4.2.2-1_amd64.deb COPY ./turnserver.sh /turnserver.sh ENV TURN_USERNAME test ENV TURN_PASSWORD test ENV REALM kurento.org ENV NAT true EXPOSE 3478 3478/udp ENTRYPOINT ["/turnserver.sh"] 2:创建turnserver.sh,内容如下 #!/bin/bash set-e if[$NAT="true"-a-z"$EXTERNAL_IP"];then #Try to get public IP PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)||echo"No public ip found on http://169.254.169.254/latest/meta-data/public-ipv4" if[-z"$PUBLIC_IP"];then PUBLIC_IP=$(curl http://icanhazip.com)||exit1 fi #Try to get private IP PRIVATE_IP=$(ifconfig|awk'/inet addr/{print substr($2,6)}'|grep -v 127.0.0.1)||exit1 exportEXTERNAL_IP="$PUBLIC_IP/$PRIVATE_IP" echo"Starting turn server with external IP:$EXTERNAL_IP" fi echo'min-port=49152'>/etc/turnserver.conf echo'max-port=65535'>>/etc/turnserver.conf echo'fingerprint'>>/etc/turnserver.conf echo'lt-cred-mech'>>/etc/turnserver.conf echo"realm=$REALM">>/etc/turnserver.conf echo'log-file stdout'>>/etc/turnserver.conf echo"user=$TURN_USERNAME:$TURN_PASSWORD">>/etc/turnserver.conf [$NAT="true"]&&echo"external-ip=$EXTERNAL_IP">>/etc/turnserver.conf exec/usr/bin/turnserver"$@" 3:使用docker build 创建镜像,执行结果如下 [root@www]# docker build -t teststurn_1 . Sending build context to Docker daemon 4.096kB Step 1/11 : FROM ubuntu:14.04 ---> 6e4f1fe62ff1 Step 2/11 : MAINTAINER Patxi Gortázar <[email protected]> ---> Using cache ---> 4460f9f84053 Step 3/11 : RUN apt-get update && apt-get install -y curl libevent-core-2.0-5 libevent-extra-2.0-5 libevent-openssl-2.0-5 libevent-pthreads-2.0-5 libhiredis0.10 libmysqlclient18 libpq5 telnet wget ---> Using cache ---> 05ed9ced48a5 Step 4/11 : RUN wget http://turnserver.open-sys.org/downloads/v4.4.2.2/turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && tar xzf turnserver-4.4.2.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz && dpkg -i coturn_4.4.2.2-1_amd64.deb ---> Using cache ---> d82ed28fdac9 Step 5/11 : COPY ./turnserver.sh /turnserver.sh ---> Using cache ---> 1d37a488282c Step 6/11 : ENV TURN_USERNAME test ---> Running in bfd88f08db42 Removing intermediate container bfd88f08db42 ---> cf8af0504b95 Step 7/11 : ENV TURN_PASSWORD test ---> Running in b8ef33b7c213 Removing intermediate container b8ef33b7c213 ---> 32a832f23169 Step 8/11 : ENV REALM kurento.org ---> Running in bbe129edf5b3 Removing intermediate container bbe129edf5b3 ---> 21fdfe34689b Step 9/11 : ENV NAT true ---> Running in 5bdfe8555d5e Removing intermediate container 5bdfe8555d5e ---> dc7fc896841c Step 10/11 : EXPOSE 3478 3478/udp ---> Running in 67aaa1966f68 Removing intermediate container 67aaa1966f68 ---> a12646ed45ff Step 11/11 : ENTRYPOINT ["/turnserver.sh"] ---> Running in b8fc2ff09265 Removing intermediate container b8fc2ff09265 ---> f5e5acad0f81 Successfully built f5e5acad0f81 Successfully tagged teststurn_1:latest 执行完后可以看到自己创建的镜像名称为teststurn_1 4:启动docker的镜像,并开启端口3478 docker run -d -p 3478:3478 -p 3478:3478/udp teststurn_1 启动后需要等待一两分钟才能测试顺畅 5:测试服务器效果 打开 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 并输入自己的本机IP和端口,分别测试两种协议服务是否生效⑩ MQTT作为WebRTC信令
Stun Server是开源的coTurn穿透服务器,Signal Server是开源的Apache Active MQ。
Signal Server用的是开源的Apache ActiveMQ,网上有很多花里胡哨的方法,这个是简单能搭建成功的过程, 搭建过程 。
穿透服务器用的是开源的coturn, 搭建过程
SDP交换
根据MQTT协议订阅发布机制:
订知辩衡阅同一个主题:(实现接收消息)
发布同一个主题:(实现发布消息)
对于每一个客户端来说唯一标示是ClientId,客户端发布消息时设置的主题也是ClientId.
1、客户端连接到ActiveMQ服务器
这里的ClientId,就是在ActiveMQ服务端添加的
这里主要灶困是连接到ActiveMQ的流程
首先,呼叫方initCall,主要作用是创建PeerConnection对象,设备,将音视频数据封装成MediaStream添加到然后打开本地音视频PeerConnection中,显示呼叫搭做页面。
然后呼叫方startCall,主要作用是CreateOffer,SendOffer,所以要发布Topic:呼叫方Message;
假如ClientA呼叫ClientB,首先ClientA订阅主题ClientB,然后ClientB订阅主题ClientA。
Client A给Client B发送消息时,发布主题Client_A_ID和Message。
Client B给Client A发送消息时,发布主题Client_B_ID和Message。
zjf001连接到服务器
根据前面文章,看一下基本流程