Friday, June 12, 2009

Problem: RTP Implementation

There are two programs which should enable RTP sessions. I am using LinPhone from a different machine to call my application. The call gets successfully completed as there are no exceptions thrown at the server console and even the Linphone shows 'Connected' status.

Problem: On speaking using a microphone on either of the ends, no voice is heard.

Thanks.


AudioSipServlet.java:

package org.example.servlet.sip;

import java.io.IOException;
import javax.servlet.sip.ConvergedHttpSession;
import org.mobicents.mscontrol.MsPeer;
import org.mobicents.mscontrol.MsPeerFactory;
import org.mobicents.mscontrol.MsProvider;
import org.mobicents.mscontrol.MsSession;
import org.mobicents.mscontrol.MsConnection;
import org.mobicents.mscontrol.MsLink;


import javax.servlet.ServletException;
import javax.servlet.sip.SipApplicationSession;
import javax.servlet.sip.SipFactory;
import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;
import javax.servlet.sip.SipSession;
import javax.servlet.sip.SipURI;


public class AudioSipServlet extends javax.servlet.sip.SipServlet implements
javax.servlet.Servlet {

// The SipFactory is used to create SIP request and SIP URIs
public static final String PR_JNDI_NAME = "media/trunk/PacketRelay/$";


protected void doInvite(SipServletRequest request) throws ServletException,
IOException {



log(" 1 Received INVITE request" + request.getMethod());
SipServletResponse response = request
.createResponse(SipServletResponse.SC_RINGING);
response.send();
Object sdpObj = request.getContent();
byte[] sdpBytes = (byte[]) sdpObj;
String sdp = new String(sdpBytes);
try {
String user = request.getFrom().getDisplayName();
if (user == null && request.getFrom().getURI() instanceof SipURI) {
user = ((SipURI) request.getFrom().getURI()).getUser();
}
/* MsPeerFactory - to get MsPeer instance */
/* MsPeer - returns an instance of a Peer object */
MsPeer mspeer = MsPeerFactory
.getPeer("org.mobicents.mscontrol.impl.MsPeerImpl");

/*
* Returns an instance of Provider object which contains the desired
* service name
*/

MsProvider msprovider = mspeer.getProvider();

/*
* MsSession provides a transient association of connections for
* real-time communication interchange
*/
/* createSession() - creates a session with no links */

MsSession mssession = msprovider.createSession();

/*
* createNetworkConnection(identifier) - specifies the identifier of
* media server endpoint
*/
MsConnection msconnection = mssession
.createNetworkConnection(PR_JNDI_NAME);

MediaConnectionListener listener = new MediaConnectionListener(request);
msconnection.addConnectionListener(listener);
msconnection.modify("$", sdp);
//request.getSession().setAttribute("msconnection", msconnection);
log (" 1 No exceptions");
} catch (Exception e) {
e.printStackTrace();

}

}


//log("Current Status: " + appSession.getAttribute("status").toString());

}




MediaConnectionListener.java:

package org.example.servlet.sip;

import java.io.IOException;

import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;

import org.apache.log4j.Logger;
import org.mobicents.mscontrol.MsConnection;
import org.mobicents.mscontrol.MsConnectionEvent;
import org.mobicents.mscontrol.MsConnectionListener;
import org.mobicents.mscontrol.MsEndpoint;
import org.mobicents.mscontrol.MsProvider;
import org.mobicents.mscontrol.MsSession;
import org.mobicents.mscontrol.MsNotifyEvent;

import javax.servlet.sip.SipServletMessage;
import org.mobicents.mscontrol.MsNotificationListener;



public class MediaConnectionListener implements MsConnectionListener,
MsNotificationListener {
private static Logger logger = Logger
.getLogger(MediaConnectionListener.class);

private SipServletMessage sipMessage;
private MsProvider provider;

public MediaConnectionListener(SipServletMessage message) {
System.out.println("2 Media Connection Listener");
this.sipMessage = message;

}

public void connectionCreated(MsConnectionEvent event) {
logger.info("connection created " + event);
}

public void connectionInitialized(MsConnectionEvent arg0) {
logger.info("connection initialized " + arg0);
}

public void connectionDisconnected(MsConnectionEvent arg0) {
logger.info("connection disconnected " + arg0);
}

public void connectionFailed(MsConnectionEvent arg0) {
logger.error("connection failed " + arg0);
if (sipMessage instanceof SipServletRequest) {
SipServletRequest inviteRequest = (SipServletRequest) sipMessage;
try {
inviteRequest.createResponse(
SipServletResponse.SC_SERVER_INTERNAL_ERROR).send();
} catch (IOException e) {
logger
.error(
"Exception in sending the error response",
e);
}
}

}

public void connectionHalfOpen(MsConnectionEvent arg0) {
logger.info("connection half opened" + arg0);
}

public void connectionOpen(MsConnectionEvent event) {
System.out.println("connection open");
if (sipMessage instanceof SipServletRequest) {
SipServletRequest request = (SipServletRequest) sipMessage;
connectionOpenRequest(event, request);
}

else {
SipServletResponse response = (SipServletResponse) sipMessage;
connectionOpenResponse(event, response);
}
}

public void connectionOpenResponse(MsConnectionEvent event,
SipServletResponse response) {
System.out.println("connection open response");
String sdp = event.getConnection().getLocalDescriptor();
SipServletRequest ack = response.createAck();

try {
ack.setContent(sdp, "application/sdp");
ack.send();
} catch (Exception e) {
logger.error(e);
}

provider = ConferenceCenter.getInstance().getProvider();
MsConnection msconnection = event.getConnection();
MsEndpoint msendpoint = msconnection.getEndpoint();
MsSession mssession = msconnection.getSession();

}

public void connectionOpenRequest(MsConnectionEvent event,
SipServletRequest inviteRequest) {

logger.info("connection open request" + event);
String sdp = event.getConnection().getLocalDescriptor();
SipServletResponse sipServletResponse = inviteRequest
.createResponse(SipServletResponse.SC_OK);
try {
sipServletResponse.setContent(sdp, "application/sdp");
sipServletResponse.send();
} catch (Exception e) {
logger.error(e);
}

}

public SipServletMessage getSipMessage() {
return sipMessage;
}

public void connectionModeRecvOnly(MsConnectionEvent arg0) {
// TODO Auto-generated method stub

}

public void connectionModeSendOnly(MsConnectionEvent arg0) {
// TODO Auto-generated method stub

}

public void update(MsNotifyEvent evt) {
logger.info(evt);
}

public void connectionModeSendRecv(MsConnectionEvent arg0) {
// TODO Auto-generated method stub

}

}

1 comment: