RTP SSRC:如何知道呼叫方向

时间:2012-05-25 08:11:46

标签: sip rtp jnetpcap call-flow

我正在使用jNetPcap从tcpdumps解码rtp。目前我使用SIP邀请消息和源IP(以及通过源ips检查..)来检测来自呼叫的方向(正向,反向)..这是有效但不是真的如何从rfc标准工作并解决所有可能的行为。

有没有办法从SSRC确定源在哪个方向上工作? 据我所知,ssrc标识符首先出现在rtp流中,我无法说出它是哪个呼叫流方向。

我不想保存两个方向,让用户决定它的方向。

2 个答案:

答案 0 :(得分:3)

无法仅从RTP流确定哪一方放置了呼叫。您需要捕获INVITE / 200 / ACK交换,以便从IP地址/端口/传输三元组映射到呼叫中的参与者。听起来你已经这样做了。

我不确定你的意思是“但不是真的如何从rfc标准起作用”。似乎RTP和SIP标准都正在做他们应该做的事情。 SIP使用SDP将自己与直接了解媒体平面隔离开来,这使得SIP可以使用任意媒体协议。

答案 1 :(得分:1)

我做了脏解析,但似乎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();
            }


        }
    }