1.WebRTC后台服务:
  • 通话的房间服务器(Room Server)
    房间服务器是用来创建和管理通话会话的状态维护,是双方通话还是多方通话,加入与离开房间等等,我们暂时沿用Google部署在GAE平台上的AppRTC这个房间服务器实现,该GAE App的源码可以在github.com上获取.该实现是一个基于Python的GAE应用,我们需要下载Google GAE的离线开发包到我们自己的Linux服务器上来运行该项目,搭建大陆互联网环境下的房间服务器.
  • 通话的信令服务器(Signaling Server)
    信令服务器是用来管理和协助通话终端建立去中心的点对点通话的一个角色.这个角色要负责一下任务:

1. 用来控制通信发起或者结束的连接控制消息2. 发生错误时用来相互通告的消息3. 各自一方媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等4. 两两之间用来建立安全连接的关键数据5. 外界所能看到的网络上的数据,比如广域网IP地址、端口等信令服务器的具体协议实现没有严格规定,只要实现功能就OK.我们这里依然沿用Google提供的基于GO语言和WebSocket的信令服务器Collider.和上面的房间服务器一并在Github上可以获取.获取到我们自己的Linux服务器上用GO语言的运行环境来运行该信令服务器.
  • 防火墙打洞服务器(STUN/TURN/ICE Server)
    我们目前大部分人连接互联网时都处于防火墙后面或者配置私有子网的家庭(NAT)路由器后面,这就导致我们的计算机的IP地址不是广域网IP地址,故而不能相互之间直接通讯. 正因为这样的一个场景,我们得想办法去穿越这些防火墙或者家庭(NAT)路由器,让两个同处于私有网络里的计算机能够通讯起来.

STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越); STUN协议服务器就是用来解决这些问题:

  • 探测和发现通讯对方是否躲在防火墙或者NAT路由器后面.
  • 确定内网客户端所暴露在外的广域网的IP和端口以及NAT类型等信息;STUN服务器利用这些信息协助不同内网的计算机之间建立点对点的UDP通讯.

STUN协议可以很好的解决一般家用(NAT)路由器环境的打洞问题,但是对于大部分的企业的网络环境就不是很好了.

这时需要一个新的解决方案:TURN(Traversal Using Relay NAT,允许在TCP或UDP的连线上跨越 NAT 或防火墙. TURN是一个Client-Server协议。TURN的NAT穿透方法与STUN类似,都是通过取得应用层中的公有地址达到NAT穿透,但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port",也就是relayed-transport-address.这时 TURN server会建立peer,即远端端点(remote endpoints),开始进行中继(relay)的动作,TURN client利用relay port将资料传送至peer,再由peer转传到另一方的TURN client.通过服务器新产生的peer来进行数据的中转.

ICE协议就是综合前面2种协议的综合性NAT穿越解决方案.

通过offer/answer模型建立基于UDP的通讯。ICE是offer/answer模型的扩展,通过在offer和answer的SDP(Session Description Protocol)里面包含多种IP地址和端口,然后对本地SDP和远程SDP里面的IP地址进行配对,然后通过P2P连通性检查进行连通性测试工作,如果测试通过即表明该传输地址对可以建立连接。其中IP地址和端口(也就是地址)有以下几种:本机地址、通过STUN服务器反射后获取的server-reflexive地址(内网地址被NAT映射后的地址)、relayed地址(和TURN转发服务器相对应的地址)及Peer reflexive地址等。

2.房间服务器与信令服务器搭建:

我们把这一系列后台服务器搭建在公网的一个UbuntuLinux服务器中.

服务器的代码我们选用GoogleChrome的开源项目,该项目可以在Github找到:

https://github.com/GoogleChrome/webrtc

该项目的一些示例可以在下面网址得到:

http://googlechrome.github.io/webrtc/

在我们自己的服务器中运行Google的房间服务器AppRTC需要依赖 Google App Engine SDK forPython和 Grunt.

先搭建房间服务器AppRTC
  • 首先我们安装Grunt:
cheetah@localhost:~/$sudo apt-get install npmcheetah@localhost:~/$sudo apt-get install nodejs-legacycheetah@localhost:~/$sudo npm -g install grunt-cli
  • 下载该项目的源码到某个目录:
cheetah@localhost:~/$cd~;cheetah@localhost:~/$git clonehttps://github.com/GoogleChrome/webrtc.git;
  • 终端Shell切换当前工作目录到上一步的下载的项目目录webrtc下,然后安装Grunt以及Grunt的依赖:
cheetah@localhost:~/$cdwebrtc;cheetah@localhost:~/webrtc$npm install;
  • 运行AppRTC房间服务器之前我们需要Grunt编译一下该项目的js文件之类:
cheetah@localhost:~/webrtc$grunt;

上面的编译过程会自动下载安装Google App Engine SDK至当前目录.

cheetah@localhost:~/webrtc$lsbower.json google_appengine Gruntfile.jsLICENSE.md README.md samplesbuild google_appengine_1.9.17.zipimages node_modulesrun_python_tests.pywebtest-masterCONTRIBUTING.mdgrunt-chrome-build index.html package.jsonrun_python_tests.shwebtest-master.tar.gz

下一步,我们需要把Google App Engine SDK的目录加入系统环境变量$PATH,并使之生效.

cheetah@localhost:~/webrtc$echo"export PATH=$PATH:$PWD/google_appengine"> ~/.bash_profilecheetah@localhost:~/webrtc$source~/.bash_profile

这个时候我们就可以直接运行我们的房间服务器AppRTC了.用下面的命令来开启(主机名:vpn.wuqiong.tk可以用自己的给我钱IP地址代替):

cheetah@localhost:~/webrtc$dev_appserver.py --host vpn.wuqiong.tksamples/web/content/apprtc/
再搭建信令服务器

信令服务器我们依然采用Google Chrome WebRTC项目里提供的用Go语言编写的基于websocket的信令服务器:Collider.

我们需要先安装go语言运行环境支持:

cheetah@localhost:~/webrtc$sudo apt-get install golang-go

然后在我们的用户目录新建一个目录(collider_root)来存放这个Collider的go代码程序.

cheetah@localhost:~/webrtc$mkdir -p ~/collider_root;cheetah@localhost:~/webrtc$exportCOLLIDER_ROOT=$HOME/collider_root; //也可以加入~/.bash_profile

下一步就是链接wenrtc项目目录下面的collider代码目录到$COLLIDER_ROOT/src下去,准备后续的编译工作;

cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collider$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collidermain$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collidertest$COLLIDER_ROOT/src/

一切准备之后,我们就主要编译安装Collider了:

cheetah@localhost:~/webrtc$go get collidermaincheetah@localhost:~/webrtc$go install collidermain

这个时候,信令服务器的二进制程序就安装到了$COLLIDER_ROOT/bin下去了. 如下命令就可以开启运行信令服务器:

cheetah@localhost:~/webrtc$ $COLLIDER_ROOT/bin/collidermain -port=8089-tls=false

信令服务器暂时用非tls方式运行.因为我们自签名的证书Websocket通讯不了.

3.STUN/TURN/ICE服务器的搭建

我们选择有更丰富功能的coTurn作为我们的NAT穿越打洞服务器,该项目是一个C/C++语言的开源项目,项目地址:https://code.google.com/p/coturn/或者我们直接下载已经编译好的软件包,在下面站点可以下载我们对应平台的软件包:http://turnserver.open-sys.org/downloads/v4.4.1.2/打开这个网址,根据我们的服务器类型选择下载,我现在选择Debian和Ubuntu系统的包:

cd~;wgethttp://turnserver.open-sys.org/d ... t-x86-64bits.tar.gz

接着解压软件包:

tar xvfz turnserver-4.4.1.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz

详细阅读安装手册 INSTALL 文件,根据指导进行安装:

$sudo apt-get update$sudo apt-get install gdebi-core$sudo gdebi coturn*.deb

然后编辑配置文件,打开系统默认启动配置:

$vim /etc/default/coturn

把上面打开编辑的文件中的这一行TURNSERVER_ENABLED=1去掉注释,保存退出.

再根据实际情况编辑coturn的配置文件 /etc/turnserver.conf,比如我打开的配置项如下:

listening-device=eth0listening-ip=~~106.186.127.xxx~~relay-device=eth0relay-ip=~~106.186.127.xxx~~Verbosefingerprintlt-cred-mechuse-auth-secretstatic-auth-secret=diveineduuser=diveinedu:0x06b2afcf07ba085b7777b481b1020391user=diveinedu:diveinedustale-noncecert=/etc/turn_server_cert.pempkey=/etc/turn_server_pkey.pemno-loopback-peersno-multicast-peeRSSha256mobilityno-cli

上面cert和pkey配置的自签名证书用Openssl命令生成:

sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days99999-nodes

穿墙服务器的一切配置完成之后,万事俱备,之前启动命令了:

service coturn start;
房间服务器和信令服务器的设置

三个服务器都搭建完成之后,我们需要多一定的整合配置,使他们能一起工作: apprtc目录下的constants.py是一些常量配置信息的配置文件,比如我的做了如下设置:

#TURN_BASE_URL = 'https://computeengineondemand.appspot.com'TURN_BASE_URL='http://apprtc.diveinedu.com'#TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'TURN_URL_TEMPLATE='%s/turn.PHP?username=&key='#CEOD_KEY = '4080218913'CEOD_KEY='diveinedu'#WSS_HOST_PORT_PAIR = 'apprtc-ws.webrtc.org:443'WSS_HOST_PORT_PAIR='apprtc.diveinedu.com:8089'

由于我们的信令服务器没有开启安全Socket模式,所以我们要对应的改一下apprtc的代码,做apprtc.py中如下修改:

defget_wss_parameters(request):ws_host_port_pair=request.get('wshpp')ws_tls=request.get('wstls')ifnotws_host_port_pair: ws_host_port_pair=constants.WSS_HOST_PORT_PAIRifws_tlsandws_tls=='false': wss_url='ws://'+ws_host_port_pair+'/ws' wss_post_url='http://'+ws_host_port_pairelse: wss_url='http://'+ws_host_port_pairreturn(wss_url,wss_post_url)

把原来的wss和https的scheme都改为ws和http,不要让客户端或者浏览器去使用SSL链接.当然,如果有第三方根证书的签名机构颁发的证书,那就不需要这样了

而对应的信令服务器也需要稍微做设置: 编辑collider/collidermain/main.go,修改设置自己的房间服务器URL:

//var roomSrv = flag.String("room-server","https://apprtc.appspot.com","The origin of the room server")varroomSrv = flag.String("room-server","http://apprtc.diveinedu.com:8080/",68); word-wrap:break-word">"The origin of the room server")

经过这一些简单的房间服务器和信令服务器的定制设置之后,我们就搭建了一套基于Google项目的属于自己的WebRTC的简单服务了.

用谷歌浏览器打开http://apprtc.diveinedu.com:8080/,注册房间之后就可以视频通话了.当然结合之前的WebRTC foriOS框架就可以浏览器和ios的原生应用直接视频通话了.

搭建webrtc服务器(ubuntu14.04)的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – Objective-C中的Google用户serverAuthCode nil

    我正在尝试将GoogleSignIn框架集成到iOS应用程序中,并对服务器上的用户进行身份验证.我设法登录用户,但在–(void)signIn:(GIDSignIn*)signIndidSignInForUser:(GIDGoogleUser*)用户withError:(NSError*)错误委托方法,user.serverAuthCode为nil,我需要通过此服务器身份验证代码,嗯,验证服务器上

  3. 在iOS上构建WebRtc

    msg/discuss-webrtc/VJg-fk2-i_0/dtG200DOzsgJ但步骤不明确.某人可以总结这些步骤,以便将来对所有人都有用吗?解决方法我写了一篇详细的博客文章,其中包含有关如何构建WebRTC示例iOS应用程序的所有说明,以及如何在iOS模拟器或实际的iOS设备上运行它.你可以takealookhere阅读细节,这是一个非常漫长的过程.

  4. ios – CloudKit – 如何保存记录如果不存在

    我正在尝试创建一个包含唯一值的记录类型,并将作为另一个记录类型的目标引用对象.例如,录制类型–电影将包含用户提交的唯一电影列表.而且FavoriteMovies将包含用户参考和电影参考.用户可以从现有电影列表中进行选择,也可以向其中添加新电影.如果我创建一个新的电影记录,而另一个用户创建一个具有相同名称的新记录(在我检索电影列表之后,但在我尝试添加新电影之前),则会出现问题.这两个新记录被认为是具

  5. ios – 可以在iPhone上使用Web RTC,如果是这样,怎么样?

    可以在iPhone上使用WebRTC,如果是这样,怎么样?我们如何在iPhone中集成WebRTC.解决方法有一些适用于iOS的基于WebRTC的SDK.看看这篇文章:http://bloggeek.me/webrtc-fit-ios/

  6. 让你真正明白cinder与swift、glance的区别

    Cinder——提供块存储,类似于Amazon的EBS块存储服务,目前仅给虚机挂载使用。Cinder包含以下三个主要组成部分APIservice:Cinder-api是主要服务接口,负责接受和处理外界的API请求,并将请求放入RabbitMQ队列,交由后端执行。Cinder目前提供VolumeAPIV2Schedulerservice:处理任务队列的任务,并根据预定策略选择合适的VolumeService节点来执行任务。目前版本的cinder仅仅提供了一个SimpleScheduler,该调度器选择卷数量

  7. swift – 如何编码非托管到base64以发送到另一台服务器?

    我正在尝试使用密钥对加密来验证我的应用程序和我的PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.publicKey的类型为Unmanaged.我在上面的代码中得到的错误是:调用中的额外参数’base64EncodedData’我该怎么办?有没有更好的办法?编辑:这是密钥对的生成方式:编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?您似乎可以将密钥临时存储到钥匙串,然后将其恢复并将其转换为数据:

  8. QuickBlox WebRtc VideoChat Android

    几天我正在研究quickblox.i让对手观点在我的观点下面,如this.它工作正常,但是当我保持像skype这样的视图时:–对手视图在全屏幕上,我的视图位于对手视图的右上角,它只渲染一个最终渲染的视图.我在quickblox网站上看了quickbloxwebrtc示例.我看到了该示例中的代码,但它包含了一些会议对话,其中包含一些复杂的循环视图编码,对我来说,单个一对一的谈话是必需的,任何人都可以

  9. 如何在android中设置多个SMTP服务器?

    我的问题是如何设置多个SMTP服务器在Android中发送邮件,如:雅虎,hotmail,gmail,rediff任何类型的域名将在发送邮件时起作用.任何人都可以建议任何网站或任何想法吗?请帮帮我,谢谢你.解决方法以下是GMail,Yahoo!的测试设置.和Hotmail.使用适用于Android的JavaxMail端口进行测试.

  10. 如何在Android服务器上发布大型视频?

    我想发布一个大视频.我正在使用FTP将视频发送到服务器,但上传会在一段时间后停止.在服务器上视频崩溃,但我可以上传较小的视频.我还使用HTTP将视频发送到服务器,作为Base64编码字符串发送,但编码时出现内存不足异常.我试图将视频上传为文件,但没有成功.将大型视频上传到服务器的最佳方法是什么?

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部