iceConnectionState está desconectado (cuando se usa en Internet)
Esta pregunta ya se ha hecho antes, pero aún no he encontrado una respuesta. Básicamente estoy teniendo el mismo problema que el descritoaquí yaquí.
Estoy tratando de configurar una conexión webRTC usando PeerJS. Funciona perfectamente en LAN, pero no puedo hacer que funcione a través de Internet. Estoy usando Coturn como servidor TURN, pero hasta ahora esto no ha resuelto el problema. La consola de Chromium imprime lo siguiente:
PeerJS: Added ICE candidate for: client1
peer.js:1476 PeerJS: Set remoteDescription: ANSWER for: client1
peer.js:1476 PeerJS: Set remoteDescription: OFFER for: client1
peer.js:1476 PeerJS: Set remoteDescription: ANSWER for: client1
peer.js:1476 PeerJS: Received remote stream
peer.js:1476 PeerJS: Receiving stream MediaStream
peer.js:1476 PeerJS: Created answer.
peer.js:1476 PeerJS: Set localDescription: answer for: client1
3peer.js:1476 PeerJS: Received ICE candidates for: client1
3peer.js:1476 PeerJS: Added ICE candidate for: client1
peer.js:1476 PeerJS: iceConnectionState is disconnected, closing connections to client1
peer.js:1476 PeerJS: Cleaning up PeerConnection to client1
2peer.js:1476 PeerJS: iceConnectionState is disconnected, closing connections to client1
El objeto par que estoy usando se ve así:
var peer = new Peer(
GetURLParameter('id'),
{ key: peerKey, debug: peerDebug},
{config:
{ 'iceServers': [
{ url: 'stun:[server ip here]:3478'},
{ url: 'turn:[server ip here]:3478'}
]}
}
);
coturn, al iniciar el convertidor con el convertidor -L [ip del servidor], imprime lo siguiente:
0: Relay address to use: [server ip here]
0: pid file created: /var/run/turnserver.pid
0: IO method (main listener thread): epoll (with changelist)
0: WARNING: I cannot support STUN CHANGE_REQUEST functionality because only one IP address is provided
0: Wait for relay ports initialization...
0: relay [server ip here] initialization...
0: relay [server ip here] initialization done
0: Relay ports initialization done
0: IO method (general relay thread): epoll (with changelist)
0: turn server id=0 created
0: IPv4. UDP listener opened on: [server ip here]:3478
0: IPv4. TCP listener opened on : [server ip here]:3478
0: Total UDP servers: 1
0: Total General servers: 1
0: IO method (cli thread): epoll (with changelist)
0: IPv4. CLI listener opened on : 127.0.0.1:5766
0: IO method (auth thread): epoll (with changelist)
Y finalmente, dado que supongo que esto podría ser un problema de seguridad, mi configuración de iptables actualmente se ve así:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:3478
ACCEPT udp -- anywhere anywhere udp dpt:3478
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:3478
ACCEPT udp -- anywhere anywhere udp dpt:3478
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:3478
ACCEPT udp -- anywhere anywhere udp dpt:3478
¿Alguien tiene una idea de cómo hacer que esto funcione? Cualquier ayuda sería muy apreciada!
EDITAR: Resulta que mi JSON para la configuración de TURN era desordenado. Mi nuevo objeto par ahora se ve así:
var peer = new Peer(
GetURLParameter('id'), {
key: peerKey,
debug: peerDebug,
config: {
'iceServers': [
{ url: 'stun:[server ip]:3478'},
{ url: 'turn:[server ip]:3478'}
]
}
}
);
Esto me da muchos más comentarios sobre el servidor TURN (así que supongo que voy en la dirección correcta), pero el problema persiste.
EDIT2: Bueno, se pone bastante extraño. Parece ser algún tipo de problema de compatibilidad entre navegadores. Usando la herramienta de prueba del servidor TURN que sugirió mido, obtengo resultados diferentes en Firefox que en Chromium. Tengo la intención de usar Chromium porque su modo de quiosco sería muy útil para mi aplicación. Pero volvamos al servidor de turnos. En Firefox, cuando se usan cuentas de usuario, todo parece funcionar bien: el resultado de la página de prueba de github:
0.004 1 host 0 UDP 192.168.178.28 39919 126 | 32512 | 255
0.005 2 host 0 UDP 192.168.178.28 56123 126 | 32512 | 254
0.076 1 srflx 1 UDP 178.39.74.108 39919 100 | 32543 | 255
0.077 1 relay 2 UDP [Server IP ] 52147 5 | 32543 | 255
0.098 2 srflx 1 UDP 178.39.74.108 56123 100 | 32543 | 254
0.099 2 relay 2 UDP [Server IP ] 60002 5 | 32543 | 254
0.099 Done
Sin embargo, al permitir el acceso anónimo al servidor TURN y al intentar iniciar sesión sin nombre de usuario y contraseña, no pasa absolutamente nada.
Historia diferente en Chromium: con el nombre de usuario y la contraseña suministrados, sucede lo siguiente:
0.002 1 host 138421141 udp 192.168.178.28 42343 126 | 30 | 255
0.002 2 host 138421141 udp 192.168.178.28 49001 126 | 30 | 254
0.028 1 srflx 842163049 udp 178.39.74.108 42343 100 | 30 | 255
0.049 2 srflx 842163049 udp 178.39.74.108 49001 100 | 30 | 254
... mientras el terminal del servidor TURN imprime 401 mensajes de error una y otra vez. Me parece que las credenciales nunca llegan al servidor cuando se utiliza el cromo. El mensaje de error 401 indica un nombre de usuario vacío.
Realmente podría usar Chromium para esa cosa. ¿Alguien tiene una idea sobre cómo hacer que eso funcione?