搭建APPRTC服务器时,遇到的coturn服务器配置及调用的问题解决
2017-07-14 17:17
162 查看
最近参照网上不少的资料,试图搭建APPRTC服务器。虽然网上有不少这块的资料,但是不知道是我配置有问题,还是网上的资料不靠谱,在搭建coturn服务器的时候遇到了很多问题,求教文章的楼主,也没人理我;qq群上倒是有人可以给搭建,但是是有偿搭建。身为技术人员的自尊心驱使我要试着自己解决问题。在努力了十几天后,终于解决了问题。在这里分享一下,以便日后遇到同样问题的道友。
个人以为,在搭建房间服务器和信令服务器上,大家都说的差不多,我是按照这篇文章的作者写的来 http://blog.csdn.net/danfengw/article/details/68485223
妹子写的很详细很认真
在搭建coturn服务器上,我觉得这篇文章不错 http://blog.csdn.net/jwcqc/article/details/53156347
至于安装nginx服务器,大家可以百度,相信很快能找到答案
然后coturn的restAPI我也是根据妹子那篇文章的PHP来的。
好了,下面问题来了。
coturn按这么配置了:/etc/turnserver.conf,在末尾加入如下内容:
web那边也做如下修改了:/apprtc/src/web_app/js/utils.js,修改requestIceServers函数:
没错,这就是我遇到的问题(希望看到的大神指点我一下问题出在哪里,不胜感激!)
然而通过nginx转发访问php文件获取到的用户名密码,例如:{"username":"1500005495:093518109","password":"xXsHr6A8YAQvJo\/H\/c\/33JEroxo=","ttl":86400,"uris":["turn:xxxx:3478?transport=udp","turn:xxxx:3478?transport=tcp"]}
确实可以使用的。(这里我使用了一段js测试代码测试coturn服务器,后面附上这段程序。其他测试的方法大多是扯淡)
既然有一条路可以走,那就走这条路呗。
于是我决定修改/apprtc/src/web_app/js/utils.js,放弃上文提出的那种修改方法,改为访问这个php的restAPI。
但是这会遇到跨域的问题,所以在php文件中,在文件开头要加上这个:
header('Access-Control-Allow-Origin:http://xxxx:8088');
//这里为你的房间服务器地址
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers:X-Requested-With');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE');
然后修改/apprtc/src/web_app/js/utils.js,修改requestIceServers函数,改成这样
function requestIceServers(iceServerRequestUrl, iceTransports) {
return new Promise(function(resolve, reject) {
var servers;
sendUrlRequest('GET', iceServerRequestUrl).then(function(response) {
var iceServerRequestResponse = parseJSON(response);
if (!iceServerRequestResponse) {
reject(Error('Error parsing response JSON: ' + response));
return;
}
if (iceTransports !== '') {
filterIceServersUrls(iceServerRequestResponse, iceTransports);
}
trace('Retrieved ICE server information.');
servers = [
{
credential: iceServerRequestResponse.password,
username: iceServerRequestResponse.username,
urls: iceServerRequestResponse.uris
}
];
resolve(servers);
}).catch(function(error) {
reject(Error('ICE server request error: ' + error.message));
return;
});
});
}
然后重新sudo grunt build
启动信令服务器
浏览器终于可以跟app对通了
进而,浏览器、app都可以互通了
附:测试coturn服务器的js代码。可以在chrome下测试
function checkTURNServer(turnConfig, timeout){
return new Promise(function(resolve, reject){
setTimeout(function(){
if(promiseResolved) return;
resolve(false);
promiseResolved = true;
}, timeout || 5000);
var promiseResolved = false
, myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection //compatibility for firefox and chrome
, pc = new myPeerConnection({iceServers:[turnConfig]})
, noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(function(sdp){
if(sdp.sdp.indexOf('typ relay') > -1){ // sometimes sdp contains the ice candidates...
promiseResolved = true;
resolve(true);
}
pc.setLocalDescription(sdp, noop, noop);
}, noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf('typ relay')>-1)) return;
promiseResolved = true;
resolve(true);
};
});
}
checkTURNServer({
url: 'turn:xxxxxx:3478',
username: 'xxx',
credential: 'xxx'
}).then(function(bool){
console.log('is my TURN server active? ', bool? 'yes':'no');
}).catch(console.error.bind(console));
个人以为,在搭建房间服务器和信令服务器上,大家都说的差不多,我是按照这篇文章的作者写的来 http://blog.csdn.net/danfengw/article/details/68485223
妹子写的很详细很认真
在搭建coturn服务器上,我觉得这篇文章不错 http://blog.csdn.net/jwcqc/article/details/53156347
至于安装nginx服务器,大家可以百度,相信很快能找到答案
然后coturn的restAPI我也是根据妹子那篇文章的PHP来的。
好了,下面问题来了。
coturn按这么配置了:/etc/turnserver.conf,在末尾加入如下内容:
listening-device=eth0 listening-port=3478 relay-device=eth0 min-port=49152 max-port=65535 Verbose fingerprint lt-cred-mech use-auth-secret static-auth-secret=jwcqc user=jwcqc:0x949534a397bcf2e88470c86ad3749d9c(替换成上一步通过turnadmin生成的key) user=jwcqc:jwcqc stale-nonce cert=/server/cert/turn_server_cert.pem pkey=/server/cert/turn_server_pkey.pem no-loopback-peers no-multicast-peers mobility no-cli
web那边也做如下修改了:/apprtc/src/web_app/js/utils.js,修改requestIceServers函数:
function requestIceServers(iceServerRequestUrl, iceTransports) { return new Promise(function(resolve, reject) { var servers = [{ credential: "jwcqc", username: "jwcqc", urls: [ "turn:125.216.242.151:3478?transport=udp", "turn:125.216.242.151:3478?transport=tcp" ] }]; resolve(servers); }); }但是外网访问的时候却提示:ICE failed, add a STUN server and see about:webrtc for more details
没错,这就是我遇到的问题(希望看到的大神指点我一下问题出在哪里,不胜感激!)
然而通过nginx转发访问php文件获取到的用户名密码,例如:{"username":"1500005495:093518109","password":"xXsHr6A8YAQvJo\/H\/c\/33JEroxo=","ttl":86400,"uris":["turn:xxxx:3478?transport=udp","turn:xxxx:3478?transport=tcp"]}
确实可以使用的。(这里我使用了一段js测试代码测试coturn服务器,后面附上这段程序。其他测试的方法大多是扯淡)
既然有一条路可以走,那就走这条路呗。
于是我决定修改/apprtc/src/web_app/js/utils.js,放弃上文提出的那种修改方法,改为访问这个php的restAPI。
但是这会遇到跨域的问题,所以在php文件中,在文件开头要加上这个:
header('Access-Control-Allow-Origin:http://xxxx:8088');
//这里为你的房间服务器地址
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers:X-Requested-With');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE');
然后修改/apprtc/src/web_app/js/utils.js,修改requestIceServers函数,改成这样
function requestIceServers(iceServerRequestUrl, iceTransports) {
return new Promise(function(resolve, reject) {
var servers;
sendUrlRequest('GET', iceServerRequestUrl).then(function(response) {
var iceServerRequestResponse = parseJSON(response);
if (!iceServerRequestResponse) {
reject(Error('Error parsing response JSON: ' + response));
return;
}
if (iceTransports !== '') {
filterIceServersUrls(iceServerRequestResponse, iceTransports);
}
trace('Retrieved ICE server information.');
servers = [
{
credential: iceServerRequestResponse.password,
username: iceServerRequestResponse.username,
urls: iceServerRequestResponse.uris
}
];
resolve(servers);
}).catch(function(error) {
reject(Error('ICE server request error: ' + error.message));
return;
});
});
}
然后重新sudo grunt build
启动信令服务器
浏览器终于可以跟app对通了
进而,浏览器、app都可以互通了
附:测试coturn服务器的js代码。可以在chrome下测试
function checkTURNServer(turnConfig, timeout){
return new Promise(function(resolve, reject){
setTimeout(function(){
if(promiseResolved) return;
resolve(false);
promiseResolved = true;
}, timeout || 5000);
var promiseResolved = false
, myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection //compatibility for firefox and chrome
, pc = new myPeerConnection({iceServers:[turnConfig]})
, noop = function(){};
pc.createDataChannel(""); //create a bogus data channel
pc.createOffer(function(sdp){
if(sdp.sdp.indexOf('typ relay') > -1){ // sometimes sdp contains the ice candidates...
promiseResolved = true;
resolve(true);
}
pc.setLocalDescription(sdp, noop, noop);
}, noop); // create offer and set local description
pc.onicecandidate = function(ice){ //listen for candidate events
if(promiseResolved || !ice || !ice.candidate || !ice.candidate.candidate || !(ice.candidate.candidate.indexOf('typ relay')>-1)) return;
promiseResolved = true;
resolve(true);
};
});
}
checkTURNServer({
url: 'turn:xxxxxx:3478',
username: 'xxx',
credential: 'xxx'
}).then(function(bool){
console.log('is my TURN server active? ', bool? 'yes':'no');
}).catch(console.error.bind(console));
相关文章推荐
- Linux下搭建SVN服务器遇到的问题及解决方法
- linux下搭建SVN服务器以及遇到的常见问题解决
- linux上ftp服务器搭建以及遇到的问题解决
- Linux下搭建SVN服务器遇到的问题及解决方法
- 自家电脑搭建服务器可能遇到的问题及解决方法
- 搭建了个静态资源服务器遇到的问题与解决
- 搭建配置服务器过程中遇到的问题及其解决办法(转)
- 在云服务器上搭建git服务器遇到的问题及解决
- Linux下搭建SVN服务器遇到的问题及解决方法
- centos6.5搭建git服务器 win10 安装git客户端连接 和遇到的问题+解决方式
- Linux下搭建SVN服务器遇到的问题及解决方法,
- Ubuntu下Crtmp服务器的搭建及过程中遇到的问题解决方法
- VM 安装Linux虚拟服务器:环境搭建遇到:《Linux “ifconfig”看不到inet address》问题--解决土方法
- Linux下搭建SVN服务器遇到的问题及解决方法
- python 调用pymysql模块遇到\转义问题解决办法
- ubuntu环境下vsftpd服务器的搭建 以几个重要问题的解决
- 在windows下利用firewatir搭建测试框架时遇到的编码问题和解决方法
- 3Com office connect+Server_U 搭建Ftp 服务器遇到的问题
- java.lang.Process调用程序阻塞问题解决(刚刚遇到的问题,看有人解决了,转一下:) )
- 搭建rtmp流媒体服务器过程中遇到的又一个小问题