MjSip
From Coder's Log
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();
}
}
}
