这部分,主要是参考网上别人的做法,只不过中间遇到的一些问题这里我会稍微写一下。
首先,webrtc服务器的编译主要参考这位大神的做法:http://www.linuxdiyf.com/linux/24112.html
我这里用的是Ubuntu 16.04 LTS 64位的linux系统。
服务器方面需要注意的是,启动服务器的时候不要设置系统代理,因为下载某些软件的时候可能需要翻墙。如果编译中出现下载失败的问题,很有可能是翻墙造成的,需要自己去确认下是不是需要翻墙。另外,设置系统代理或者取消代理,可能需要注销下才会起作用,这个有点麻烦,为什么不是立即生效呢。
一、AppRTC房间服务器
这个编译按照链接里的做就行,只不过中间安装某些软件的时候,需要等的时间比较长,耐心等就行了。
编译完成,配置的地方说几点不同的:
1.我这里用的iceserver,好像最新的webrtc demo用的是iceserver,所谓的iceserver其实就是请求一个url网址,返回一组打洞服务器地址,我这里改成这个
ICE_SERVER_BASE_URL = 'http://192.168.123.231'
完整的url是http://192.168.123.231/v1alpha/iceconfig/?key=north,这里的url需要自己做一个网站配置一下,理论上,如果只是测试,写成一个静态的index.html返回给客户端应该也是可以的。
url返回的json数据是:
{"iceServers":[{"username":"1473662094:ling","credential":"HbWuzrR0z\/Ei0wBPvHISXpdGvc4=","ttl":86400,"urls":["turn:192.168.123.231:3478?transport=udp","turn:192.168.123.231:3478?transport=tcp","turn:192.168.123.231:3479?transport=udp","turn:192.168.123.231:3479?transport=tcp"]},{"username":"1473662094:ling","credential":"HbWuzrR0z\/Ei0wBPvHISXpdGvc4=","ttl":86400,"urls":["turn:192.168.123.231:3478?transport=udp","turn:192.168.123.231:3478?transport=tcp","turn:192.168.123.231:3479?transport=udp","turn:192.168.123.231:3479?transport=tcp"]}]}
注意这里的urls,链接里面是uris,这是不同的。最新webrtc demo是用的urls解析的。另外mac版本的demo解析这个json和android不同,有bug,需要自己修复下。
2.npm的安装不需要翻墙。
3.constants.py里面的修改
4.apprtc.py里面,为了测试通过,我加了这句,是为了不执行if下面的代码。
5.我的启动命令dev_appserver.py --host 192.168.123.231 --port 8080 ./out/app_engine
二、Collider信令服务器
这个也是按照链接里的做就可以了。不过go的编译也用了蛮长时间,主要是第一次编译的问题。
需要注意的是,要在src目录下启动信令服务器,我的启动命令~/collider_root/bin/collidermain -port=8089 -room-server="192.168.123.231" -tls=false
三、打洞服务器
这里我是下载的源码http://turnserver.open-sys.org/downloads/v4.5.0.4/turnserver-4.5.0.4.tar.gz自己编译安装的。.configure以后,make,sudo make install就行了。
启动之前,我没有修改配置,用的默认配置启动的,签名证书的生成同链接里的。我的启动命令sudo turnserver start
不过这里可能涉及到一个打洞服务器认证的问题,由于这里只是自己测试用,这些并没有在意。如果是需要上线的,请自行研究解决下吧。
四、iceserver的生成
关于第一步中这个url:http://192.168.123.231/v1alpha/iceconfig/?key=north
这里我们做一个php实现。
1.网站服务器,由于ubuntu16.04 LTS中自带了一个叫做lighttpd的网站服务器,所以不需要再去装什么apache或者nginx网站服务器了。
2.php安装,请参照http://www.linuxdiyf.com/linux/23034.html,该链接php安装部分,不过我用的php5.6,参考http://www.linuxdiyf.com/linux/21202.html
3.lighttp配置php
找到/etc/lighttpd/conf-available/15-fastcgi-php.conf,修改"bin-path" => "/usr/local/bin/php-cgi"指向你自己的php-cgi位置
然后运行
lighttpd-enable-mod fastcgi
lighttpd-enable-mod fastcgi-php
这将创建符号链接
/etc/lighttpd/conf-enabled/10-fastcgi.conf 指向/etc/lighttpd/conf-available/10-fastcgi.conf
/etc/lighttpd/conf-enabled/15-fastcgi-php.conf 指向 /etc/lighttpd/conf-available/15-fastcgi-php.conf
最后重启lighttpd, sudo service lighttpd force-reload
4.下面参照链接里的php,我做了一下修改,里面的username什么都是为了暂时测试改掉的,这里需要配合客户端做相应的修改,由于写改文章的时候,我对webrtc客户端代码还没做太多研究,这里为了测试通过,这样改了。
<?php
$request_username = "";//$_GET["username"];
if(!isset($_GET["username"])) {
//echo "username == null";
//exit;
$request_username = "ling";
}
$request_key = "ling1234";//$_GET["key"];
$time_to_live = 600;
$timestamp = time() + $time_to_live;//失效时间
$response_username = $timestamp.":".$request_username;//$_GET["username"];
$response_key = $request_key;
if(empty($response_key))
$response_key = "密钥";//constants.py中CEOD_KEY
$response_password = getSignature($response_username, $response_key);
$iceServer = new Response();
$iceServer->username = $response_username;
$iceServer->credential = $response_password;
$iceServer->ttl = 86400;
$iceServer->urls = array("turn:192.168.123.231:3478?transport=udp","turn:192.168.123.231:3478?transport=tcp","turn:192.168.123.231:3479?transport=udp","turn:192.168.123.231:3479?transport=tcp");
$str = json_encode($iceServer);
$config = array("iceServers"=>[$iceServer,$iceServer]);//{"iceServers":"ff"};
echo json_encode($config);
/**
* 使用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 $credential = "";
public $ttl = "";
public $urls = array("");
}
?>
将以上php代码保存为index.php,放到/var/www/html/v1alpha/iceconfig下面。这样,访问http://192.168.123.231/v1alpha/iceconfig/?key=north,将会返回类似这样的json数据:
{"iceServers":[{"username":"1473662094:ling","credential":"HbWuzrR0z\/Ei0wBPvHISXpdGvc4=","ttl":86400,"urls":["turn:192.168.123.231:3478?transport=udp","turn:192.168.123.231:3478?transport=tcp","turn:192.168.123.231:3479?transport=udp","turn:192.168.123.231:3479?transport=tcp"]},{"username":"1473662094:ling","credential":"HbWuzrR0z\/Ei0wBPvHISXpdGvc4=","ttl":86400,"urls":["turn:192.168.123.231:3478?transport=udp","turn:192.168.123.231:3478?transport=tcp","turn:192.168.123.231:3479?transport=udp","turn:192.168.123.231:3479?transport=tcp"]}]}
以上是webrtc服务器的搭建过程,由于对webrtc的客户端和服务器端研究太少,这里的步骤都是为了测试所写,而且都是测试通过的。