WebRTC服务器搭建

音视频直播技术专家 · · 11628 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

最近研究了几天 appr.tc 服务器的搭建,主要目的是想在本地搭建一套 webrtc 服务器环境,可以做一些webrtc相关的实验。

经过几天的折腾,得到以下几点结论:
一、最新的 appr.tc服务器是不能使用 https服务的。主要有两种原因:1. chrome浏览器不支持在非https方式下打开音/视频设备。2. appr.tc中的信令服务器(collider)不支持非 https 服务。
二、appr.tc服务器的搭建仅支持浏览器之间互通,移动端与浏览器之间是无法互通的,主要是ssl 证书问题。如果那位对 ssl证书比较熟悉的话,可以与我联系,咱们一起再重新做个实验。

下面我就来描述一下如何搭建 appr.tc 服务。

几个重要的库

在具体介绍 appr.tc服务如何搭建之前,我们先来了解几个基本概念。

Google Cloud SDK

按照 google 官方的说法,Google Cloud SDK 是一套非常好用的使用 python 管理 App Engine applications 的工具集。gcloud包括本地布署server以及布署和管理你的应用的命令行工具。

其实我并不这么认为,我觉得使用它增加了我的学习成本。当遇要问题时,我其实对它是束手无策的。

我们可以认为它就是一套布署工具,可以帮我们布署和启动服务程序。我们使用它布署启动 room 服务器。

AppRTC

房间与信令服务器。该服务器包括了房间的业务逻辑和信令处理逻辑。其中在 AppRTC中的 collier 目录中是信令服务器的实现。

除了 collider 命令服务器外,其它的代码都是用python写的。

Collider

是一种用 go 语言实现的基于 WebSocket 的命令服务器。要了解 WebSocket 协议可以看这篇文章 WebSocket协议:5分钟从入门到精通

Coturn

Coturn 是一种TURN服务器(也就是中转服务器),该服务器用于VoIP或通用数据流的NAT穿越和数据转发。

所以总结起来 appr.tc服务包括了room服务器(apprtc)、信令服务器(collider)、NAT穿越与数据转发服务器(coturn)

grunt

grunt是一种可以帮助我们解决 JavaScript 的开发过程中,经常会遇到一些重复性的任务,比如合并文件、压缩代码、检查语法错误、将Sass代码转成CSS代码等等。

Grunt能够按照预先设定的顺序自动运行一系列的任务。这可以简化工作流程,减轻重复性工作带来的负担。
Grunt基于Node.js,安装之前要先安装Node.js

如何搭建 appr.tc 服务器

  1. 从 git 上 Clone AppRTC。在代码中包括了 room服务器和collider信令服务器。
  2. 安装、布署、启动 Collider ,这一步比较复杂。
    • 安装 Go 工具,并创建工作空间。在 ubuntu 下安装 Go 比较简单,如 apt install golang-1.10-go。 创建的 go 工作空间,如:export GOPATH=$HOME/goWorkspace/ 。它包括两个子目录,分别是 binsrc
      • bin : 该子目录中存放编译后的可执行文件。
      • src : 该子目录中存放 go 项目源文件。
    • 链接 collider 目录下的子目录到 $GOPATH/src下
      ln -s `pwd`/apprtc/src/collider/collider $GOPATH/src
      ln -s `pwd`/apprtc/src/collider/collidermain $GOPATH/src
      ln -s `pwd`/apprtc/src/collider/collidertest $GOPATH/src
      
    • 安装依赖
      go get collidermain
      
    • 编译安装 collidermain
      go install collidermain
      
    • 布署 collider 服务
      1. 创建 /collider 和 /cert 目录 (如:sudo mkdir -p /collider, sudo mkdir -p /cert)
      2. 拷由 $GOPATH/bin/collidermain 到 /collider 目录
      3. 创建 ssl 证书。创建证书的命令如下:sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out /etc/cert.pem -days 99999 -nodes
      4. 将证书命名为 cert.pem 和 key.pem 并拷到 /cert 目录中。注:文件名和目录可以到 collider/collider.go文件中修改(通过搜索关键字 cert 找到修改的位置)
    • 启动 collider 信令服务器
      /collider/collidermain -port=8089 -tls=true -room-server="https://ip:port"
      
      当然,你还可以修改 collider/collidermain/main.go 文件,文件中的tls, port, room-server分别对应上面命令行中的参数。也就是说,如果在启动命令中不加任何参数,它就会使用 main.go中设置的参数,否则使用命令行中指定的参数。

注:在网上看到很多文章说 collider 可以将tls设置为 false,经我亲测,将 tls设置为 false后,collider就不能正常工作了,如果有成功的可以与我联系。

  1. 安装并启动 Coturn TURN server
    • 首先,下载Coturn源码

    • 编译并安装
      进入到Coturn源码目录下

      ./configure --prefix=/usr/local/turnserver 
      sudo make && sudo make install
      
    • 设置好 Coturn 配置

      #本地监听的网卡设备,这里根据自己的实际情况填写
      listening-device=eth1
      listening-port=3478
      #本地用于转发的网卡设备,这里根据自己的实际情况填写
      relay-device=eth1
      #指定的转发端口的分配范围,测试时,可以将防火墙全部关闭,防止 UDP 端口被屏蔽
      min-port=3480
      max-port=3500
      #日志输出级别,turnserver 启动时加上 -v,可以得到更清晰的日志输出
      Verbose
      #消息验证,WebRTC 的消息里会用到
      fingerprint
      #webrtc 通过 turn 中继,必须使用长验证方式
      lt-cred-mech
      # ICE REST API 认证需要(如果打开了这行,turn就不工作了)
      # use-auth-secret
      # REST API 加密所需的 KEY
      # 这里我们使用“静态”的 KEY,Google 自己也用的这个(如果找开这个就不工作了)
      #static-auth-secret=4080218913
      #用户登录域,下面的写法可以不改变它,因为再启动 turnserver 时,可以通过指定参数覆盖它
      realm=<填写你自己的域名>
      #可为 TURN 服务提供更安全的访问(这个我没用,不知道干啥的)
      #stale-nonce
      #在Coturn代码中的/etc/examples/目录下有秘钥文件,可以直接用
      cert=/usr/local/turnserver/etc/turn_server_cert.pem
      pkey=/usr/local/turnserver/etc/turn_server_pkey.pem
      #屏蔽 loopback, multicast IP地址的 relay
      no-loopback-peers
      no-multicast-peers
      #启用 Mobility ICE 支持(不懂)
      mobility
      #禁用本地 telnet cli 管理接口
      no-cli
      
    • 启动Coturn服务

      sudo turnserver -v /etc/turnserver.conf
      

      还可以用下面的命令启动,这样就不用写配置文件了,命令如下:

      sudo turnserver -v -L ip  -a -f -r north.gov
      

      通过 -v 指定日志输出级别; -L 指定用于绑定的网卡 IP 地址;-a 指定使用长期凭证机制,turn中继转发模式,必须使用长期凭证机制;-f 指定 turn 消息使用 fingerprint;-r 指定使用的域名,将覆盖 turnserver.conf 文件中的配置;

    • 创建用户

      sudo turnadmin -a -u 用户名 -p 密码 -r 域(随便写一个)
      

      可以使用下面的命令查看创建的用户

      turnadmin -l
      
    • 测试 Coturn 服务

      1. 打开 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/这个网址
      2. 在该网址上增加 turn 服务。如 turn:172.16.126.139:3478
      3. 填入用户名密码
  2. 布署与启动 room 服务(appr.tc)
    • 下载 Google app engine SDK for Python
    • 安装 node.js
      sudo apt-get install nodejs
      sudo apt-get install nodejs-legacy
      
    • 安装 grunt
      sudo apt-get install npm
      sudo npm -g install grunt-cli
      
    • 打开 src/app_engine/constants.py 修改以下内容:
      ICE_SERVER_BASE_URL = 'https://ip:port'
      ICE_SERVER_URL_TEMPLATE = '%s/iceconfig?key=%s'
      ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')
      
      以及
      # Dictionary keys in the collider instance info constant.
      WSS_INSTANCE_HOST_KEY = 'host_port_pair'
      WSS_INSTANCE_NAME_KEY = 'vm_name'
      WSS_INSTANCE_ZONE_KEY = 'zone'
      WSS_INSTANCES = [{
             WSS_INSTANCE_HOST_KEY: 'IP:PORT',
             WSS_INSTANCE_NAME_KEY: 'wsserver-std',
             WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
      }]
      
    • 编译 apprtc
      修改了 appr.tc 的代码后,使用 grunt build 进行编译,在 apprtc 目录下执行下面命令:
      sudo npm install
      sudo grunt build
      
    • 使用下面的命令进行布署
      <path to sdk>/dev_appserver.py --host 0.0.0.0 --enable_host_checking=no --ssl_certificate_path=/xxx/cert.pem --ssl_certificate_key_path=/xxx/key.pem  ./out/app_engine
      

小结

总的来说,配置 appr.tc 服务还是蛮复杂的。到现在为止我没有解决移动端与浏览器之间互通的问题。总是报证书错误。
在网上有看到说自己私签的证书在移动端是无法正常工作的,不知是否是这个样子?

另外,由于不能进行浏览器与移动端互通,所以上面的步骤中还少了 ICE REST API相关的配置。这块内容可以参考其它网友的文章。

参考资料


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:音视频直播技术专家

查看原文:WebRTC服务器搭建

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11628 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传