这两天测试了下webrtc的效果,不知道是不是手机比较渣,画面并不是很清晰,先来说说服务器的部署。部署环境ubuntu14.04 32位。
一、服务器组成
1、AppRTC 房间服务器 https://github.com/webrtc/apprtc
2、Collider 信令服务器 上边源码里自带
3、coTurn 穿透服务器 https://github.com/coturn/coturn
4、需要自己实现coTurn连接信息接口,主要返回用户名、密码和turn配置信息,通常叫做TURN REST API,不实现这个接口的话AppRTCDemo连不上服务器,浏览器访问的话可以正常访问。
二、AppRTC房间服务器
1、下载代码
2、安装依赖
sudo apt-get install nodejs
sudo npm install -g npm
sudo apt-get install nodejs-legacy
sudo npm -g install grunt-cli
切换到源码目录
cd apprtc-master
npm install
sudo apt-get install python-webtest
grunt build
编译之后会多出out目录
运行还依赖 Google App Engine SDK for Python 需翻墙
下载完后设置环境变量
sudo gedit /etc/profile
export PATH=$PATH:/home/google_appengine
source /etc/profile
3、修改配置文件
主要是src/app_engine目录下的apprtc.py和constants.py
首先是constants.py:
修改TURN_BASE_URL = 'http://192.168.214.129:80' 这个是上边提到的连接信息接口的地址
TURN_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'
CEOD_KEY = 和coturn turnserver.conf static-auth-secret一致
WSS_INSTANCES = [{
WSS_INSTANCE_HOST_KEY: '192.168.214.129:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std',
WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {
WSS_INSTANCE_HOST_KEY: '192.168.214.129:8089',
WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]
apprtc.py:
修改get_wss_parameters(request) 下的
if wss_tls and wss_tls == 'false':
wss_url = 'ws://' + wss_host_port_pair + '/ws'
wss_post_url = 'http://' + wss_host_port_pair
else:
wss_url = 'ws://' + wss_host_port_pair + '/ws'
wss_post_url = 'http://' + wss_host_port_pair
主要是把原来的wss和https的scheme都改为ws和http,不要让客户端和浏览器去使用ssl连接,如果有第三 方根证书的签名机构颁发的证书就不需要这样了。
修改完后重新grunt build下。
4、启动
dev_appserver.py --host=0.0.0.0 ./out/app_engine
三、Collider信令服务器
1、安装依赖
sudo apt-get install golang-go
2、在home目下创建文件夹
mkdir -p ~/collider_root 并在collider_root目录下创建src目录
设置GOPATH环境变量 export GOPATH=~/collider_root
将apprtc/src/collider目录下的三个文件夹都拷贝到collider_root/src下
进入到collider_root/src,开始编译安装collider,准备好翻墙
go get collidermain
go install collidermain
成功编译后会在collider_root目录下生成bin和pkg目录,执行文件在bin下。
3、运行
修改collider_root/src/collidermain/main.go填上自己ip地址
var roomSrv = flag.String("room-server", "http://192.168.214.129:8080/", "The origin of the room server")
启动
~/collider_root/bin/collidermain -port=8089 -tls=false
四、coTurn 打洞服务器
1、下载http://turnserver.open-sys.org/downloads/
找个适合自己linux系统的,我这里是ubuntu32位所以选了turnserver-4.2.1.2-debian-wheezy-ubuntu-mint-x86-32bits.tar.gz
下载完后解压进入解压目录
cat INSTALL 查看安装须知
sudo apt-get install gdebi-core
sudo gdebi coturn_4.2.2.2-1_i386.deb
2、编辑配置文件
sudo gedit /etc/turnserver.conf
listening-device=eth0
listening-port=3478
relay-device=eth1
min-port=49152
max-port=65535
Verbose
fingerprint
lt-cred-mech
use-auth-secret
static-auth-secret=填写自己的密钥可不修改
stale-nonce
cert=/usr/local/etc/turn_server_cert.pem
pkey=/usr/local/etc/turn_server_pkey.pem
no-loopback-peers
no-multicast-peers
mobility
no-cli
3、生成签名证书
sudo openssl req -x509 -newkey rsa:2048 -keyout/usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes
4、启动
service coturn start
五、coTurn连接信息接口
TURN REST API 标准参考文档
返回json结果示例:
{"username":"1456904882:1231244","password":"jAph7EHMLuPJuxLLC1uRiI3kvq4=","ttl":86400,"uris":["turn:192.168.214.129:3478?transport=udp","turn:192.168.214.129:3478?transport=tcp","turn:192.168.214.129:3479?transport=udp","turn:192.168.214.129:3479?transport=tcp"]}
1、username字段需要以timestamp + ":" + username的形式输出
2、响应的 password 字段,需要以 HMAC-SHA1 算法计算得出,公式为:【base64_encode( hmac( key,
username ) )】。此处的 key,为 coTurn 服务器配置中的 “static-auth-secret”值。以 key 作为 hmac 算法的密钥,turn-username 为被计算的内容,得出的 hmac 摘要后,经 base64 编码得到最终密码。
3、uris为后台配置好的,我这里写死
4、很简单的接口,用惯了java,这里我准备用php,写起来比java快
-
-
-
$request_username = $_GET[ "username"];
-
if( empty($request_username)) {
-
echo "username == null";
-
exit;
-
}
-
$request_key = $_GET[ "key"];
-
$time_to_live = 600;
-
$timestamp = time() + $time_to_live; //失效时间
-
$response_username = $timestamp. ":".$_GET[ "username"];
-
$response_key = $request_key;
-
if( empty($response_key))
-
$response_key = "密钥"; //constants.py中CEOD_KEY
-
-
$response_password = getSignature($response_username, $response_key);
-
-
$jsonObj = new Response();
-
$jsonObj->username = $response_username;
-
$jsonObj->password = $response_password;
-
$jsonObj->ttl = 86400;
-
$jsonObj->uris = array( "turn:192.168.214.129:3478?transport=udp", "turn:192.168.214.129:3478?transport=tcp", "turn:192.168.214.129:3479?transport=udp", "turn:192.168.214.129:3479?transport=tcp");
-
-
echo json_encode($jsonObj);
-
-
/**
-
* 使用HMAC-SHA1算法生成签名值
-
*
-
* @param $str 源串
-
* @param $key 密钥
-
*
-
* @return 签名值
-
*/
-
function getSignature($str, $key) {
-
$signature = "";
-
if (function_exists( 'hash_hmac')) {
-
$signature = base64_encode(hash_hmac( "sha1", $str, $key, true));
-
} else {
-
$blocksize = 64;
-
$hashfunc = 'sha1';
-
if (strlen($key) > $blocksize) {
-
$key = pack( 'H*', $hashfunc($key));
-
}
-
$key = str_pad($key, $blocksize, chr( 0x00));
-
$ipad = str_repeat(chr( 0x36), $blocksize);
-
$opad = str_repeat(chr( 0x5c), $blocksize);
-
$hmac = pack(
-
'H*', $hashfunc(
-
($key ^ $opad) . pack(
-
'H*', $hashfunc(
-
($key ^ $ipad) . $str
-
)
-
)
-
)
-
);
-
$signature = base64_encode($hmac);
-
}
-
return $signature;
-
}
-
-
class Response {
-
public $username = "";
-
public $password = "";
-
public $ttl = "";
-
public $uris = array( "");
-
}
-
-
5、拿nginx部署下,怎么部署自行百度
六、测试
部署成功后可在浏览器输入http://192.168.214.129:8080创建房间
appRTCDemo连接也改成http://192.168.214.129:8080即可
七、参考连接
http://www.mamicode.com/info-detail-513556.html
http://www.jianshu.com/p/c55ecf5a3fcf
http://www.bubuko.com/infodetail-938737.htmll
八、关于webrtc编译
我只编译了android的版本,公司网速慢死,找了个国内下好的代码,分享到网盘了http://pan.baidu.com/s/1kUyNE55
AppRTCDemo的工程源码连接:AppRTCDemo工程源码