搭建APPRTC服务器时,遇到的coturn服务器配置及调用的问题解决

最近参照网上不少的资料,试图搭建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));


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值