Outline • JAIN SLEE – Intro – Architecture – Features and Facilities
• SIP RA and JAIN SIP – JAIN SIP overview and architecture – SIP RA
• SIP Proxy call scenario – Demonstration – Wireshark capture – Advanced service (optional)
JAIN SLEE background • SLEE concept (Service Logic Execution Environment): – telecommunication vs enterprise services – Requirements: real time (high throughput and low latencies), high availability. – Event oriented – Service container that offers the non logical capabilities
• Java JAIN activity: SIP, SIP Servlet, SLEE • JAIN SLEE is a Java standard for SLEE as reported in JSR 22 (v.1.0) and JSR 240 (v.1.1) – It is a specification designed to meet stringent requirements for communication applications – It is the point of integration for multiple network resources and protocols
• Value-added services development: high level APIs & open source standard interfaces
Mobicents Platform • Mobicents Platform is an open source project (LGPL License) • The project is hosted on http://www.mobicents.org • Mobicents Platform includes: – – – – –
Mobicents JAIN SLEE Server Mobicents SIP Servlets Mobicents Media Server Mobicents SIP Presence Service Mobicents Diameter Server
• Mobicents JAIN SLEE Server: – Provides an open source implementation of a JSLEE container, compliant with JSR 22 - JSLEE 1.0 (Mobicents 2.xx is compliant with JSLEE 1.1) – Implemented as a Service inside the JBoss microkernel
JAIN SLEE architecture JAVA VM JBOSS AS
Management Interface (JMX)
JAIN SLEE Mobicents Service Container Service A
Facilities Service B
SBB A
SBB X
Trace Alarm Profiles
SBB B
SBB C
SBB Y
Event Router Resource Adaptors JCC, SIP, TCAP, Parlay/OSA, MGCP,…
Usage Timer
Component model • JSLEE defines different kind of components: – – – –
Services Service Building Blocks (SBBs) Events Resource Adaptors
• JSLEE defines how to compose components in order to create applications inside the container • JSLEE defines how to deploy components and a management interface to manage installed component – Service Activation – Service Versioning
• Every component has an XML descriptor that specifies its properties
SBB and Service • An SBB is a Service Building Block – Contains application and service logic (like an EJB) – Event handler, local interface, life cycle, callback method implementations
• A Service component inside JSLEE is composed by one SBB called Root SBB • A Root SBB can have child SBB Component, forming an SBB tree • Multiple SBBs belonging to the same Service can process events in parallel
Developing an SBB • The JAIN SLEE specification defines the Sbb Interface • SBB developer implements SBB abstract class by implementing SBB interface – Each SBB created provides an abstract class that implements the SBB interface – SBB abstract class contains the developer provided code for the life cycle callbacks, event handler methods, and abstract fire event methods
• The SLEE deployment tool generates the SBB concrete class by implementing the SBB abstract class – The SBB developer doesn't implement the SBB concrete class – The SBB concrete class is generated by the SLEE when the SBB is deployed into the container by extending the SBB developer provided SBB abstract class
Resource Adaptor • JAIN SLEE represents network resources as resource adaptors and each resource adaptor has a type – Resource adaptor type for SIP is ‘javax.sip’
• JAIN SLEE identifies Event by Event types – SIP Events are classified RequestEvents, ResponseEvents and TimeoutEvents, each of these classifications contains numerous types – For example the event type of a Request message of type ‘INVITE’ is javax.sip.RequestEvent.Request.INVITE’
• JAIN SLEE represents the flow of events as activities – Activity Objects in SIP are ClientTransactions (locally initiated) and ServerTransactions (remotely initiated)
Activity • Abstraction for a related stream of events • Examples: – Call object emitting call connected, disconnected, ... events – Mobile location report object emitting location update, ... Events
• Events are routed to SBB entity that are interested in them - An SBB Entity is an instance of an SBB
Overview: JAIN SIP • JAIN: Java APIs for Integrated Networks • Java-standard interface to a SIP signaling stack – Standardized the interface to the stack – Standardized the events and event semantics – Application portability - verified via the TCK
• Designed for the developer who requires powerful access to the SIP protocol • JAIN SIP can be utilized in a user agent, proxy, or embedded into a service container • Supported RFCs: – RFC 3261, 2976, 3262, – RFC 3265, 3311, 3428
JAIN SIP Architecture Application Listener SIP Messages
Listener SIP Events
SIP Messages
SIP Events
Provider
Provider
Listening Point
Listening Point
Stack
Stack Network
SipStack Interface • Manages Listening Points and Providers • SipStack associated with an IP address ─ Can Have multiple Listening points
• Application can have multiple SipStacks • Parses network messages and wrap them in objects • Manages retransmissions and fires timer events
SipProvider Interface • Send Request's either statefully via client transactions or statelessly • Send Response's to a recently received Requests either statefully via server transactions or statelessly • Register a SipListener to the SipProvider – Notifies Registered Listener of Events (Request/Response/Timeout)
• De-register a SipListener from the SipProvider – Once de-registered, no longer receives Events from SipProvider
• New Client and Server Transaction methods • Listening Point manipulation methods – Only one provider per listening point
SipListener Interface • Process Request's either statefully or statelessly dependent on application. • Process Response's to a recently sent Requests statefully. • Process Transaction timeouts and retransmits Timer events.
Responsibilities of the Application • Application registers an implementation of the SipListener interface to interact with the SIP Stack • Application MUST go via the SipProvider for all messaging with the stack – Application Sends messages and access stack objects via the SipProvider
• Application receives messages from the stack as Events via the SipListener interface.
SIP RA Service Container Service A
Service B
SBB A SBB B
SBB X SBB C
SBB Y
Listener Events Event Router
SIP RA Network
Provider Listening Point Stack
SIP
Services provided by SIP RA • Provide methods to format and send SIP messages • Parse incoming messages and enable services to access to fields via a standardized JAVA interface • Fires appropriate SLEE events during protocol operation (message arrivals, Transaction time-outs) • Provide Transaction support and manage Transaction state and lifetime on behalf of a user application • Provide Dialog support and manage Dialog state and lifetime on behalf on a user application
Demo
SIP Registrar
SIP Proxy
Proxy signaling flow
RTP Data
JSLEE ScratchCard signaling flow
Used Applications / Framework / Tools • Java Development Tools – – – –
Sun / Oracle JDK Eclipse Ant Maven
• JAIN SLEE Framework – Mobicents JAIN SLEE Application Server – Mobicents Media Server
• SIPp (SIP traffic generator) • Softphones (Kapanga / X-Lite) • Network Analyzer software (Wireshark)
References Sun / Oracle JDK
http://java.sun.com/javase/downloads/index.jsp
Eclipse
www.eclipse.org
Ant
http://ant.apache.org
Maven
http://maven.apache.org
NIST JAIN Sip
http://www-x.antd.nist.gov/proj/iptel/
Mobicents Platform www.mobicents.org - si consiglia di scaricare la versione 1.2.6.GA dal server SVN SIPp
http://sipp.sourceforge.net
Kapanga
www.kapanga.net
X-Lite
www.counterpath.com
Wireshark
www.wireshark.org
JSLEE UAS signaling flow JSLEE receives BYE
JSLEE sends BYE
SIP Transactions SIP transaction consists of a single request and any responses to that request.
Stateful proxy
Server transaction
Client transaction
Server transaction
Client transaction
UAC
UAS
Transaction Support • Transaction is created on incoming Request or may be created to send outgoing request. – When a Request is sent out statefully, application must request a ClientTransaction for the outgoing Request. – When a new Request arrives, Stack associates a ServerTransaction with Request and passes up to application.
• When a response arrives, the Stack possibly associates a previously created ClientTransaction with the response and passes up to the Application. • The JAIN SIP implementation manages the association between Transactions and Dialogs.
Support for Dialogs • A Dialog is a peer to peer association between communicating SIP endpoints. – Maintains Route Sets and Sequence Numbers.
• Dialog deletion may be under application control. • Transactions may belong to a Dialog – Dialog state changes as a result of changes in Transaction State
Addresses, Messaging and Headers • Defines support for Address/Header/Message Factories. • Address package contains a URI wrapper and defines URIs for SIP and Tel URIs. • Header package defines interfaces for all the supported headers. • Accessor (set/get) methods for SIP Header parameters. • Deep copy requirement for cloning Addresses, Headers and Messages for the benefit of proxies.
Application - Stack Creation Initialize Stack using SipFactory: try { Properties properties = new Properties(); properties.setProperty("javax.sip.IP_ADDRESS", "129.6.55.181"); properties.setProperty("javax.sip.OUTBOUND_PROXY", "129.6.55.182:5070/UDP"); ……// Other initialization properties. try { sipStack = sipFactory.createSipStack(properties);
} catch(SipException e) { System.exit(-1); } }
Application – Request Creation Initialize Request using Factories: try { SipURI requestURI = addressFactory.createSipURI (toUser, toSipAddress); // … Create other headers Request request = messageFactory.createRequest (requestURI, Request.INVITE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); }
Application - Sending Requests Send outgoing messages: try { // Create the client transaction ClientTransaction inviteTid = sipProvider.getNewClientTransaction(request); // send the request sipProvider.sendRequest(inviteTid,request); }
Application – Processing Requests Handle incoming messages as Events: try { public void processRequest(RequestEvent requestEvent) { Request request = requestReceivedEvent.getRequest(); ServerTransaction st = requestEvent.getTransaction(); // do request specific processing here } }