RTP SSRC: Как узнать направление вызова

Я использую jNetPcap для декодирования rtp из tcpdumps. В настоящее время я использую сообщение приглашения SIP и IP-адрес источника (а также проверяю через исходные ips..), чтобы определить направления (переадресация, обратный вызов) от вызова... это работает, но не совсем так, как это должно работать из стандарта rfc и обойти все возможные варианты поведения.

Есть ли способ определить из SSRC, в каком направлении работает источник для SIP-вызова? Насколько я вижу, идентификаторы ssrc сначала появляются в потоке rtp, из которого я не могу сказать, какое направление потока вызовов это.

И я не хочу сохранять оба направления и заставлять пользователя решать, какое это направление.

2 ответа

Решение

Я сделал грязный анализ, но кажется, что у jnetpcap нет лучшего способа сделать это:

private class JPacketHandlerSSRCs implements JPacketHandler<String> {

    @Override
    public void nextPacket(JPacket packet, String user) {
        // TODO Auto-generated method stub

        Udp udp = new Udp();
        Rtp rtp = new Rtp();
        Sdp sdp = new Sdp();
        Sip sip = new Sip();

        // get the source ip of the caller from the invite message.
        // seems to be a tricky and dirty workaround, poor jnetpcap framework!
        if(packet.hasHeader(sip) && packet.hasHeader(sdp)) {

            if( (sip.getUTF8String(0, '@')).startsWith("INVITE ") ) {
                String sdptext = sdp.text();
                int pos = sdptext.indexOf("m=audio ") + 8;
                int end = pos;
                if(pos != -1)
                    while(sdptext.charAt(end) != ' ') end++;

                rtp_forward_channel_port = Integer.parseInt(sdptext.substring(pos, end));
                }
        }



        if(packet.hasHeader(udp))
            if(rtp_forward_channel_port == udp.source() && packet.hasHeader(rtp)) {
            try {
                dos = getOutputStream(rtp.ssrc());
                dos.write(rtp.getPayload());
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
    }

Нет никакого способа определить только из потоков RTP, какая сторона сделала вызов. Вам нужно будет захватить обмен INVITE/200/ACK для сопоставления с IP-адресом / портом / транспортными тройками участникам вызова. Похоже, вы уже делаете это.

Я не уверен, что вы подразумеваете под "но не совсем так, как это должно работать в стандарте RFC". Похоже, что стандарты RTP и SIP делают именно то, что они должны делать. SIP использует SDP, чтобы изолировать себя от знания непосредственно о медиаплоскости, что позволяет SIP работать с произвольными медиапротоколами.

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