Я занимаюсь разработкой веб-клиента 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 :
Каждые 10 сек c отправляется запрос STUN, после чего следует мгновенный ответ. Это происходит 4 раза.
Вот журнал консоли браузера, который я получаю:
Компьютер, на котором я работаю вызов имеет несколько сетевых интерфейсов. Я вижу icecandidate события, содержащие два IP-адреса, один из которых (169.254.128.100) относится к Ethe rnet и не используется, другой (192.168.1.33) относится к WiFi и используется для подключения в Inte rnet.
Я также вижу в журнале консоли браузера, что ответ STUN принимается в течение нескольких миллисекунд после инициирования вызова. , Но после этого JSSIP ждет 40 секунд!
Как избежать этой задержки 40 se c?