starting - webrtc documentation
Prueba de conectividad del servidor STUN/TURN (5)
Estoy tratando de averiguar cómo probar si un servidor STUN / TURN está vivo y responde correctamente a las conexiones. Lo ideal sería que esta prueba se realizara desde una máquina externa, en caso de que la máquina STUN / TURN esté apagada en este caso, la prueba de conectividad también debe informar.
¿Alguien ha investigado este caso en el pasado? ¿Qué soluciones se recomendarían?
Pruebe sus servidores TURN y STUN aquí
Puede configurar un servicio de monitoreo de terceros (usamos Monitis) o incluso su propia máquina para PING el servidor cada minuto desde 1 o más ubicaciones. Sin embargo, esto solo le dirá si el servidor es accesible y no necesariamente si el servidor de aplicaciones TURN / STUN todavía acepta y responde a los paquetes TURN / STUN.
Una biblioteca de monitoreo del lado del servidor para STUN / TURN sería un gran proyecto GitHub.
Puedes probar tus servidores aquí ...
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
Si está abierto para una herramienta comercial para pruebas de alta carga de servidores de turnos como 100,000 usuarios virtuales o 1 millón de usuarios virtuales, le recomendamos consultar la herramienta de carga de multiplicadores (www.loadmultiplier.com). También se cubre here una página específica sobre cómo probar el servidor de coturn.
Tenga en cuenta que cualquiera de las herramientas de Load Multiplier simulará un plano de señalización ficticio (para intercambiar el SDP entre clientes). Y puede probar STUN, TURN e ICE con medios SRTP / DTLS.
Edición: una buena implementación en github.io tomada del comentario a otra respuesta (seleccione "retransmitir" en el valor de IceTransports):
Siguiendo el consejo de Benjamin Trent, escribí el siguiente código para probar la conectividad del servidor TURN, funciona tanto en Firefox n 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);
};
});
}
ejemplo de uso:
checkTURNServer({
url: ''turn:127.0.0.1'',
username: ''test'',
credential: ''test''
}).then(function(bool){
console.log(''is TURN server active? '', bool? ''yes'':''no'');
}).catch(console.error.bind(console));
Puede ejecutar el siguiente fragmento de código para comprobar:
var res = id(''result'');
id(''button'').onclick = function(){
res.innerHTML = ''Checking TURN Server...'';
var url = ''turn:''+id(''url'').value+'':''+id(''port'').value,
useUDP = id(''udp'').checked;
url +=''?transport='' + (useUDP ? ''udp'': ''tcp'');
checkTURNServer({
urls: url,
username: id(''name'').value,
credential: id(''pass'').value
}, id(''time'').value).then(function(bool){
if(bool)
res.innerHTML = ''Yep, the TURN server works...'';
else
throw new Error(''Doesn/'t work'');
}).catch(function(e){
console.log(e);
res.innerHTML = ''TURN server does not work.'';
});
};
function checkTURNServer(turnConfig, timeout){
console.log(''turnConfig: '', turnConfig);
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);
};
});
}
function id(val){
return document.getElementById(val);
}
#url{
width: 250px;
}
#port{
width: 70px;
}
<h1>
Test TURN server
</h1>
<div>
TURN URL: <input id=''url'' placeholder=''example.com or xxx.yyy.rrr.ddd'' />
Port: <input type=''number'' value=''3478'' id=''port'' placeholder=''enter a port number'' />
</div>
<div>
Transport: <input type="radio" name="transport" id="tcp" value="tcp" /> TCP
<input type="radio" name="transport" id="udp" value="udp" checked/>UDP
</div>
<div>
Username: <input id="name" placeholder="turn username" />
</div>
<div>
password: <input id="pass" placeholder="turn password" />
</div>
<div>
checking Timeout: <input type=''number'' id="time" placeholder="wait time before checking timeout" value=5000 />
</div>
<div>
<button id=''button''>
Check TURN Server
</button>
</div>
<h4 id=''result''></h4>