首先AppRTC 是 webrtc 的一个 demo,我们用这个demo来验证安装的正确性。

AppRTC 的组成部分是这样的:
1、AppRTC - 房间服务器。
2、Collider - 信令服务器。上面 Github 工程里自带,在 src/collider 下
3、coTurn - 打洞(内网穿透)服务器。传送门
4、还需要自己实现一个 coTurn 连接信息(主要是用户名、密码的配置)获取接口,通常叫做 TURN REST API。


准备工作
1、AppRTC 依赖 gruntGoogle AppEngine SDK for Python 离线版本
GAE SDK 安装很简单:下载、解压、添加到PATH环境变量即可完成。(谷歌已经关闭新应用的申请,不过好像不影响使用)
grunt,是 Node.js 下的一套任务执行系统,经过 Gruntfile.js 的配置,可以做很多事情。首先安装 Node.js。使用 nvm 可以很方便的为自己的 Linux 账户安装并设置好 Node.js。(而后,你可以选择安装 cnpm,这样就可以使用国内的缓存节点,npm install 命令会快许多,如果你只用这一次 grunt,那么不装这个也是可以的。)接下来只需要执行一个 npm install -g grunt-cli 即可安装好 grunt。
2、Collider 依赖 golang。尿性的问题来了:墙……安装 golang 和日后使用 golang 所需的包,几乎都要翻墙。所以这里解决掉墙这个问题后,再使用 gvm 安装 golang 即可完成我们的准备工作。


一. coTurn

http://turnserver.open-sys.org/downloads/v4.5.0.3/上下载对应的版本,我们用的是turnserver-4.5.0.3-CentOS7.1-x86_64.tar.gz

解压,直接运行install.sh

安装完后编辑配置文件/etc/turnserver/turnserver.conf


# 记得开防火墙
min-port=59000
max-port=65000
# 更繁杂的输出日志
Verbose
# WebRTC 的消息里会用到
fingerprint
# WebRTC 认证需要
lt-cred-mech
# REST API 认证需要
use-auth-secret
# REST API 加密所需的 KEY
# 这里我们使用“静态”的 KEY,Google 自己也用的这个
static-auth-secret=4080218913
# 用户登录域
realm=
# 可为 TURN 服务提供更安全的访问
stale-nonce
# SSL 需要用到的, 生成命令:
# sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
cert=/etc/turn_server_cert.pem
pkey=/etc/turn_server_pkey.pem
# 屏蔽 loopback, multicast IP地址的 relay
no-loopback-peers
no-multicast-peers
# 启用 Mobility ICE 支持(具体干啥的我也不晓得)
mobility
# 禁用本地 telnet cli 管理接口
no-cli


最后systemctl start turnserver来启动

二. coTurn 连接信息接口(TURN REST API)

新建coTurn.js


var express = require('express');
var crypto = require('crypto');
var app = express();
var hmac = function(key, content){
    var method = crypto.createHmac('sha1', key);
    method.setEncoding('base64');
    method.write(content);
    method.end();
    return method.read();
};
app.get('/turn', function(req, resp) {
var query = req.query;
var key = '4080218913'; // 这里的 key 是事先设置好的, 与房间服务器的key相同
if (!query['username']) {
    return resp.send({'error':'AppError', 'message':'Must provide username.'});
} else {
    var time_to_live = 600;
    var timestamp = Math.floor(Date.now() / 1000) + time_to_live;
    var turn_username = timestamp + ':' + query['username'];
    var password = hmac(key, turn_username);
    return resp.send({
        username:turn_username,
        password:password,
        ttl:time_to_live,
        "uris": [
            "turn:121.40.28.178:3478?transport=udp",
            "turn:121.40.28.178:3478?transport=tcp",
            "turn:121.40.28.178:3479?transport=udp",
            "turn:121.40.28.178:3479?transport=tcp"
            ]
    });
}
});
app.listen('81', function(){
    console.log('server started');
});


最后用node启动程序

三、信令服务器

参考https://github.com/webrtc/apprtc/tree/master/src/collider,照做就行,注意要先安装go语言环境

软连接不成功的可以直接把文件复制到目标文件夹

运行时-tls=false,不然需要证书


$GOPATH/bin/collidermain -port=8089 -tls=false


四、AppRTC房间服务器

安装过程参考https://github.com/webrtc/apprtc


  1. 修改apprtc/src/app_engine/apprtc.py
    搜索 "wss:" 和 "https:" (注意冒号)
    可以在方法 get_wss_parameters 里搜索到,这里需要把 wss: 替换成 ws:、把 https: 替换成 http:,保存退出,就可以了。(此处为了测试方便去掉了s)

  2. 修改apprtc/src/app_engine/constants.py

    ① 搜索 TURN_BASE_URL
    将等号后面的字符串替换为 apprtc 可以访问到的地址,如:'http://apprtc.domain.com:8083'

    ② 搜索 WSS_INSTANCES
    可以看到,这里被配置为了一个数组,不过我们只有单台服务器。所以先删掉数组的其他元素,只保留一个。
    在保留下来的元素中,我们只修改 WSS_INSTANCE_HOST_KEY 对应的值即可。
    将其改为上面 Collider 服务器的可访问地址。比如:apprtc.domain.com:8089。不需要协议,没有 URI。
    ③CEOD_KEY要和上面TURN REST API中的key相同

    保存退出

  3. 在apprtc文件夹下编译npm installgrunt build -force
    在google_appengine文件夹下执行/dev_appserver.py
    如果要外网访问,加上host和端口,如:./dev_appserver.py --host 121.40.28.178 --port 80 --admin_host 121.40.28.178  /root/apprtc/out/app_engine/

  4. 参照上面的配置,在浏览器中打开http://121.40.28.178即可访问