MjSip

From Coder's Log

Jump to: navigation, search

Contents

How to make a call using UserAgent

UserAgentProfile userProfile = new UserAgentProfile();
TestClient testClient = new TestClient();
userProfile.username = "username";
userProfile.use_jmf = false;
userProfile.audio = true;
UserAgent ua = new UserAgent(provider, userProfile, testClient);
RegisterAgent ra = new RegisterAgent(provider, userProfile.from_url, userProfile.contact_url, userProfile.username, userProfile.realm, userProfile.passwd, testClient);
ra.register(120);
ua.call("user@server");

How to initiate a provider and make a sip call

local-external-ip-address - your net address 192.* or 10.* public-ip-address - address of your router if behind one (note router must forward requests to you) local_session is stored and reused during further communications

SipProvider provider = new SipProvider("local-external-ip-address");
String callUrl = "sip:user@server";
String fromUrl = "fromuser";
System.out.println(provider.getViaAddress());
SessionDescriptor sdp = new SessionDescriptor(fromUrl, "public-ip-address");
local_session = sdp.toString();
sdp = new SessionDescriptor(local_session);
sdp.addMedia(new MediaField("audio", rtpPort, 0, "RTP/AVP", "0"), new AttributeField("rtpmap", "0 PCMU/" + sample_rate));
local_session = sdp.toString();
ExtendedCall call = new ExtendedCall(provider, fromUrl, callUrl, "username", "", "", new ExtendedCallListener() {
    ... onCallAccepted needs to be implemented
});

How to get remote address/port for rtp traffic after a sip call is answered

System.out.println("ACCEPTED CALL!");
SessionDescriptor remote_sdp = new SessionDescriptor(call.getRemoteSessionDescriptor());
String remote_media_address = (new Parser(remote_sdp.getConnection().toString())).skipString().skipString().getString();
int remote_audio_port = 0;
for (Enumeration e = remote_sdp.getMediaDescriptors().elements(); e.hasMoreElements();) {
     MediaField media = ((MediaDescriptor) e.nextElement()).getMedia();
     remote_audio_port = media.getPort();
}

How to receive data after a sip session is established using MjSip

AudioFormat format = new AudioFormat(codec, sample_rate, 8 * sample_size, 1, sample_size, sample_rate, false);
AudioOutput audio_output = new AudioOutput(format);
DatagramSocket socket = new DatagramSocket(rtpPort);
RtpStreamReceiver receiver = new RtpStreamReceiver(audio_output.getOuputStream(), socket);
RtpStreamReceiver receiver = new RtpStreamReceiver(System.out, socket);
AudioInput audio_input = new AudioInput(format);
RtpStreamSender sender = new RtpStreamSender(new ByteArrayInputStream(new byte[] { 100 }), 
                                      true, 0, 50, 50, socket, remote_media_address, remote_audio_port);
sender.setSyncAdj(2);
sender.start();
receiver.start();
audio_output.play();
player.start();
audio_input.play();

How to answer a call using onCallIncomming

public void onCallIncoming(Call call, NameAddress callee, NameAddress caller, String sdp, Message invite) {
    System.out.println("INCOMING FROM " + caller + " TO " + callee);
    System.out.println(sdp);
    if (sdp != null) { // Create the new SDP
        SessionDescriptor remote_sdp = new SessionDescriptor(sdp);
        String remote_addr = (new Parser(remote_sdp.getConnection().toString())).skipString().skipString().getString();
        int remote_port = 0;
        for (Enumeration e = remote_sdp.getMediaDescriptors().elements(); e.hasMoreElements();) {
            MediaField media = ((MediaDescriptor) e.nextElement()).getMedia();
            remote_port = media.getPort();
        }
        SessionDescriptor local_sdp = new SessionDescriptor(local_session);
        SessionDescriptor new_sdp = new SessionDescriptor(remote_sdp.getOrigin(), remote_sdp.getSessionName(),
                                                    local_sdp.getConnection(), local_sdp.getTime());
        new_sdp.addMediaDescriptors(local_sdp.getMediaDescriptors());
        new_sdp = SdpTools.sdpMediaProduct(new_sdp, remote_sdp.getMediaDescriptors());
        new_sdp = SdpTools.sdpAttirbuteSelection(new_sdp, "rtpmap");
        local_session = new_sdp.toString();
        call.accept(local_session);
        ToneInputStream tone = new ToneInputStream(tone_freq, tone_amp, sample_rate, sample_size,         
                                                ToneInputStream.PCM_LINEAR_UNSIGNED, big_endian);
        DatagramSocket socket;
        try {
            socket = new DatagramSocket(rtpPort);
            RtpStreamSender sender = new RtpStreamSender(tone, true, 0, frame_rate, frame_size, socket, remote_addr, remote_port);
            sender.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Personal tools