PeerJS: iceConnectionState отключен, закрывая соединения с [userid]
Я использовал PeerJS для своего приложения [приложения для голосового и видеочата], и все отлично работает, соединение с коллегами, видео и голосовые вызовы работают нормально, в то время как разработка и тестирование проводились в одной сети, пока я не разместил приложение в сети. Он перестал подключаться к сверстникам и продолжать сообщать
PeerJS: iceConnectionState отключен, закрывая соединения с [userid]
а также
Ошибка: согласование соединения с [ИД пользователя] не выполнено. в RTCPeerConnection.pc.oniceconnectionstatechange [как onicechange].
Есть идеи по решению этого вопроса?
1 ответ
Я нашел решение проблемы.
Мне пришлось купить ICE и TURN серверы у Twilio, чтобы это исправить. Это дает мне надежное соединение и более быструю передачу сообщений.
Вы можете попробовать это.
Нашел этот ответ и согласен с Амину. Я нашел TURN-серверы Twilio хорошим решением. Я подумал, что дам более подробную информацию, если это кому-то поможет.
У меня уже есть учетная запись Twilio, что упростило задачу.
Я сделал функцию PHP, чтобы получить несколько серверов Ice. Как это...
define("TWILIO_ACC_ID","AC12345etc...");
define("TWILIO_AUTH_TOKEN","8675309");
require_once '/path/to/my/Twilio/autoload.php';
use Twilio\Rest\Client;
function twilio_iceServers() {
$twilio=new Client(TWILIO_ACC_ID,TWILIO_AUTH_TOKEN);
$token = $twilio->tokens->create();
return json_encode($token->iceServers);
}
Затем для своего javascript я загружаю свои ледяные серверы следующим образом:
var twilio_iceServers=<?php print(twilio_iceServers()); ?>;
Затем включите эти ледяные серверы в мои конфигурации peerJS следующим образом:
var peer_options={
key:'myKey',
host:'my.host.com',
port: 443,
secure: true,
config: {iceServers:twilio_iceServers}
};
Похоже, эти ледяные серверы истекают примерно через день. Поскольку с моим приложением люди могли оставлять окно открытым на несколько дней, мне пришлось разработать способ обновления этих серверов.
//returns current time stamp in seconds
function now() {
return Math.floor(Date.now() / 1000);
}
//some variable that keeps track of whether I'm on a call or not
var call_status=null;
//save the current time stamp into the ice servers object on page load
twilio_iceServers.date=now();
//do a check every 60 seconds to see if the ice servers have expired. yes... not 12 hours
setInterval(function(){
//if ice server issued date is more than 12 hours ago AND we're not on a call. we renew the ice servers. If we are on a call, this will run about a minute after we get off the call. This is why the setInterval is set to be 1 minute instead of 12 hours.
if (twilio_iceServers.date<(now()-43200) && !call_status) {
$.post("/page/on/my/server/that/just/sends/back/twilio_iceServers",{},function(data) {
if (data) {
//save the new ice servers
twilio_iceServers=JSON.parse(data);
//save the new date of the server
twilio_iceServers.date=now();
}
});
}
},60000);
Это все НАСТОЯЩИЙ способ сделать все это? Я НЕ ЗНАЮ! Но у меня это работает. Так что.