40 se c задержка инициирования вызова SIP с использованием JSSIP / WebRTC - PullRequest
0 голосов
/ 16 апреля 2020

Я занимаюсь разработкой веб-клиента SIP на основе JavaScript, связывающегося с сервером SIP Asterisk.

SIP-клиент использует JSSIP 3.4.2, я тестирую на Chrome версии 80.

И SIP-клиент, и SIP-сервер находятся за брандмауэрами. Я использую сервер STUN stun.l.google.com: 19302 .

Звонок установлен успешно, но между * 10062 * 40 se c задержкой вызов метода "call" и установление вызова (начало сеанса RTP).

Вот код регистрации SIP UA:

// SIP UA registration
var currentUserSipAccount = {
    uri: '211',
pwd: 'secret'
};
var sipDomain = 'sip.my-domain.com';
var sipServerUrl = 'wss://' + sipDomain + ':8089/ws';
var socket = new JsSIP.WebSocketInterface(sipServerUrl);

var connectionParams = {};
connectionParams.sockets = [socket];
connectionParams.register = true;
connectionParams.uri = 'sip:' + currentUserSipAccount.uri + '@' + sipDomain;
connectionParams.password = currentUserSipAccount.pwd;

var bwPhone = new JsSIP.UA(connectionParams);

Вот код инициации вызова:

// SIP call
var callNumber = 'sip:233@' + sipDomain;
var callOptions = {
    mediaConstraints: {
        audio: true, // only audio calls
        video: false
    },
    pcConfig: {
        iceServers: [
            {'urls': ['stun:stun.l.google.com:19302']}
        ]
    }
};
bwPhone.call(callNumber, callOptions);

Я настроил протоколирование каждого события SIP и обнаружил, что задержка связана с событиями onicegatheringstatechange и onicecandidate .

Вот журнал Wireshark :

enter image description here

Каждые 10 сек c отправляется запрос STUN, после чего следует мгновенный ответ. Это происходит 4 раза.

Вот журнал консоли браузера, который я получаю:

enter image description here

Компьютер, на котором я работаю вызов имеет несколько сетевых интерфейсов. Я вижу icecandidate события, содержащие два IP-адреса, один из которых (169.254.128.100) относится к Ethe rnet и не используется, другой (192.168.1.33) относится к WiFi и используется для подключения в Inte rnet.

enter image description here

Я также вижу в журнале консоли браузера, что ответ STUN принимается в течение нескольких миллисекунд после инициирования вызова. , Но после этого JSSIP ждет 40 секунд!

enter image description here

Как избежать этой задержки 40 se c?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Сбор кандидатов может быть очень долгим, и обычно, когда задержка велика, последний ледяной кандидат не может быть найден.

Чтобы решить вашу задержку, вы можете контролировать время ожидания и прерывать, когда вы решите , Это пример для тайм-аута 5 секунд с jssip:

var myCandidateTimeout = null;

_session.on('icecandidate', function(candidate, ready) {
    console.log('getting a candidate' + candidate.candidate.candidate);
    if (myCandidateTimeout!=null)
        clearTimeout(myCandidateTimeout);

    // 5 seconds timeout after the last icecandidate received!
    myCandidateTimeout = setTimeout(candidate.ready, 5000);
}
0 голосов
/ 16 апреля 2020

Получил несколько подсказок в группе JSSIP. Чтобы прекратить сбор кандидатов на ICE и продолжить поток SIP, мне нужно вызвать event.ready () внутри обработчика событий icecandidate .

Этот код решил проблему (не уверен, что такое srflx, может быть, это и не нужно):

session.on("icecandidate", function (event) {
    if (event.candidate.type === "srflx" &&
        event.candidate.relatedAddress !== null &&
        event.candidate.relatedPort !== null) {
        event.ready();
    }
});
...