Локальный порт RTP недоступен при использовании mjsip/jmf
Я создаю сеанс SIP с MJSIP для внешнего поставщика VoIP. Затем я передаю тестовый wav-файл через rtp провайдеру, используя RtpManager.
Программа работает без ошибок, и я отвечаю на SIP-вызов. Однако звук не передается. Когда я диагностирую сетевой трафик с помощью wireshark, я вижу кучу трафика RTP от моего локального хоста (за каким-то натом) к провайдеру voip и ничего не возвращается.
Через некоторое время я получаю ошибку ICMP "Адресат недоступен (Порт недоступен)" от провайдера на мой локальный хост.
Программный линфон работает с использованием одного и того же локального хоста и провайдера VoIP - хотя он использует другой стек SIP.
Какие-либо предложения?
Спасибо
2 ответа
Вы уже ответили на свой вопрос, но да, вы правы: Callee/UAS через некоторое время сочтет, что соединение не было установлено, если оно не получило ACK.
RFC SIP сообщает нам, что транзакция INVITE сервера UAS перейдет в состояние "Завершено", когда отправит 200 OK. Квитанция ACK отправляет его в Подтвержденное состояние.
Однако, если UAS либо имеет транспортную ошибку при отправке 200 OK, либо не получает своевременного получения ACK (срабатывает таймер H (по умолчанию 64*T1 = 64*500 м = 32 секунды), UAS перейдет в состояние "Завершено".,
D'о!
Была обнаружена проблема, заключающаяся в том, что я не отправил ACK на сообщение SIP 200, когда мой вызов был принят в моем классе прослушивателя вызовов. Таким образом, VoIP-клиент проигнорировал соответствующие запросы RTP.
public void onCallAccepted(Call call, String sdp, Message resp){
System.out.println("call accepted");
call.ackWithAnswer(sdp); //this was the missing line I needed
this.setupRtpSession(call);
}
Надеюсь, это поможет любому с подобной проблемой