您的位置:首页 > 移动开发

搭建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,在末尾加入如下内容:

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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: