1

jNetPcap を使用して、tcpdump から rtp をデコードしています。現在、SIP Invite Message とソース IP を使用して (また、ソース IP を介してチェックします..)、通話からの方向 (順方向、逆方向) を検出します.考えられるすべての動作を回避します。

ソースが sip コールに対してどの方向に動作するかを SSRC から判断する方法はありますか? 私が見ることができる限り、ssrc 識別子は最初に rtp ストリームに表示され、そこからコール フローの方向を特定することはできません。

また、両方の方向を保存して、どちらの方向であるかをユーザーに決定させたくありません。

4

2 に答える 2

3

どちらのパーティがコールを発信したかを RTP ストリームだけから判断する方法はありません。INVITE/200/ACK 交換をキャプチャして、IP アドレス/ポート/トランスポートのトリプルから通話の参加者にマッピングする必要があります。あなたはすでにそれをやっているようです。

「しかし、実際にはrfc標準からどのように機能するかはわかりません」という意味がわかりません。RTP と SIP の両方の標準は、本来あるべきことを正確に行っているようです。SIP は SDP を使用して、メディア プレーンを直接認識しないように分離します。これにより、SIP は任意のメディア プロトコルを処理できます。

于 2012-05-25T13:03:13.323 に答える
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();
            }


        }
    }
于 2012-05-25T12:59:52.717 に答える