2017-01-20 2 views
0

Я создаю небольшое приложение WebRTC, которое теперь используется для обмена текстовым сообщением. У меня работает соединение WebRTC, но Datachannel всегда остается в состоянии «соединения» и никогда не переходит в «Open».Канал данных Webrtc всегда находится в состоянии соединения, а не открыт

Пожалуйста, сообщите мне, что мне здесь не хватает.

Следующий JS.

socket.onmessage = function(e){ 
      console.log("Message from signaling server"); 
       writeToScreen('<span class="server">Server: </span>'+e.data); 
       var data = JSON.parse(e.data); 
    switch(data.type) { 
    case "login": 
    onLogin(data.success); 
    break; 
    case "offer": 
    onOffer(data.offer, data.name); 
    break; 
    case "answer": 
    onAnswer(data.answer); 
    break; 
    case "candidate": 
    onCandidate(data.candidate); 
    break; 
    default: 
    break; 
} 


      } 
      // Enable send and close button 
      $('#send').prop('disabled', false); 
      $('#close').prop('disabled', false); 
      $('#connect').prop('disabled', true); 
     } 
     function close(){ 
      socket.close(); 
     } 
     function writeToScreen(msg){ 
      var screen = $('#screen'); 
      screen.append('<p>'+msg+'</p>'); 
      screen.animate({scrollTop: screen.height()}, 10); 
     } 
     function clearScreen(){ 
      $('#screen').html(''); 
     } 
     function sendMessage(){ 
      if(!socket || socket == undefined) return false; 
      var mess = $.trim($('#message').val()); 
      if(mess == '') return; 
      writeToScreen('<span class="client">Client: </span>'+mess); 
      socket.send(mess); 
      // Clear input 
      $('#message').val(''); 
     } 
     $(document).ready(function(){ 
      $('#message').focus(); 
      $('#frmInput').submit(function(){ 
       sendMessage(); 
      }); 
      $('#connect').click(function(){ 
       connect(); 
      }); 
      $('#close').click(function(){ 
       close(); 
      }); 
      $('#clear').click(function(){ 
       clearScreen(); 
      }); 
     }); 

     if (!window.RTCPeerConnection) { 
    window.RTCPeerConnection = window.webkitRTCPeerConnection; 
} 

var configuration = { 
    "iceServers": [ 
    { 
    "urls": "stun:mmt-stun.verkstad.net" 
    }, 
    { 
    "urls": "turn:mmt-turn.verkstad.net", 
    "username": "webrtc", 
    "credential": "secret" 
    } 
    ] 
}; 


myConnection = new RTCPeerConnection(configuration,{optional:[{RtpDataChannels: true},{DtlsSrtpKeyAgreement: true}]}); 

       console.log("RTCPeerConnection object was created"); 
       console.log(myConnection); 
       openDataChannel(); 

       //when the browser finds an ice candidate we send it to another peer 

       myConnection.onicecandidate = function (event) { 
       console.log(event.candidate); 
       if (event.candidate) { 
        send({ 
        type: "candidate", 
        candidate: event.candidate 
        }); 
        } 
       }; 


// Datachannel 

    var mediaConstraints = { 
     'offerToReceiveAudio': 1, 
     'offerToReceiveVideo': 1 
    }; 


    var connectToOtherUsernameBtn = document.getElementById("connectToOtherUsernameBtn"); 
     console.log(connectToOtherUsernameBtn); 

     connectToOtherUsernameBtn.addEventListener("click", function() { 
     console.log("ice state : "+myConnection.iceGatheringState); 
var otherUsername = connectToOtherUsernameBtn.value; 
connectedUser = otherUsername; 
     if (otherUsername.length > 0) { 
     //make an offer 

     myConnection.createOffer(function (offer) { 
     send({ 
     type: "offer", 
     offer: offer 
     }); 
     console.log(offer); 
     console.log(typeof(offer)); 
     myConnection.setLocalDescription(offer); 
     console.log("localDescription"); 
     console.log(myConnection.localDescription); 
     }, function (error) { 
     alert("An error has occurred."); 
     console.log(error); 
     }); 
     } 
     }); 


function send(message) { 
if (connectedUser) { 
message.name = connectedUser; 
} 
socket.send(JSON.stringify(message)); 
}; 

//when somebody wants to call us 
function onOffer(offer, name) { 
console.log("offer recieved"); 
connectedUser = name; 
myConnection.setRemoteDescription(new RTCSessionDescription(offer)); 
myConnection.createAnswer(function (answer) { 
myConnection.setLocalDescription(answer); 
send({ 
type: "answer", 
answer: answer 
}); 
}, function (error) { 
alert("oops...error"); 
console.log(error); 
}); 
    console.log("Answer sent"); 
} 

//when another user answers to our offer 
function onAnswer(answer) { 
console.log("answer recieved"); 
myConnection.setRemoteDescription(new RTCSessionDescription(answer)); 
console.log(myConnection.iceConnectionState); 
} 
//when we got ice candidate from another user 
function onCandidate(candidate) { 
myConnection.addIceCandidate(new RTCIceCandidate(candidate)); 
} 


}); 

//data channel 

//creating data channel 
function openDataChannel() { 
console.log("opening Data Channel"); 
var dataChannelOptions = { 
reliable:true, 
}; 
dataChannel = myConnection.createDataChannel("myDataChannel",dataChannelOptions); 

dataChannel.onerror = function (error) { 
console.log("Error:", error); 
}; 
dataChannel.onmessage = function (event) { 
console.log("Got message:", event.data); 
}; 
} 



function sendmsg() { 
console.log("send message"); 
var msgInput=document.getElementById("msgInput"); 
var val = msgInput.value; 
console.log(val); 
dataChannel.send(val); 
} 




function checkstatus(){ 
console.log("Checking Status"); 
console.log("signalingState: "+myConnection.signalingState); 
console.log("iceConnectionState: "+myConnection.iceConnectionState); 
console.log("iceGatheringState: "+myConnection.iceGatheringState); 
console.log("localDescription: "); 
console.log(myConnection.localDescription); 
console.log("remoteDescription:"); 
console.log(myConnection.remoteDescription); 
console.log("Connestion id"); 
console.log(dataChannel.id); 
console.log("Connestion readyState"); 
console.log(dataChannel.readyState); 
} 

Ниже приводится консольный журнал из хрома. enter image description here

ответ

2

удалить {RtpDataChannels: Истинные} попробовать еще раз, и если он работает сжечь учебник или книгу, рекомендованную эти «каналы РТП данных». Они сломаны.

+0

YEAHH учебники не достаточно ясны. Я понял проблему. Мне пришлось использовать метод RTCPeerconnection.onDatachannel для захвата Datachannel на клиенте, которому было предложено предложение, и получить Datachannel с помощью «event.channel». Я не уверен, насколько я прав, но теперь его работа. – user2288650

+0

У меня все еще много вопросов о том, как сделать WebRTC надежным. Много раз соединения не будут работать, и я получаю ошибку «Исключение DOM: ошибка в процессии icecandidates». В других случаях все работает без каких-либо проблем. – user2288650

+0

Пожалуйста, задайте новый вопрос, а не добавляйте к существующему вопросу – Mikkel

0

У меня была та же проблема. мой код работал отлично на mozilla, используя сервер сигнализации localhost без Интернета, но на хром у меня была эта проблема. Его проблема с ICC Trickle. Одним из решений является то, что вы можете установить струю льда.

В хром вам может понадобиться подключение к Интернету, чтобы собрать все возможные кандидаты ICE. потому что в Chrome Datachannel не будет открываться до тех пор, пока сверстники не получат всех возможных кандидатов ICE.

вы можете попробовать следующую ссылку в Интернете или без Интернета. у вас будет краткое представление. https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

для получения дополнительной информации вы можете проверить это https://webrtcstandards.info/webrtc-trickle-ice/

+0

эй! Вы знаете, как отключить струйный лед? Невозможно найти информацию об этом. –

+0

Hoi вы можете использовать этот Webrtc api https://www.npmjs.com/package/simple-peer. или вы можете ссылаться на запрет на включение льда. это дополнительная информация, чтобы увидеть, как работает ледяной кандидат. https://webrtchacks.com/trickle-ice/ –

Смежные вопросы