webrtc
这两天测试了下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 需FQ
下载完后设置环境变量
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,准备好FQ
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工程源码