Локальный порт 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);
}

Надеюсь, это поможет любому с подобной проблемой

Другие вопросы по тегам