Mobicents SS7Stack User Guide
Mobicents SS7Stack User Guide
Mobicents SS7Stack User Guide
Amit Bhayani <amit.bhayani (at) gmail.com> Bartosz Baranowski <baranowb (at) gmail.com> Sergey Vetyutnev <serg.vetyutnev (at) gmail.com> Vinu S Renish <vinu.saseedaran (at) gmail.com>
Preface ............................................................................................................................. vi 1. Document Conventions ......................................................................................... vi 1.1. Typographic Conventions ............................................................................ vi 1.2. Pull-quote Conventions ............................................................................. viii 1.3. Notes and Warnings ................................................................................. viii 2. Provide feedback to the authors! ........................................................................... ix 1. Introduction ................................................................................................................. 1 1.1. Mobicents jSS7 Overview .................................................................................... 1 1.2. Introduction to SS7 ............................................................................................. 1 1.2.1. SS7 Overview .......................................................................................... 1 1.2.2. SS7 Stack Overview ................................................................................ 2 2. The Basics of Mobicents jSS7 Stack ........................................................................... 3 2.1. Logical Divisions ................................................................................................. 3 2.2. Functional Blocks of Mobicents jSS7 Stack .......................................................... 5 2.2.1. Shell Management client .......................................................................... 6 2.2.2. SS7 Service Elements .............................................................................. 6 2.2.3. Mobicents Signaling Gateway ................................................................... 8 2.2.4. SS7 Simulator ........................................................................................ 3. Installation and Running ............................................................................................ 3.1. Installing ........................................................................................................... 3.1.1. Binary .................................................................................................... 3.2. Mobicents SS7 Service ..................................................................................... 3.3. Installing Mobicents SS7 Service Binary ............................................................. 3.4. Running Mobicents SS7 Service ........................................................................ 3.4.1. Starting .................................................................................................. 3.4.2. Stopping ................................................................................................ 3.5. Configuring Mobicents SS7 Service ................................................................... 3.5.1. Configuring M3UA .................................................................................. 3.5.2. Configuring dahdi ................................................................................... 3.5.3. Configuring dialogic ................................................................................ 3.5.4. Configuring MTP3 routing label ............................................................... 3.5.5. Configuring SCCP .................................................................................. 3.5.6. Configuring ShellExecutor ....................................................................... 3.5.7. Configuring TCAP .................................................................................. 3.5.8. Configuring MAP .................................................................................... 3.5.9. Configuring CAP .................................................................................... 3.5.10. Configuring ISUP .................................................................................. 3.5.11. Configuring SS7Service ........................................................................ 3.6. Installing Mobicents Signaling Gateway Binary .................................................... 3.7. Running Mobicents Signaling Gateway ............................................................... 3.7.1. Starting Mobicents Signaling Gateway ..................................................... 3.7.2. Start the Gateway With Alternate Configuration ........................................ 3.7.3. Stopping ................................................................................................ 3.8. Configuring Mobicents Signaling Gateway .......................................................... 10 12 12 12 16 17 17 17 19 19 20 21 22 23 24 25 26 27 28 28 29 30 30 30 31 31 31
iii
Mobicents jSS7 Stack User Guide 3.8.1. Configuring M3AU (Signaling Gateway) ................................................... 31 3.8.2. Configuring LinksetFactory ...................................................................... 32 3.8.3. Configuring LinksetManager .................................................................... 3.8.4. Configuring ShellExecutor ....................................................................... 3.8.5. Configuring SignalingGateway ................................................................. 3.9. Setup from source ............................................................................................ 3.9.1. Release Source Code Building ................................................................ 3.9.2. Development Trunk Source Building ........................................................ 4. Hardware Setup ......................................................................................................... 4.1. Sangoma .......................................................................................................... 4.2. Diguim .............................................................................................................. 4.3. Dialogic ............................................................................................................ 5. Shell Command Line ................................................................................................. 5.1. Running the Shell ............................................................................................. 5.1.1. Start the Shell Client .............................................................................. 5.1.2. Connect to Managed Instance ................................................................ 5.1.3. Disconnect ............................................................................................. 5.2. Command-line Completion ................................................................................. 5.3. Linkset Management ......................................................................................... 5.3.1. Create Linkset ........................................................................................ 5.3.2. Remove Linkset ..................................................................................... 5.3.3. Activate Linkset ...................................................................................... 5.3.4. Deactivate Linkset .................................................................................. 5.3.5. Create Link ............................................................................................ 5.3.6. Remove Link .......................................................................................... 5.3.7. Activate Link .......................................................................................... 5.3.8. Deactivate Link ...................................................................................... 5.3.9. Show status ........................................................................................... 5.4. SCCP Management .......................................................................................... 5.4.1. Service access points and destinations management ................................ 5.4.2. Rule Management .................................................................................. 5.4.3. Address Management ............................................................................. 5.4.4. Remote Signaling Point Management ...................................................... 5.4.5. Remote Sub-System Management .......................................................... 5.4.6. Long message rules Management ........................................................... 5.4.7. Concerned signaling point codes Management ......................................... 5.4.8. General parameters ................................................................................ 5.5. M3UA Management .......................................................................................... 5.5.1. M3UA Management - SCTP ................................................................... 5.5.2. M3UA Management ................................................................................ 6. ISUP ........................................................................................................................... 6.1. ISUP Configuration ........................................................................................... 6.2. ISUP Usage ..................................................................................................... 6.3. ISUP Example .................................................................................................. 33 33 34 35 35 37 38 38 38 38 39 39 39 39 40 40 42 42 43 44 44 45 45 46 46 47 48 49 52 57 62 64 66 67 69 71 71 76 85 85 87 87
iv
Mobicents jSS7 Stack User Guide 7. SCCP ......................................................................................................................... 90 7.1. Routing Management ........................................................................................ 90 7.1.1. GTT Configuration .................................................................................. 90 7.2. SCCP Usage .................................................................................................... 93 7.3. SCCP User Part Example ................................................................................. 94 8. TCAP .......................................................................................................................... 96 8.1. Mobicents jSS7 Stack TCAP Usage ................................................................... 96 8.2. Mobicents jSS7 Stack TCAP User Part Example ................................................. 98 9. MAP ......................................................................................................................... 101 9.1. jSS7 Stack MAP ............................................................................................. 101 9.2. jSS7 Stack Sending a MAP request (processUnstructuredSS-Request as an example) ............................................................................................................... 104 9.3. jSS7 Stack MAP Usage ................................................................................... 106 10. CAP ........................................................................................................................ 116 10.1. jSS7 Stack CAP ............................................................................................ 117 10.2. jSS7 Stack Sending a CAP request (InitialDPRequest as an example) .............. 119 10.3. jSS7 Stack CAP Usage ................................................................................. 122 11. SS7 Simulator ........................................................................................................ 11.1. SS7 Simulator configuring .............................................................................. 11.1.1. Running SS7 Simulator locally ............................................................ 11.1.2. Running SS7 Simulator remotely ......................................................... 11.1.3. Configuring Simulator layers ................................................................ 11.2. SS7 Simulator test cases ............................................................................... 11.2.1. USSD Server ..................................................................................... 11.2.2. USSD Client ....................................................................................... 11.2.3. SMS Server ....................................................................................... 11.2.4. SMS Client ......................................................................................... A. Java Development Kit (JDK): Installing, Configuring and Running ................................. B. Setting the JBOSS_HOME Environment Variable ........................................................ C. Revision History ........................................................................................................ Index ............................................................................................................................. 140 140 141 143 146 148 148 149 150 152 154 158 161 162
Preface
1. Document Conventions
This manual uses several conventions to highlight certain words and phrases and draw attention to specific pieces of information. In PDF and paper editions, this manual uses typefaces drawn from the Liberation Fonts [https:// fedorahosted.org/liberation-fonts/] set. The Liberation Fonts set is also used in HTML editions if the set is installed on your system. If not, alternative but equivalent typefaces are displayed. Note: Red Hat Enterprise Linux 5 and later includes the Liberation Fonts set by default.
Used to highlight system input, including shell commands, file names and paths. Also used to highlight key caps and key-combinations. For example: To see the contents of the file my_next_bestselling_novel in your current working directory, enter the cat my_next_bestselling_novel command at the shell prompt and press Enter to execute the command. The above includes a file name, a shell command and a key cap, all presented in Mono-spaced Bold and all distinguishable thanks to context. Key-combinations can be distinguished from key caps by the hyphen connecting each part of a key-combination. For example: Press Enter to execute the command. Press Ctrl+Alt+F1 to switch to the first virtual terminal. Press Ctrl+Alt+F7 to return to your X-Windows session. The first sentence highlights the particular key cap to press. The second highlights two sets of three key caps, each set pressed simultaneously. If source code is discussed, class names, methods, functions, variable names and returned values mentioned within a paragraph will be presented as above, in Mono-spaced Bold. For example: File-related classes include filesystem for file systems, file for files, and dir for directories. Each class has its own associated set of permissions. Proportional Bold
vi
Preface
This denotes words or phrases encountered on a system, including application names; dialogue box text; labelled buttons; check-box and radio button labels; menu titles and sub-menu titles. For example: Choose System > Preferences > Mouse from the main menu bar to launch Mouse Preferences. In the Buttons tab, click the Left-handed mouse check box and click Close to switch the primary mouse button from the left to the right (making the mouse suitable for use in the left hand). To insert a special character into a gedit file, choose Applications > Accessories > Character Map from the main menu bar. Next, choose Search > Find from the Character Map menu bar, type the name of the character in the Search field and click Next. The character you sought will be highlighted in the Character Table. Double-click this highlighted character to place it in the Text to copy field and then click the Copy button. Now switch back to your document and choose Edit > Paste from the gedit menu bar. The above text includes application names; system-wide menu names and items; applicationspecific menu names; and buttons and text found within a GUI interface, all presented in Proportional Bold and all distinguishable by context. Note the > shorthand used to indicate traversal through a menu and its sub-menus. This is to avoid the difficult-to-follow 'Select Mouse from the Preferences sub-menu in the System menu of the main menu bar' approach.
Mono-spaced Bold Italic or Proportional Bold Italic
Whether Mono-spaced Bold or Proportional Bold, the addition of Italics indicates replaceable or variable text. Italics denotes text you do not input literally or displayed text that changes depending on circumstance. For example: To connect to a remote machine using ssh, type ssh [email protected] at a shell prompt. If the remote machine is example.com and your username on that machine is john, type ssh [email protected]. The mount -o remount file-system command remounts the named file system. For example, to remount the /home file system, the command is mount -o remount /home. To see the version of a currently installed package, use the rpm -q package command. It will return a result as follows: package-version-release. Note the words in bold italics above username, domain.name, file-system, package, version and release. Each word is a placeholder, either for text you enter when issuing a command or for text displayed by the system. Aside from standard usage for presenting the title of a work, italics denotes the first use of a new and important term. For example:
vii
Preface
When the Apache HTTP Server accepts requests, it dispatches child processes or threads to handle them. This group of child processes or threads is known as a server-pool. Under Apache HTTP Server 2.0, the responsibility for creating and maintaining these server-pools has been abstracted to a group of modules called Multi-Processing Modules (MPMs). Unlike other modules, only one module from the MPM group can be loaded by the Apache HTTP Server.
books books_tests
Desktop Desktop1
documentation downloads
drafts images
mss notes
photos scripts
stuff svgs
svn
Source-code listings are also set in Mono-spaced Roman but are presented and highlighted as follows:
package org.jboss.book.jca.ex1; import javax.naming.InitialContext; public class ExClient { public static void main(String args[]) throws Exception { InitialContext Object EchoHome Echo iniCtx ref home echo = = = = new InitialContext(); iniCtx.lookup("EchoBean"); (EchoHome) ref; home.create();
viii
Preface
Note
A note is a tip or shortcut or alternative approach to the task at hand. Ignoring a note should have no negative consequences, but you might miss out on a trick that makes your life easier.
Important
Important boxes detail things that are easily missed: configuration changes that only apply to the current session, or services that need restarting before an update will apply. Ignoring Important boxes won't cause data loss but may cause irritation and frustration.
Warning
A Warning should not be ignored. Ignoring warnings will most likely cause data loss.
ix
Chapter 1. Introduction
1.1. Mobicents jSS7 Overview
Mobicents jSS7 (Java SS7) is the only Open Source Java based implementation of the SS7 protocol stack. It comes with JSLEE MAP and ISUP Resource Adaptors (RA) and enables legacy developers to build SS7 applications with ease. Developers only require an understanding of Resource Adaptors and focus on building applications rather than worry about the SS7 stack. Mobicents jSS7 is compatible with Dialogic boards, dahdi based cards (Diguim and Sangoma) and also has inbuilt support for SIGTRAN (M3UA). Mobicents jSS7 Stack also supports TeleStax SS7 Cards which has MTP2/3 support on-board and hence lower processing load on server hosting Mobicents jSS7 Stack Since Mobicents jSS7 is Java based, it is cross-platform and can be installed and used on any Operating System that supports Java. The Open Source Software gives you the flexibility to understand the readily available source code and customise the product for your Enterprise needs.
Important
Spaces were introduced in some tables and code listings to ensure proper page render.
Introduction
SS7 Stack overview Mobicents jSS7 Stack is a software based implementation of the SS7 protocol. It provides implementation for Level 2 and above in the SS7 protocol Stack. The Mobicents jSS7 Stack is a platform in the sense that it does not provide the application itself but rather allows users to build their own SS7 applications using Mobicents jSS7 Stack as a platform. Below diagram shows various SS7 protocols implemented by Mobicents jSS7 Stack
Mobicents jSS7 Stack Scenario 2: Mobicents Signaling Gateway - Level 3 and below are installed on one machine and Level 4 is installed on a different machine.
Important
If you use Mobicents M3UA stack, you must use JDK 7 to run the stack as well as to compile the source code. M3UA leverages Java SCTP which is available only in JDK 7.
The Basics of Mobicents jSS7 Stack Shell Management Client SS7 Service Elements Signaling Gateway SS7 Simulator
Mobicents jSS7 Stack in an interactive manner. It connects to different instances of Mobicents jSS7 Stack which manages Linksets, SCCP resource, routing and M3UA. For detailed information please refer to: Chapter 5, Shell Command Line. Usually Shell will be invoked from remote machine(remote to Linksets and application protocols).
The figure below depicts the elements that are deployed as part of the SS7 MAP Service.
Mobicents jSS7 Stack Service Elements SS7 Service Elements serve the following purposes:
Expose protocol access points: Access points allow users to access lower layer protocols like MAP and interact with the SS7 network through such protocols. Expose management interface: Shell Executor allows the Shell client to connect and issue commands. Configuring the SS7 Service Elements is explained below in the section Section 3.5, Configuring Mobicents SS7 Service
4666. Mobicents M3UA Stack can be used on the Application Server side or on the Signaling Gateway side or can also be used in peer-to-peer mode IPSP.
M3UA uses the Mobicents SCTP (Stream Control Transmission Protocol) Stack.
Note
Mobicents SCTP Stack uses Java SCTP layer which is only available from JDK 7 onwards.
Mobicents M3UA Stack configured as an AS To use M3UA Stack as an AS, the Routing Context (RC) may not be known and is optional. Refer to Section Section 3.5.1, Configuring M3UA for help in configuring M3UA Stack as an AS.
Mobicents M3UA Stack configured as a SG Mobicents M3UA Stack used on the SG side will share a common point code with a set of M3UA Application Servers. You can configure the M3UA stack on SG side in one of the two traffic modes: Loadbalance or Override. Broadcast traffic mode is not supported. Refer to Section 3.8, Configuring Mobicents Signaling Gateway for instructions on configuring M3UA Stack as SG. Mobicents M3UA Stack used on SG side doesn't support routing key management messages. The Routing Key should be provisioned statically using the management console.
10
The Basics of Mobicents jSS7 Stack DialogicCard DahdiCard [yet to be implemented] Layer 2 SCCP ISUP [yet to be implemented] Layer 3 TCAP + MAP TCAP + CAP [yet to be implemented] TCAP + INAP [yet to be implemented] Testing Task Layer USSD client test USSD server test SMS server test SMS client test
11
3.1.1. Binary
The Mobicents jSS7 Stack binary is broken down into a few modules. Binary release has following layout:
12
Note
X.Y.Z in above layout is the respective release version of binary.
The following is a description of the important services and libraries that make up Mobicents jSS7 Stack
asn : Abstract Syntax Notation One (ASN.1) library is used by various Mobicents jSS7 Stack protocols to encode/decode the structured data exchanged between Signaling Point over
13
networks. To know more about asn library refer to document included with asn. Applications using any of the Mobicents jSS7 Stack User Protocols may never need to call asn API directly, however it must be in classpath as Mobicents jSS7 Stack User Protocols refers this library. sctp : Stream Control Transmission Protocol (SCTP) Library is providing the convenient API's over Java SCTP. This library will be used only if M3UA layer is used. To understand more about sctp, refer to documentation included in sctp/docs ss7 : ss7 contains the core protocol libraries to be used by end application as well as service that is deployed in JBoss AS. The sub-modules included in ss7 are docs : User guide for Mobicents jSS7 Stack mobicents-sgw : Standalone Signaling Gateway as explained in section Section 2.2.3, Mobicents Signaling Gateway mobicents-sgw binary has following layout:
14
mobicents-ss7-service : SS7 service is the core engine as explained in section Section 2.2.2, SS7 Service Elements mobicents-ss7-service binary has following layout:
15
mobicents-ss7-simulator : SS7 Simulator is an application for testing SS7 stack and displaying its functionality. It is also a good example of how to use this stack. mobicents-ss7-simulator binary has following layout:
native : native libraries component to interact with SS7 Card installed on server, runtime component. As of now native libraries are compiled only for linux OS. However if you plan to use M3UA there is no dependency on OS as everything is 100% java. protocols : The Mobicents jSS7 Stack User Protocols libraries. Your application would directly call the API's exposed by these libraries. Depending on application you may be either interested in TCAP, MAP or both or ISUP libraries shell : the Command Line Interface (CLI) module to manage the Mobicents jSS7 Stack. Refer Chapter 5, Shell Command Line to understand how to use shell
16
Important
Ant 1.6 (or higher) is used to install the binary. Instructions for using Ant, including install, can be found at http://ant.apache.org/
While above steps will deploy the necessary ss7 service and shell components, the java.library.path should be set to point the directory containing native component or should be copied to JBoss native library path manually. This step is only required if you are using the SS7 board on server.
3.4.1. Starting
Once installed, you can run server by executing the run.sh (Unix) or run.bat (Microsoft Windows) startup scripts in the <install_directory>/bin directory (on Unix or Windows). If the service started properly you should see following lines in the Unix terminal or Command Prompt depending on your environment:
17
20:34:20,329 INFO [ManagementImpl] (main) SCTP configuration file path /home/abhayani/workarea/mobicents/binary/JSLEE/ss7-mobicentsjainslee-2.7.0.FINAL-jboss-5.1.0.GA/jboss-5.1.0.GA/server/default/data/ SCTPManagement_sctp.xml 20:34:20,343 INFO [SelectorThread] (Thread-17) SelectorThread for Management=SCTPManagement started. 20:34:20,343 INFO [ManagementImpl] (main) Started SCTP Management=SCTPManagement WorkerThreads=0 SingleThread=true 20:34:20,413 INFO [M3UAManagement] (main) M3UA configuration file path /home/abhayani/workarea/mobicents/binary/JSLEE/ss7-mobicentsjainslee-2.7.0.FINAL-jboss-5.1.0.GA/jboss-5.1.0.GA/server/default/data/ Mtp3UserPart_m3ua.xml 20:34:20,413 INFO [M3UAManagement] (main) Started M3UAManagement 20:34:20,424 INFO [Scheduler] (main) Starting 20:34:20,424 INFO [Scheduler] (main) Started 20:34:20,442 INFO [SccpStackImpl-SccpStack] (main) Starting ... 20:34:20,450 INFO [Router] (main) SCCP Router configuration file path /home/abhayani/workarea/mobicents/binary/JSLEE/ss7-mobicentsjainslee-2.7.0.FINAL-jboss-5.1.0.GA/jboss-5.1.0.GA/server/default/data/ SccpStack_sccprouter.xml 20:34:20,451 INFO [Router] (main) Started SCCP Router 20:34:20,451 INFO [SccpResource] (main) SCCP Resource configuration file path /home/abhayani/workarea/mobicents/binary/JSLEE/ss7-mobicentsjainslee-2.7.0.FINAL-jboss-5.1.0.GA/jboss-5.1.0.GA/server/default/data/ SccpStack_sccpresource.xml 20:34:20,451 INFO [SccpResource] (main) Started Sccp Resource 20:34:20,451 INFO [SccpStackImpl-SccpStack] (main) Starting routing engine... 20:34:20,451 INFO [SccpStackImpl-SccpStack] (main) Starting management ... 20:34:20,451 INFO [SccpStackImpl-SccpStack] (main) Starting MSU handler... 20:34:20,466 INFO [ShellServer] (main) Starting SS7 management shell environment 20:34:20,470 INFO [ShellServer] (main) ShellExecutor listening at /127.0.0.1:3435 20:34:20,493 INFO [TCAPStackImpl] (main) Starting ...org.mobicents.protocols.ss7.tcap.TCAPProviderImpl@24fcd6bb 20:34:20,493 INFO [TCAPProviderImpl] (main) Starting TCAP Provider 20:34:20,493 INFO [TCAPProviderImpl] (main) Registered SCCP listener with address 8 20:34:20,496 INFO [TCAPStackImpl] (main) Starting ...org.mobicents.protocols.ss7.tcap.TCAPProviderImpl@9d55d00 20:34:20,496 INFO [TCAPProviderImpl] (main) Starting TCAP Provider 20:34:20,497 INFO [TCAPProviderImpl] (main) Registered SCCP listener with address 146 20:34:20,499 INFO [TCAPStackImpl] (main) Starting ...org.mobicents.protocols.ss7.tcap.TCAPProviderImpl@7712e5aa 20:34:20,499 INFO [TCAPProviderImpl] (main) Starting TCAP Provider
18
20:34:20,499 INFO
address 9 20:34:20,716 INFO [SS7Service] (main) [[[[[[[[[ Mobicents jSS7 2.0.0SNAPSHOT TCAP service started ]]]]]]]]] 20:34:20,756 INFO [SS7Service] (main) [[[[[[[[[ Mobicents jSS7 2.0.0SNAPSHOT MAP service started ]]]]]]]]] 20:34:20,765 INFO [SS7Service] (main) [[[[[[[[[ Mobicents jSS7 2.0.0SNAPSHOT CAP service started ]]]]]]]]] 20:34:20,775 INFO [SS7Service] (main) [[[[[[[[[ Mobicents jSS7 2.0.0SNAPSHOT ISUP service started ]]]]]]]]] 20:34:20,801 INFO [Http11Protocol] (main) Starting Coyote HTTP/1.1 on http-127.0.0.1-8080 20:34:20,816 INFO [AjpProtocol] (main) Starting Coyote AJP/1.3 on ajp-127.0.0.1-8009 20:34:20,821 INFO [ServerImpl] (main) JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)] Started in 27s:39ms
If you have started ss7-2.0.0-SNAPSHOT for the first time, SS7 is not configured. You need to use Shell Client to connect to ss7-2.0.0-SNAPSHOT as defined in Chapter 5, Shell Command Line . With CLI you can configure how service interacts with SS7 network, that is you configure either installed SS7 card and its native library , or M3UA layer. Once the configured, the state and configuration of SS7 is persisted which stands server re-start.
3.4.2. Stopping
You can shut down the server(s) by executing the shutdown.sh -s (Unix) or shutdown.bat -s (Microsoft Windows) scripts in the <install_directory>/bin directory (on Unix or Windows). Note that if you properly stop the server, you will see the following three lines as the last output in the Unix terminal or Command Prompt:
[Server] Shutdown complete Halting VM
19
dahdi dialogic The ss7 service will be configured with either of these services.
<!-- ==================================================================== --> <!-- SCTP Properties --> <!-- Used by M3UA layer --> <!-- ==================================================================== --> <bean name="SCTPManagement" class="org.mobicents.protocols.sctp.ManagementImpl"> <constructor> <parameter>SCTPManagement</parameter> </constructor> <property name="persistDir">${jboss.server.data.dir}</property> <property name="singleThread">true</property> <property name="connectDelay">5000</property> </bean> <bean name="SCTPShellExecutor" class="org.mobicents.protocols.ss7.m3ua.impl.oam.SCTPShellExecutor"> <property name="sctpManagement"> <inject bean="SCTPManagement" /> </property> </bean> <!-- ==================================================================== --> <!-- M3UA --> <!-- M3UAManagement is managing the m3ua side commands --> <!-- ==================================================================== --> <!-- --> <bean name="Mtp3UserPart" class="org.mobicents.protocols.ss7.m3ua.impl.M3UAManagement"> <constructor> <parameter>Mtp3UserPart</parameter> </constructor> <property name="persistDir">${jboss.server.data.dir}</property> <property name="transportManagement"><inject bean="SCTPManagement" /></property> <property name="routingLabelFormat"><inject bean="RoutingLabelFormat" /></property> </bean> <bean name="M3UAShellExecutor" class="org.mobicents.protocols.ss7.m3ua.impl.oam.M3UAShellExecutor"> <property name="m3uaManagement"> <inject bean="Mtp3UserPart" /> </property> </bean>
20
name is prepend to xml file created by SCTP stack for persisting state of SCTP resources. The
xml is stored in path specified by persistDir property above.
For
example
in
above
case,
when
Mobicents
SS7
Service
is
started
file
directory. Stack has following properties: singleThread SCTP stack is implemented such that 1 thread is dedicated for IO and by default 1 thread for calling application above SCTP. Its possible to configure multiple threads for calling applications above in which case singleThread should be set to false and set workerThreads to number of threads you want. workerThreads Number of worker threads to call the application above SCTP. By default only one thread is used. connectDelay If the SCTP Socket is client-side, connectDelay specifies the delay time in milliseconds before which connection with the server will attempted. This delay is necessary when there is network disruption and connection between client and server breaks so that SCTP stack doesn't continuously attempt to reconnect.
org.mobicents.protocols.ss7.m3ua.impl.M3UAManagement takes String as constructor
argument. The name is prepend to xml file created by M3UA stack for persisting state of M3UA resources. The xml is stored in path specified by persistDir property above. For example in above case, when Mobicents SS7 Service is started file Mtp3UserPart_m3ua.xml will be created at $JBOSS_HOME/server/profile_name/data directory Stack has following properties: routingLabelFormat The routing label format supported by this network. See Section 3.5.4, Configuring MTP3 routing label for further details.
(Sangoma or Diguim cards). DahdiLinksetFactory is responsible to create new instances of corresponding DahdiLinkset when instructed by LinksetManager. DahdiLinksetFactory
<bean name="DahdiLinksetFactory"
21
class="org.mobicents.ss7.hardware.dahdi.oam.DahdiLinksetFactory"> </bean>
LinksetFactoryFactory is just a call-back class listening for new factories deployed and
maintains Map of available factory name vs factory. You should never touch this bean.
<!-- ================================================ --> <!-- Linkset manager Service <!-- ================================================ --> <bean name="LinksetManager" class="org.mobicents.ss7.linkset.oam.LinksetManager"> <property name="linksetFactoryFactory"> <inject bean="LinksetFactoryFactory" /> </property> <property name="persistDir">${jboss.server.data.dir}</property> </bean> <bean name="LinksetExecutor" class="org.mobicents.ss7.linkset.oam.LinksetExecutor"> <property name="linksetManager"> <inject bean="LinksetManager" /> </property> </bean>
-->
LinksetManager when started looks for file linksetmanager.xml containing serialized information about underlying linksets and links. The directory path is configurable by changing value of persistDir property.
Warning
linksetmanager.xml should never be edited by hand. Always use Shell Client to
22
<!-- ==================================================================== --> <!-- Dialogic Mtp3UserPart --> <!-- ==================================================================== --> <!----> <bean name="Mtp3UserPart" class="org.mobicents.ss7.hardware.dialogic.DialogicMtp3UserPart"> <property name="sourceModuleId">61</property> <property name="destinationModuleId">34</property> <property name="routingLabelFormat"> <inject bean="RoutingLabelFormat" /> </property> </bean>
routingLabelFormat The routing label format supported by this network. See Section 3.5.4, Configuring MTP3 routing label for further details.
<!-- ==================================================================== --> <!-- MTP3 Properties --> <!-- Define MTP3 routing label Format --> <!-- ==================================================================== --> <bean name="RoutingLabelFormat" class="org.mobicents.protocols.ss7.mtp.RoutingLabelFormat"> <constructor factoryClass="org.mobicents.protocols.ss7.mtp.RoutingLabelFormat" factoryMethod="getInstance"> <parameter>ITU</parameter> </constructor> </bean>
23
<!-- ==================================================================== --> <!-- SCCP Service --> <!-- ==================================================================== --> <bean name="SccpStack" class="org.mobicents.protocols.ss7.sccp.impl.SccpStackImpl"> <constructor> <parameter>SccpStack</parameter> </constructor> <property name="persistDir">${jboss.server.data.dir}</property> <property name="removeSpc">true</property> <property name="mtp3UserParts"> <map keyClass="java.lang.Integer" valueClass="org.mobicents.protocols.ss7.mtp.Mtp3UserPart"> <entry> <key>1</key> <value> <inject bean="Mtp3UserPart" /> </value> </entry> </map> </property> </bean> <bean name="SccpExecutor" class="org.mobicents.protocols.ss7.sccp.impl.oam.SccpExecutor"> <property name="sccpStack"> <inject bean="SccpStack" /> </property> </bean>
argument. The name is prepend to xml file created by SCCP stack for persisting state of SCCP resources. The xml is stored in path specified by persistDir property above. For example in above case, when Mobicents SS7 Service is started two file's SccpStack_sccpresource.xml and SccpStack_sccprouter.xml will be created at $JBOSS_HOME/server/profile_name/data directory Stack has following properties:
24
persistDir As explained above removeSpc After Global Title Translation, if the SCCP address includes the destination point code (DPC) however Address Indicator (AI) indicates route on Global Title and removeSpc is set to true, DPC will be removed from SCCP Address. The same rule applies for both calling as well as called party SCCP Address. mtp3UserParts specifies SS7 Level 3 to be used as transport medium( be it SS7 card or M3UA). Mobicents jSS7 Stack SCCP allows configuring multiple MTP3 layers for same SCCP stack. This allows to have multiple local point-code and connecting to various networks while SCCP layer remains same
SccpExecutor accepts sccp commands and executes necessary operations
executed on local resources to perform actions like creation and management of SCCP routing rule, management of SCTP and management of M3UA stack.
<!-- ==================================================================== --> <!-- Shell Service --> <!-- ==================================================================== --> <!-- Define Shell Executor --> <bean name="ShellExecutor" class="org.mobicents.ss7.management.console.ShellServer"> <constructor> <parameter> <inject bean="SS7Scheduler" /> </parameter> <parameter> <list class="javolution.util.FastList" elementClass="org.mobicents.ss7.management.console.ShellExecutor"> <inject bean="SccpExecutor" /> <inject bean="M3UAShellExecutor" /> <inject bean="SCTPShellExecutor" /> </list> </parameter> </constructor> <property name="address">${jboss.bind.address}</property> <property name="port">3435</property> </bean>
By default ShellExecutor listens at jboss.bind.address and port 3435. You may set the address property to any valid IP address that your host is assigned. The shell commands are exchanged over TCP/IP.
25
Note
To understand JBoss bind options look at Installation_And_Getting_Started_Guide [http://docs.jboss.org/jbossas/docs/Installation_And_Getting_Started_Guide/5/ html_single/index.html]
SCTPShellExecutor and M3UAShellExecutor is declared only if MTP layer M3UA is used. If dialogic MTP layer is used these beans are not decalred and should be removed from FastList
too. For dahdi need to declare LinksetExecutor bean and add in FastList above.
each MAP, CAP Service. If you are using either one, feel free to delete other.
<!-- ==================================================================== --> <!-- TCAP Service --> <!-- ==================================================================== --> <bean name="TcapStackMap" class="org.mobicents.protocols.ss7.tcap.TCAPStackImpl"> <constructor> <parameter> <inject bean="SccpStack" property="sccpProvider" /> </parameter> <parameter>8</parameter> </constructor> <property name="dialogIdleTimeout">60000</property> <property name="invokeTimeout">30000</property> <property name="maxDialogs">25000</property> </bean> <bean name="TcapStackCap" class="org.mobicents.protocols.ss7.tcap.TCAPStackImpl"> <constructor> <parameter> <inject bean="SccpStack" property="sccpProvider" /> </parameter> <parameter>146</parameter> </constructor> <property name="dialogIdleTimeout">60000</property> <property name="invokeTimeout">30000</property> <property name="maxDialogs">25000</property> </bean> <bean name="TcapStack" class="org.mobicents.protocols.ss7.tcap.TCAPStackImpl"> <constructor> <parameter> <inject bean="SccpStack" property="sccpProvider" /> </parameter> <parameter>9</parameter> </constructor> <property name="dialogIdleTimeout">60000</property> <property name="invokeTimeout">30000</property> <property name="maxDialogs">25000</property>
26
</bean>
takes SccpStack as constructor argument. TCAP uses passed SCCP stack. Constructor also takes the sub system number (SSN) which is registered with passed SCCP stack.
org.mobicents.protocols.ss7.tcap.TCAPStackImpl
dialogIdleTimeout The TCAP Dialog idle timeout in milli-seconds invokeTimeout Component invoke timeout value in milli-seconds dialogIdRangeStart All the outgoing Dialog will have id started with dialogIdRangeStart. dialogIdRangeStart cannt be greater than dialogIdRangeEnd dialogIdRangeEnd All the outgoing Dialog will have id started with dialogIdRangeStart and incremented by 1 for each new outgoing dialog till dialogIdRangeEnd. After this dialog is will again start from dialogIdRangeStart value. maxDialogs Maximum concurrent dialog's allowed at any given point of time. If application tries to create more dialog than this, exception is thrown. dialogIdRangeEnd - dialogIdRangeStart must alwasy be less than maxDialogs
<!-- ==================================================================== --> <!-- MAP Service --> <!-- ==================================================================== --> <bean name="MapStack" class="org.mobicents.protocols.ss7.map.MAPStackImpl"> <constructor> <parameter> <inject bean="TcapStackMap" property="provider" /> </parameter> </constructor> </bean>
MAP uses passed TCAP stack. Feel free to delete declaration of this bean if your service is consuming only CAP messages.
27
<!-- ==================================================================== --> <!-- CAP Service --> <!-- ==================================================================== --> <bean name="CapStack" class="org.mobicents.protocols.ss7.cap.CAPStackImpl"> <constructor> <parameter> <inject bean="TcapStackCap" property="provider" /> </parameter> </constructor> </bean>
CAP uses passed TCAP stack. Feel free to delete declaration of this bean if your service is consuming only MAP messages.
<!-- ==================================================================== --> <!-- ISUP Service --> <!-- ==================================================================== --> <bean name="CircuitManager" class="org.mobicents.protocols.ss7.isup.impl.CircuitManagerImpl"> </bean> <bean name="IsupStack" class="org.mobicents.protocols.ss7.isup.impl.ISUPStackImpl"> <constructor> <parameter> <inject bean="SS7Scheduler" /> </parameter> <parameter>22234</parameter> <parameter>2</parameter> </constructor> <property name="mtp3UserPart"> <inject bean="Mtp3UserPart" /> </property> <property name="circuitManager"> <inject bean="CircuitManager" /> </property> </bean>
takes SS7Scheduler, local signaling pointcode and network indicator as constructor argument. MAP uses passed TCAP stack.
org.mobicents.protocols.ss7.isup.impl.ISUPStackImpl
28
mtp3UserPart specifies SS7 Level 3 to be used as transport medium( be it SS7 card or M3UA). circuitManager CIC management bean Feel free to delete declaration of this bean if your service is not consuming ISUP messages.
<!-- ==================================================================== --> <!-- Mobicents SS7 Service --> <!-- ==================================================================== --> <bean name="TCAPSS7Service" class="org.mobicents.ss7.SS7Service"> <constructor><parameter>TCAP</parameter></constructor>
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="org.mobicents.ss7:service=TCAPSS7Service",expose </annotation> <property name="jndiName">java:/mobicents/ss7/tcap</property> <property name="stack"> <inject bean="TcapStack" property="provider" /> </property> </bean> <bean name="MAPSS7Service" class="org.mobicents.ss7.SS7Service"> <constructor><parameter>MAP</parameter></constructor>
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="org.mobicents.ss7:service=MAPSS7Service",exposed </annotation> <property name="jndiName">java:/mobicents/ss7/map</property> <property name="stack"> <inject bean="MapStack" property="MAPProvider" /> </property> </bean> <bean name="CAPSS7Service" class="org.mobicents.ss7.SS7Service"> <constructor><parameter>CAP</parameter></constructor>
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="org.mobicents.ss7:service=CAPSS7Service",exposed </annotation> <property name="jndiName">java:/mobicents/ss7/cap</property> <property name="stack"> <inject bean="CapStack" property="CAPProvider" /> </property> </bean> <bean name="ISUPSS7Service" class="org.mobicents.ss7.SS7Service"> <constructor><parameter>ISUP</parameter></constructor>
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="org.mobicents.ss7:service=ISUPSS7Service",expose </annotation> <property name="jndiName">java:/mobicents/ss7/isup</property> <property name="stack"> <inject bean="IsupStack" property="isupProvider" />
29
</property> </bean>
TCAPSS7Service binds TcapStack to JNDI java:/mobicents/ss7/tcap. MAPSS7Service binds MapStack to JNDI java:/mobicents/ss7/map. CAPSS7Service binds CapStack to JNDI java:/mobicents/ss7/cap. ISUPSS7Service binds IsupStack to JNDI java:/mobicents/ss7/isup. The JNDI name can be configured to any valid JNDI name specific to your application. Feel free to delete service that your application is not using.
15:51:18,247 INFO [MainDeployer] [[[[[[[[[ Mobicents Signaling Gateway: release.version=2.0.0SNAPSHOT Started ]]]]]]]]]
2.
3.
30
3.
3.7.3. Stopping
The only option to stop the gateway is by pressing Ctrl c and bringing down the JVM or kill the process.
31
<parameter>SCTPManagement</parameter> </constructor> <property name="persistDir">${sgw.home.dir}/ss7</property> <property name="singleThread">true</property> <property name="connectDelay">30000</property> </bean> <bean name="SCTPShellExecutor" class="org.mobicents.protocols.ss7.m3ua.impl.oam.SCTPShellExecutor"> <property name="sctpManagement"> <inject bean="SCTPManagement" /> </property> </bean> <bean name="Mtp3UserPart" class="org.mobicents.protocols.ss7.m3ua.impl.M3UAManagement"> <constructor> <parameter>Mtp3UserPart</parameter> </constructor> <property name="persistDir">${sgw.home.dir}/ss7</property> <property name="transportManagement"> <inject bean="SCTPManagement" /> </property> </bean> <bean name="M3UAShellExecutor" class="org.mobicents.protocols.ss7.m3ua.impl.oam.M3UAShellExecutor"> <property name="m3uaManagement"> <inject bean="Mtp3UserPart" /> </property> </bean>
DialogicLinksetFactory
32
Its highly unlikely that you would require both the factories on same gateway. If you have dahdi based SS7 card installed, keep DahdiLinksetFactory and remove other. If you have dialogic based SS7 card installed, keep DialogicLinksetFactory and remove other.
LinksetFactoryFactory is just a call-back class listening for new factories deployed and
maintains Map of available factory name vs factory. You should never touch this bean.
<!-- ================================================ --> <!-- Linkset manager Service <!-- ================================================ --> <bean name="LinksetManager" class="org.mobicents.ss7.linkset.oam.LinksetManager"> <property name="linksetFactoryFactory"> <inject bean="LinksetFactoryFactory" /> </property> <property name="persistDir">${linkset.persist.dir}</property> </bean> <bean name="LinksetExecutor" class="org.mobicents.ss7.linkset.oam.LinksetExecutor"> <property name="linksetManager"> <inject bean="LinksetManager" /> </property> </bean>
-->
LinksetManager when started looks for file linksetmanager.xml containing serialized information about underlying linksets and links. The directory path is configurable by changing value of persistDir property.
Warning
linksetmanager.xml should never be edited by hand. Always use Shell Client to
executed on local resources to perform actions like creation and management of Linkset, management of M3UA stack.
33
<!-- ================================================ --> <!-- Shell Service --> <!-- ================================================ --> <bean name="ShellExecutor" class="org.mobicents.ss7.management.console.ShellServer"> <constructor> <parameter> <inject bean="Scheduler" /> </parameter> <parameter> <list class="javolution.util.FastList" elementClass="org.mobicents.ss7.management.console.ShellExecutor"> <inject bean="M3UAShellExecutor" /> <inject bean="SCTPShellExecutor" /> <inject bean="LinksetExecutor" /> </list> </parameter> </constructor> <property name="address">${sgw.bind.address}</property> <property name="port">3435</property> </bean>
By default ShellExecutor listens at sgw.bind.address and port 3436. You may set the address property to any valid IP address that your host is assigned. The shell commands are exchanged over TCP/IP.
<!-- ================================================ --> <!-- Mobicents Signaling Gateway <!-- ================================================ --> <bean name="SignalingGateway" class="org.mobicents.ss7.sgw.SignalingGateway"> <property name="shellExecutor"> <inject bean="ShellExecutor" /> </property> <property name="nodalInterworkingFunction"> <inject bean="NodalInterworkingFunction" /> </property> </bean>
-->
The NodalInterworkingFunction sits between the SS7 netwrok and IP network and routes messages to/from both the MTP3 and the M3UA layer, based on the SS7 DPC or DPC/SI address information
34
[usr]$ git clone http://code.google.com/p/jss7 [usr]$ cd jss7 [usr]$ git checkout release-2.0.0-SNAPSHOT
Browse the code online at http://code.google.com/p/jss7/source/browse/ 2. Building the source code Now that we have the source the next step is to build and install the source. Mobicents jSS7 Stack uses Maven 2 to build the system. There are three profiles. Default one builds only java source. The other two profiles available "dahdilinux" and "dialogiclinux" additionaly compile native modules.
Note
Native modules are supported only for linux OS for now.
35
Use "dahdilinux" profile if linux server on which this code is built already has dahdi module installed. Make sure you pass "include.zap" system property pointing to correct directory where dahdi is installed
Use "dialogiclinux" profile if linux server on which this code is built already has dialogic module installed. Make sure you pass "include.dialogic" and "include.dialogic.gctlib" system property pointing to correct directory where dialogic libraries are installed. include.dialogic.gctlib points to directory where gctload is present (generally /opt/dpklnx for linux OS)
-Dinclude.dialogic=/opt/dpklnx/INC
To build Mobicents jSS7 Stack without building any native libraries use
Note
If you are using Mobicents jSS7 Stack without any native dependencies, Mobicents jSS7 Stack can run on any OS.
36
37
4.1. Sangoma
To install Sangoma cards visit the Sangoma wiki at http://wiki.sangoma.com/
4.2. Diguim
To install Diguim cards visit the Diguim site at http://www.digium.com/en/products/digital/
4.3. Dialogic
To install Dialogic cards visit the Dialogic site at http://www.dialogic.com/
38
Mobicents jSS7 Stack in an interactive manner. It connects to different instances of Mobicents jSS7 Stack which manages Linksets, SCCP resource, routing and M3UA. Usually Shell will be invoked from a remote machine(remote to Linksets and application protocols).
[$] ./ss7-cli.sh
========================================================================= telscale SS7: release.version=2.0.0 This is free software, with components licensed under the GNU General Public License version 2 and other licenses. For further details visit http://telscale.org ========================================================================= telscale>
Usage: SS7 [OPTIONS] Valid Options -v Display version number and exit -h This help screen
39
Note
Host IP and port are optional, if not specified, shell will try to connect to
127.0.0.1:3435
5.1.3. Disconnect
Command to disconnect has following structure:
ss7 discconnect
40
history
connect
exit
telscale>connect 10.65.208.215 3435 telscale(10.65.208.215:3435)> [tab key press] sctp linkset m3ua sccp
history
disconnect
If you enter the first few characters of a command and press "tab", CLI will automatically fill in the rest of the command or display all possible commands if there is more than one command beginning with the characters entered by you.
In addition, help files are also available for every command using the --help option. The help files provide details of the command including possible parameters and examples of usage if applicable.
telscale(10.65.208.215:3435)>sctp --help Name sctp Manage M3UA - SCTP SYNOPSIS sctp server [create | destroy | start | stop | show] sctp association [create | destroy | show] parameters Command Line parameters. DESCRIPTION This command is used to manage M3UA - SCTP. You can create, destroy, start and stop a SCTP Server and view the Server configuration using the sctp server command. You can create, destroy and view SCTP Associations using the sctp association command. SEE ALSO sctp server create, sctp server destroy, sctp server start, sctp server stop, sctp server show, sctp association create, sctp association destroy, sctp association show telscale(10.65.208.215:3435)> [parameters]
[parameters]
The sections below describe the available Shell commands and provide examples of usage. To see examples of specific flow or to perform certain tasks, please refer to corresponding sections devoted to Linksets, SCCP or M3UA
41
or in case of dialogic:
linkset create dialogic opc <point-code> apc <point-code> ni <network-id> srcmod <src-mode> destmod <dest-mode> <linkset-name>
or in case of M3UA:
linkset create m3ua opc <point-code> apc <point-code> ni <network-id> as <as-name> <linkset-name>
Where: linkset-type refers to type of linkset to be created, ie. dahdi , dialogic or m3ua . Correct values depend on which linkset factories have been deployed.
42
point-code is simply MTP point - either local( opc ) or remote( dpc ) ni is simply network identifier. It can have following values: 0 International network 1 Spare (for international use only) 2 National network 3 Reserved for national use linkset-name simple string name, which identifies linkset as-name Name of AS that M3UALinkset wrapps. Make sure that AS is already created as explained in Section 5.5.2.1, Create AS
mobicents(10.65.208.215:3435)>linkset create dahdi opc 1 apc 2 ni 0 linkset1 LinkSet successfully added mobicents(10.65.208.215:3435)>linkset create dialogic opc 3 apc 4 ni 3 srcmod 1 destmod 2 linkset2 LinkSet successfully added
linkset delete
<linkset-name>
Where:
43
linkset activate
<linkset-name>
Where:
linkset deactivate
<linkset-name>
Where:
44
linkset link create span <span-num> code <code-num> channel <channel-num> <linkset-name> <linkname>
Where:
span-num integer number. It represents port number in card(indexed from 0). code-num link code(sls assigned to this link). channel-num integer number indicating time slot number(TDM time slot). linkset-name is name set during link creation. link-name name which identifies link in linkset.
Example 5.7.
mobicents(10.65.208.215:3435)>linkset link create span 1 code 1 channel 1 linkset1 link1 Link successfully added
45
Where:
linkset-name is name set during link creation link-name name which identifies link in linkset
Where:
linkset-name is name set during link creation link-name name which identifies link in linkset
46
Where:
linkset-name is name set during link creation link-name name which identifies link in linkset
linkset show
mobicents(10.65.208.215:3435)>linkset show linkset1 dahdi opc=1 apc=2 state=UNAVAILABLE link1 span=1 channelId=1 code=1
ni=0 state=UNAVAILABLE
UNAVAILABLE : Indicates the linkset does not have any available links and cannot transport traffic SHUTDOWN : Indicates the linkset has been shutdown in the configuration AVAILABLE : Indicates the linkset has at least one available link and can carry traffic
47
UNAVAILABLE : Indicates the link is not available to carry traffic. This can occur if the link is remotely or locally inhibited by a user. It can also be unavailable if MTP2 has not been able to successfully activate the link connection. SHUTDOWN : Indicates the link has been shutdown in the configuration. AVAILABLE : Indicates the link is active and able to transport traffic FAILED : A link is FAILED when the link is not shutdown but is unavailable at layer2 for some reason. For example Initial Alignment failed or the link test messages sent by MTP3 are not being acknowledged.
48
<id> A unique number to identify this sap <mtp3-id> A Mtp3UserPart index that is used as an index of mtp3UserPart property for SccpStack bean. Refer to Section 3.5.5, Configuring SCCP for details. For each Mtp3UserPart a sap must be configured. <opc> Specifies the local signaling point code. <ni> Specifies the network indicator that forms the part of service information octet (SIO) For each of sap one or more destinations should be configured. Refer to Section 5.4.1.5, Create destination for service access point for details.
49
Where: <id> id is optional. If passed only sap matching the id will be shown, else all the saps will be shown
50
sccp dest create <sap-id> <id> <first-dpc> <last-dpc> <first-sls> <last-sls> <sls-mask>
<sap-id> An identifier of the sap for which the destination is being created <id> A number to identify this destination. The number must be unique for each sap. <first-dpc> Specifies the first value of the remote signaling point codes range. <last-dpc> Specifies the last value of the remote signaling point codes range. If destination specifies a single signaling point code, this value must be equal first-dpc <first-sls> Specifies the first value of the SLS range. <last-sls> Specifies the last value of the SLS range. <sls-mask> Specifies the mask value. SLS af a message will be exposed by bitwise AND operation with this mask before comparing with first-sls and last-sls valuers. SLS value range is from 0 to 255. If the destination cover all possible SLS's use first-sls=0, lastsls=255, sls-mask=255
mobicents(10.65.208.215:3435)>sccp dest create 1 1 201 201 0 7 7 mobicents(10.65.208.215:3435)>sccp dest create 2 1 300 399 0 255 255
sccp dest modify <sap-id> <id> <first-dpc> <last-dpc> <first-sls> <last-sls> <sls-mask>
51
Where:
<sap-id> An identifier of the sap for which the destination has been created <id> is id set during destination creation
Where:
<sap-id> An identifier of the sap for which the destination has been created <id> id is optional. If passed only destination matching the id will be shown, else all destinations of the saps will be shown
sccp rule create sccp rule modify sccp rule delete sccp rule show
52
sccp rule create <id> <mask> <address-indicator> <point-code> <subsystem-number> <translationtype> <numbering-plan> <nature-of-address-indicator> <digits> <ruleType> <primary-address-id> <backup-address-id> <loadsharing-algorithm>
This command should be specified after primary_add and backup_add are configured. Please refer Section 5.4.3, Address Management on how to configure primary_add and backup_add
<id> A unique number to identify this rule <mask> mask defines which part of the originally dialed digits remains in the translated digits and which part is replaced by the digits from primary or backup address. mask is divided into sections by separator /. The number of sections in mask should be equal to sections in digits passed in this command and sections in primary or backup address
53
be found in the address field. The addressing information from original global title is then compared with passed address information to match the rule.
SCCP Address Indicator <point-code> Point code. This is ignored if bit 0 of address-indicator is not set. <subsystem-number> Subsystem Number. This is ignored if bit 1 of address-indicator is not set. <translation-type> Translation type. This is ignored if GT Indicator is 0000 or 0001
<numbering-plan> The Number Plan (NP) field specifies the numbering plan that the address information follows. This is ignored if GT Indicator is 0000, 0001 or 0010
54
<nature-of-address-indicator> The Nature of Address Indicator (NAI) field defines the address range for a specific numbering plan. This is only used if GT Indicator is 0100 <digits> Specifies the string of digits divided into subsections using separator '/' depending on if mask contains separator. The dialed digits should match with theses digits as per rule specified bellow
55
<backup-address-id> Identifies the SCCP Address used as the backup translation in case if pointcode specified by primary address is not available. Backup address is used only dominant and loadshared address types <loadsharing-algorithm> This parameter is mandatory if <ruleType> parameter is "loadshared". Loadsharing algorithm is configired here. Possible values of the parameter:
mobicents(10.65.208.215:3435)>sccp rule create 1 R 71 2 8 0 0 3 123456789 solitary 1 mobicents(10.65.208.215:3435)>sccp rule create 2 R 71 2 8 0 0 3 123456789 dominant 1 1 mobicents(10.65.208.215:3435)>sccp rule create 2 R 71 2 8 0 0 3 123456789 loadshared 1 1 bit4
56
sccp rule modify <id> <mask> <address-indicator> <point-code> <subsystem-number> <translationtype> <numbering-plan> <nature-of-address-indicator> <digits> <ruleType> <primary-address-id> <backup-address-id>
<id>
Where:
Where:
<id> id is optional. If passed only rule matching the id will be shown, else all the rules will be shown
57
mask provided in the sccp rule create command.The syntax remains same except for primary address sccp primary_add is used and for backup address sccp backup_add is used
sccp primary_add create sccp backup_add create sccp primary_add modify sccp backup_add modify sccp primary_add delete sccp backup_add delete sccp primary_add show sccp backup_add show
sccp primary_add create <id> <address-indicator> <point-code> <subsystem-number> <translationtype> <numbering-plan> <nature-of-address-indicator> <digits>
sccp backup_add create <id> <address-indicator> <point-code> <subsystem-number> <translationtype> <numbering-plan> <nature-of-address-indicator> <digits>
<id> A unique number to identify this address <address-indicator> The address indicator is the first field in SCCP Party Address(called/calling) and is one octet in length. Its function is to indicate which information elements are present so that the address can be interpreted, in other words, it indicates the type of addressing information that is to
58
be found in the address field. The addressing information from original global title is then compared with passed address information to match the rule.
SCCP Address Indicator <point-code> Point code. This is ignored if bit 0 of address-indicator is not set. <subsystem-number> Subsystem Number. This is ignored if bit 1 of address-indicator is not set. <translation-type> Translation type. This is ignored if GT Indicator is 0000 or 0001
<numbering-plan> The Number Plan (NP) field specifies the numbering plan that the address information follows. This is ignored if GT Indicator is 0000, 0001 or 0010
59
<nature-of-address-indicator> The Nature of Address Indicator (NAI) field defines the address range for a specific numbering plan. This is only used if GT Indicator is 0100 <digits> The global title address information to translate to, specified as string of digits divided into subsections using separator '/' depending on if mask contains separator. In addition the digits string can contain
60
<nature-of-address-indicator> <digits>
sccp backup_add modify <id> <address-indicator> <point-code> <subsystem-number> <translationtype> <numbering-plan> <nature-of-address-indicator> <digits>
Where:
61
Where:
<id> id is optional. If passed only address matching the id will be shown, else all the addresses will be shown
sccp rsp create sccp rsp modify sccp rsp delete sccp rsp show
62
<remote-spc> The remote signaling point <rspc-flag> 32 bit value. Not used for now. Reserved for future <mask> 32 bit value. Not used for now. Reserved for future
63
Where: <id> id is optional. If passed only remote signaling point matching the id will be shown, else all the addresses will be shown
<id> A unique number to identify this remote subsystem <remote-spc> The remote signaling point where this remote susbsytem is deployed <remote-ssn> The remote subsystem number <rss-flag> 32 bit value. Not used for now. Reserved for future <mark-prohibited-when-spc-resuming> This parameter is optional, its possible value is: prohibitedWhenSpcResuming. When this parameter is present configured subsystem is marked as prohibited when its corresponded signaling point code has been resumed.
64
Where: <id> id is optional. If passed only remote subsystem matching the id will be shown, else all will be shown
65
<id> A unique number to identify this Long message rule <first-spc> Specifies the first value of the remote signaling point codes range. (for which Long message rule will apply) <last-spc> Specifies the last value of the remote signaling point codes range. If Long message rule specifies a single signaling point code, this value must be equal first-spc. <long-message-rule-type> Specifies which message types will be used for the remote signaling point codes range. Possible values are: udt, xudt and ludt.
mobicents(10.65.208.215:3435)>sccp lmr create 1 201 201 xudt mobicents(10.65.208.215:3435)>sccp lmr create 2 230 239 udt
66
Where: <id> id is optional. If passed only Long message rule matching the id will be shown, else all the rules will be shown
67
<id> A unique number to identify this Concerned signaling point code <spc> Specifies the value of the remote signaling point code, which will be noticed.
68
Where: <id> id is optional. If passed only Concerned signaling point code matching the id will be shown, else all the codes will be shown
zMarginXudtMessage the XUDT message data length greater this 160 If value, segmentation is processed. Otherwise no 255 segmentation.
reassemblyTimerDelay SCCP segmented message reassembling timeout 10000 - 15000 (in milliseconds). 20000 maxDataMessage removeSpc Max available SCCP message data for all message 2560 types. 3952 - 2560
Remove PC from calledPartyAddress when sending true or true to MTP3. After Global Title Translation, if the SCCP false address includes the destination point code (DPC) however Address Indicator (AI) indicates route on Global Title and removeSpc is set to true, DPC will be removed from SCCP Address. The same rule applies for both calling as well as called party SCCP Address.
sstTimerDuration_Min (starting) SST sending interval (in milliseconds). 5000 - 10000 Min 10000 sstTimerDuration_Max Max (after increasing) SST sending interval (in 600000 - 600000 milliseconds). 1200000
69
Mnemonic name
Function
Value range
sstTimerDuration_IncreaseFactor of SST sending interval (next 1 - 4 Multiplicator interval will be greater the current by sstTimerDuration_IncreaseFactor). This value has type "double".
<parameter-name> A mnemonic name of a parameter. This parameter is optional. If a mnemonic name is absent all parameter values will be returned.
70
sctp server create sctp server destroy sctp server start sctp server stop sctp server show sctp association create sctp association destroy sctp association show
Where:
server-name Unique name assigned to the server. host-ip The host ip address where underlying SCTP server socket will bind. For SCTP multi-home support, you can pass comma separated ip addresses that this server socket will bind to. If the primary ip address becomes unavailable, it will automatically fall back to secondary address. For socket-type TCP, comma separated values will be ignored and only first value (primary address) will be used host-port The host port where underlying SCTP server socket will bind
71
socket-type This is optional. If not passed default is SCTP else specify as TCP.
mobicents(127.0.0.1:3436)>sctp server create TestServerTCP 10.2.50.145 2906 TCP Successfully added Server=TestServerTCP
Where:
server-name Unique name of the server to be destroyed. Make sure server is stopped before destroying.
72
Where:
server-name Unique name of the server to be started. The underlying SCTP server socket is bound to ip:port configured at creation time.
Where:
server-name Unique name of the server to be stopped. The underlying socket is closed at this point and all resource are released.
73
mobicents(local)>sctp server show SERVER TCP name=TestServerTCP started=false hostIp=10.2.50.145 hostPort=2906 Associations: SERVER SCTP name=TestServer started=false hostIp=10.2.50.145 hostPort=2905 secondaryHost=10.2.50.146 Associations:
sctp association create <assoc-name> <CLIENT | SERVER> <server-name> <peer-ip> <peer-port> <hostip> <host-port> <socket-type>
Where: assoc-name Unique name of the association CLIENT | SERVER If this association is client side or server side. If its client side, it will initiate the connection to peer and bind's to host-ip:host-port trying to connect to peer-ip:peer-port. For SCTP multihome support, you can pass comma separated ip addresses that this association will bind to. If the primary ip address becomes unavailable, it will automatically fall back to secondary address. For socket-type TCP, comma separated values will be ignored and only first value (primary address) will be used If its server side, it waits for peer to initiate connection. The connection request will be accepted from peer-ip:peer-port. host-ip and host-port is not required, even if passed it will be ignored server-name If this association is server side, server-name must be passed to associate with server. Server with server-name should have already been created by using command Section 5.5.1.1, Create SCTP Server If this association is client side, server-name shouldn't be passed.
74
socket-type This is optional. If not passed default is SCTP else specify as TCP. If association is of SERVER type, the socket-type should match with one specified while creating server.
mobicents(local)>sctp association create Assoc1 CLIENT 192.168.56.101 2905 192.168.56.1,192.168.56.1 2905 Successfully added client Associtaion=Assoc1
mobicents(192.168.56.1:3436)>sctp association create Assoc2 SERVER TestServer 192.168.56.1 2905 Successfully added server Association=TestServer
75
mobicents(local)>sctp association show ASSOCIATION SCTP name=Assoc1 started=false peerIp=192.168.56.101 peerPort=2905 hostIp=192.168.56.1 hostPort2905 type=CLIENT secondaryHost=192.168.56.1 ASSOCIATION SCTP name=Assoc2 started=false peerIp=192.168.56.1 peerPort=2905 server=TestServer type=SERVER
5.5.2.1. Create AS
Application Server (AS) can be created by issuing command with following structure:
m3ua as create <as-name> <AS | SGW | IPSP> mode <SE | DE> ipspType <client | server> rc <routingcontext> traffic-mode <traffic mode> min-asp <minimum asp active for TrafficModeType.Loadshare> network-appearance <network appearance>
76
Where: as-name simple string name, which identifies AS. Make sure this is unique. This is mandatory parameter AS | SGW | IPSP Specify if this is of type AS or SGW or IPSP. This is mandatory parameter SE | DE Specify if the single or double exchange of ASP State Maintenance (ASPSM) and ASP Traffic Maintenance (ASPTM) messages should be performed. This is mandatory parameter. client | server If As if of type IPSP, speicfy here if its client or server type. routing-context refers to Routing Context already configured on M3UA stack on SGW side. This is optional parameter. If no Routing Context is passed, Application Server Process (assigned to this AS) may not be configured to process signaling traffic related to more than one Application Server, over a single SCTP Association Also if ASP is configured to process siganlling traffic from always one AS, irrespective of received messages have routing context set or not, it will always be delieverd to AS for further processing. However if ASP is configured to process siganlling traffic related to more than one AS over a single SCTP Association and signaling message is received without RC, it drops the message and sends back Error message. Respective log4j error is also logged. traffic-mode Traffic mode for ASP's. By default its loadshare. Mobicents M3UA only supports loadshare and override, broadcast is not supported. min-asp minumum asp active for traffic mode 'loadshare' before the payload starts flowing. This is an optional parameter and if not specified the default value is 1. Also if traffic-mode is not 'loadshare' setting this value has no effect network-appearance The Network Appearance is a M3UA local reference shared by SG and AS (typically an integer) that, together with an Signaling Point Code, uniquely identifies an SS7 node by indicating the specific SS7 network to which it belongs. It can be used to distinguish between signaling traffic associated with different networks being sent between the SG and the ASP over a common SCTP association. This is optional.
77
mobicents(127.0.0.1:3435)>m3ua as create AS2 AS mode SE rc 100 traffic-mode loadshare network-appearance 12 Successfully created AS name=AS2
5.5.2.2. Destroy AS
Application Server (AS) can be destroyed by issuing command with following structure:
Where:
as-name Simple string name, which identifies AS. Make sure AS is in state INACTIVE and all the ASP's are unassigned before destroying
5.5.2.3. Show AS
Application Server configured can viewed by issuing command with following structure:
m3ua as show
mobicents(local)>m3ua as show AS name=AS2 functionality=AS mode=SE rc=[100] trMode=2 defaultTrMode=2 na=12 peerFSMState=DOWN
78
Assigned to :
AS name=AS1 functionality=IPSP mode=DE ipspType=SERVER rc=[1] trMode=2 defaultTrMode=2 localFSMState=DOWN peerFSMState=DOWN Assigned to :
Where:
asp-name Name of this ASP. It should be unique sctp-association name of SCTP Association aspid Identifier for this newly created Application Server Process. If this is not passed, next available aspid will be used.
Where:
asp-name Name of this ASP to be destroyed. Make sure ASP is stopped before destroying
79
Where: asp name name of ASP created earlier. Make sure ASP you are trying to start is assigned to at least one AS
80
Where:
Where:
as name name of AS created earlier asp name name of ASP created earlier
Note
Mobicents M3UA supports configuring ASP to process signaling traffic related to more than one Application Server, over a single SCTP Association. However you need to make sure that all the AS's that ASP is shared with has Routing Context (unique) configured.
81
Where:
mobicents(127.0.0.1:3435)>m3ua as remove AS1 ASP1 Successfully removed ASP name=ASP1 from AS name=AS1
Where:
as name name of AS created earlier dpc Destination point code opc Originating point code si Service Indicator
82
Where: as name name of AS assigned to route message for this dpc dpc Destination point code opc Originating point code si Service Indicator
83
84
Chapter 6. ISUP
ISUP( ISDN User Part or ISUP ) is part of SS7 which is used to establish telephone calls and manage call switches( exchanges). Exchanges are connected via E1 or T1 trunks. Each trunk is divided by means of TDM into time slots. Each time slot is distinguished as circuit. Circuits (identified by code) are used as medium to transmit voice data between user equipment (or exchanges if more than one is involved). ISUP allows not only to setup a call, but to exchange information about exchange state and its resources(circuits).
Note
Mobicents ISUP is based on ITU-T Q.76X series of documents.
85
ISUP
Name t12
Description Sets T12 value. Started when BLO is sent. See A.1/Q.764 Sets T13 value. Started when initial BLO is sent. See A.1/ Q.764
t13
5min
5min - 15min
t14
5s
15s - 60s
Sets T14 value. Started when UBL is sent. See A.1/Q.764 Sets T15 value. Started when initial UBL is sent. See A.1/ Q.764
t15
5min
5min - 15min
t16
5s
15s - 60s
Sets T16 value. Started when RSC is sent. See A.1/Q.764 Sets T17 value. Started when initial RSC is sent. See A.1/ Q.764
t17
5min
5min - 15min
t18
5s
15s - 60s
Sets T18 value. Started when CGB is sent. See A.1/Q.764 Sets T19 value.
t19
5min
5min - 15min
Started when initial CGB is sent. See A.1/ Q.764 t20 5s 15s - 60s Sets T20 value. Started when CGU is sent. See A.1/Q.764 t21 5min 5min - 15min Sets T21 value. Started when initial CGU is sent. See A.1/ Q.764 t22 5s 15s - 60s Sets T22 value. Started when GRS is sent. See A.1/Q.764 t23 5min 5min - 15min Sets T23 value. Started when initial
86
ISUP
Name
Default value
Value range
t28
10s
10s
Sets T28 value. Started when CQM is sent. See A.1/Q.764 Sets T33 value. Started when INR is sent. See A.1/Q.764
t33
12s
12s - 15s
Note that before start user must provide two interfaces to stack: Mtp3UserPart implementation of transport layer which should be used by stack CircuitManager circuit manager implementation. This interface stores information on mapping between
CIC(Circuit Identification Code) and DPC(Destination Point Code) used as destination for
outgoing messages.
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.mobicents.protocols.ss7.isup.ISUPEvent; import org.mobicents.protocols.ss7.isup.ISUPListener; import org.mobicents.protocols.ss7.isup.ISUPProvider; import org.mobicents.protocols.ss7.isup.ISUPStack; import org.mobicents.protocols.ss7.isup.ISUPTimeoutEvent; import org.mobicents.protocols.ss7.isup.ParameterException; import org.mobicents.protocols.ss7.isup.impl.ISUPStackImpl; import org.mobicents.protocols.ss7.isup.message.ISUPMessage;
87
ISUP
import org.mobicents.ss7.linkset.oam.Layer4; import org.mobicents.ss7.linkset.oam.Linkset; public class ISUPTest implements ISUPListener { protected ISUPStack stack; protected ISUPProvider provider; protected Linkset isupLinkSet;
public void setUp() throws Exception { this.isupLinkSet = ....; //same linksets as in SS7Service this.stack = new ISUPStackImpl(); this.stack.configure(getSpecificConfig()); this.provider = this.stack.getIsupProvider(); this.provider.addListener(this); Mtp3UserPart userPart = // create with proper factory, dahdii, dialogi, m3ua this.stack.setMtp3UserPart(userPart); CircuitManagerImpl circuitManager = new CircuitManagerImpl(); circuitManager.addCircuit(1, 431613); // CIC - 1, DPC for it - 431613
this.stack.setCircuitManager(circuitManager); this.stack.start(); }
public void onEvent(ISUPEvent event) { ISUPMessage msg = event.getMessage(); switch(msg.getCircuitIdentificationCode().getCIC()) { case AddressCompleteMessage._COMMAND_CODE: //only complete break; case ConnectedMessage._COMMAND_CODE: case AnswerMessage._COMMAND_CODE: //we are good to go ConnectedNumber cn = (ConnectedNumber)msg.getParameter(ConnectedNumber._PARAMETER_CODE); //do something break; case ReleaseMessage._COMMAND_CODE: //remote end does not want to talk RealeaseCompleteMessage rlc = provider.getMessageFactory().createRLC(); rlc.setCircuitIdentificationCode(msg.getCircuitIdentificationCode()); rlc.setCauseIndicators( ((ReleaseComplete)msg).getCauseIndicators()); provider.sendMessage(rlc); } } public void onTimeout(ISUPTimeoutEvent event) { switch(event.getTimerId()) {
88
ISUP
case ISUPTimeoutEvent.T1: //do something break; case ISUPTimeoutEvent.T7: //do even more break; } } }
89
Chapter 7. SCCP
The Signaling Connection Control Part (SCCP) is defined in ITU-T Recommendations Q.711Q.716. SCCP sits on top of Message Transfer Part 3 (MTP3) in the SS7 protocol stack. The SCCP provides additional network layer functions to provide transfer of noncircuit-related (NCR) signaling information, application management procedures and alternative, more flexible methods of routing.
Matching rule As explained in sccp rule create Section 5.4.2.1, Create Rule command the <digits> can be divided into sections using the "/" separate character. Each section defines set of digits to be matched. Wild card * can be used to match any digits and ? can be used to match exatcly one digit For example Rule is to match starting 4 digits (should be 1234) and doesn't care for rest; the <digits> in the command will be 1234/*. If the Rule is such that starting 3 digits should be 123, doesn't care for other three digits but last two digits should be 78; the <digits> in the command will be 123/???/78. If digit to digit matching is needed the the <digits> in the command will be exact digits to be matched without sections. Translation For translation each section in <mask> defined in sccp rule create command defines how replacement operation is performed. If <mask> defines K, the originally dialed digits are kept and if <mask> defines R the digits from primary address or back address are used. The primary/backup address should always define the point code and the translated address will
90
SCCP
always have this point code. If the primary/backup address defines the subsystem number the translated address will also have this subsystem number. The address-indicator of translated address is always from primary/backup address. See bellow examples Example 1 : Remove the Global Title and add PC and SSN
GTT - Example 1 Example 2 : Partial match Match a eight digit number starting "800", followed by any four digits, then "9". If the translated digits is not null and if the primary/backup address has no Global Title, the Global Title from dialed address is kept with new translated digits.
91
SCCP
GTT - Example 2 Example 3 : Partial match Match "800800", followed by any digits Remove the first six digits. Keep any following digits in the Input. Add a PC(123) and SSN (8).
GTT - Example 3
92
SCCP
Example 4 : Partial match Match any digits keep the digits in the and add a PC(123) and SSN (8). If the translated digits is not null and if the primary/backup address has no Global Title, the Global Title from dialed address is kept with new translated digits.
GTT - Example 4
Note
The term SCCP User Part refers to the applications that use SCCP's services.
The SCCP User Part gets handle to SccpStack by doing JNDI look-up as explained in ???
SccpStack exposes org.mobicents.protocols.ss7.sccp.SccpProvider that interacts directly
with SccpStack. This interface defines the methods that will be used by SCCP User Part to send org.mobicents.protocols.ss7.sccp.message.SccpMessage and register org.mobicents.protocols.ss7.sccp.SccpListener's to listen for incoming SCCP messages. SCCP User Part registers SccpListener for specific local subsystem number. For every incoming SccpMessage, if the called subsystem matches with this local subsystem, the corresponding SccpListner is called.
93
SCCP
SccpProvider also exposes org.mobicents.protocols.ss7.sccp.message.MessageFactory and org.mobicents.protocols.ss7.sccp.parameter.ParameterFactory to create new connectionless service org.mobicents.protocols.ss7.sccp.message.SccpDataMessage is used. (This class use UDT, XUDT, LUDT SCCP message type for message transfer.) SccpMessage. For transfer data via
public class Test implements SccpListener { private SccpProvider sccpProvider; private SccpAddress localAddress; private int localSsn = 8; private static SccpProvider getSccpProvider() { Mtp3UserPartImpl mtp3UserPart1 = null; ...... ...... SccpStackImpl sccpStack1 = new SccpStackImpl("testSccpStack"); sccpStack1.setMtp3UserPart(1, mtp3UserPart1); sccpStack1.start(); return sccpStack1.getSccpProvider(); } public void start() throws Exception { this.sccpProvider = getSccpProvider(); int translationType = 0; GlobalTitle gt = GlobalTitle.getInstance(translationType, NumberingPlan.ISDN_MOBILE, NatureOfAddress.NATIONAL, "1234"); localAddress = new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, -1, gt, 0); this.sccpProvider.registerSccpListener(this.localSsn, this); } public void stop() { this.sccpProvider.deregisterSccpListener(this.localSsn); } public void onMessage(SccpDataMessage message) { localAddress = message.getCalledPartyAddress(); SccpAddress remoteAddress = message.getCallingPartyAddress();
94
SCCP
// now decode content byte[] data = message.getData(); // processing a request byte[] answerData = new byte[10]; // put custom executing code here and fill answerData HopCounter hc = this.sccpProvider.getParameterFactory().createHopCounter(5); SccpDataMessage sccpAnswer = this.sccpProvider.getMessageFactory().createDataMessageClass1(remoteAddress, message.getSls(), localSsn, false, hc, null); try { this.sccpProvider.send(sccpAnswer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void onNotice(SccpNoticeMessage message) { } public void onCoordRequest(int dpc, int ssn, int multiplicityIndicator) { } public void onCoordResponse(int dpc, int ssn, int multiplicityIndicator) { } public void onState(int dpc, int ssn, boolean inService, int multiplicityIndicator) { }
95
Chapter 8. TCAP
The Transaction Capabilities Application Part (TCAP) is defined in ITU-T Recommendations Q.771-Q.775. TCAP allows services at network nodes to communicate with each other using an agreed-upon set of data elements. Its primary purpose is to facilitate multiple concurrent dialogs between the same sub-systems on the same machines, using Transaction IDs to differentiate these, similar to the way TCP ports facilitate multiplexing connections between the same IP addresses on the Internet.
96
TCAP
The org.mobicents.protocols.ss7.tcap.TCAPStackImpl is concrete implementation of TCAPStack. The TCAP User Part creates instance of TCAPStackImpl passing the reference of
SccpProvider and new instance of SccpAddress representing address to which bind listener.
The TCAP stack creates internaly Mobicents MAP Stack implementation. Passed SccpAddress is used to match against incoming messages destination address.
SccpProvider sccpProvider = getSccpProvider(); //JNDI lookup of SCCP Stack and get Provider SccpAddress localAddress createLocalAddress(); TCAPStack tcapStack = new TCAPStackImpl(sccpPprovider, localAddress);
The reference to SccpProvider is received from SccpStack. To get handle to SccpStack do the JNDI look-up passing the JNDI name configured in SS7 service as explained in ??? The TCAP User Part should register the concrete implementation of TCListener with TCAPProvider to listen for incoming TCAP messages.
public class Client implements TCListener{ ..... tcapProvider = tcapStack.getProvider(); tcapProvider.addTCListener(this); .... }
The TCAP User Part leverages TCAPProvider to create new Dialog. The component's between the nodes are exchanged within this Dialog
97
TCAP
The TCAP User Part leverages ComponentPrimitiveFactory to create new components. These components are sent usig the dialog
//create some INVOKE Invoke invoke = cpFactory.createTCInvokeRequest(); invoke.setInvokeId(this.clientDialog.getNewInvokeId()); OperationCode oc = cpFactory.createOperationCode(); oc.setLocalOperationCode(12L); invoke.setOperationCode(oc); //no parameter this.clientDialog.sendComponent(invoke);
public class Client implements TCListener{ //encoded Application Context Name public static final long[] _ACN_ = new long[] { 0, 4, 0, 0, 1, 0, 19, 2 }; private TCAPStack stack; private SccpAddress thisAddress; private SccpAddress remoteAddress; private TCAPProvider tcapProvider; private Dialog clientDialog; Client(SccpProvider sccpPprovider, SccpAddress thisAddress,SccpAddress remoteAddress) { super(); this.stack = new TCAPStackImpl(sccpPprovider,thisAddress); //pass address, so stack can register in SCCP this.runningTestCase = runningTestCase; this.thisAddress = thisAddress; this.remoteAddress = remoteAddress; this.tcapProvider = this.stack.getProvider(); this.tcapProvider.addTCListener(this); } private static SccpProvider getSccpProvider() throws NamingException { ...... ...... } public void start() throws TCAPException, TCAPSendException { clientDialog = this.tcapProvider.getNewDialog(thisAddress, remoteAddress); ComponentPrimitiveFactory cpFactory = this.tcapProvider.getComponentPrimitiveFactory();
98
TCAP
//create some INVOKE Invoke invoke = cpFactory.createTCInvokeRequest(); invoke.setInvokeId(this.clientDialog.getNewInvokeId()); OperationCode oc = cpFactory.createOperationCode(); oc.setLocalOperationCode(12L); invoke.setOperationCode(oc); //no parameter this.clientDialog.sendComponent(invoke); ApplicationContextName acn = this.tcapProvider.getDialogPrimitiveFactory() .createApplicationContextName(_ACN_); //UI is optional! TCBeginRequest tcbr = this.tcapProvider.getDialogPrimitiveFactory().createBegin(this.clientDialog); tcbr.setApplicationContextName(acn); this.clientDialog.send(tcbr); } public void onDialogReleased(Dialog d) { d.keepAlive(); }
} public void onTCContinue(TCContinueIndication ind) { //send end TCEndRequest end = this.tcapProvider.getDialogPrimitiveFactory().createEnd(ind.getDialog()); end.setTermination(TerminationType.Basic); try { ind.getDialog().send(end); } catch (TCAPSendException e) { throw new RuntimeException(e); } } public void onTCEnd(TCEndIndication ind) { //should not happen, in this scenario, we send data. } public void onTCUni(TCUniIndication ind) { //not going to happen }
99
TCAP
public void onTCPAbort(TCPAbortIndication ind) { // TODO Auto-generated method stub } public void onTCUserAbort(TCUserAbortIndication ind) { // TODO Auto-generated method stub }
public static void main(String[] args) { SccpAddress localAddress = new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, 1, null, 8);
100
Chapter 9. MAP
Mobile application part (MAP) is the protocol that is used to allow the GSM network nodes within the Network Switching Subsystem (NSS ) to communicate with each other to provide services, such as roaming capability, text messaging (SMS), Unstructured Supplementary Service Data ( USSD) and subscriber authentication. MAP provides an application layer on which to build the services that support a GSM network. This application layer provides a standardized set of services. MAP uses the services of the SS7 network, specifically the Signaling Connection Control Part (SCCP ) and the Transaction Capabilities Application Part (TCAP)
Important
For better understanding of this chapter you must be familiar with the specifications defined in GSM 09.02.
MAP has full implementation for USSD, SMS and Location Management Service (LMS) Services and partial implementation for Mobility service (updateLocation, sendAuthenticationInfo, anyTimeInterrogation, checkIMEI operations) only. You can find the list of implemented MAP messages here: MAPMessagesImplemented.ods [http://code.google.com/p/jss7/source/browse/ map/MAPMessagesImplemented.ods]. The document uses color coding to represent the status of the implementation:
Green Fully Implemented Red Interface available (but not yet implemented) Yellow Implementation in progress
Note
Mobicents jSS7 Stack Any contribution to implement other messages are welcome. We will provide you with all the help that you may require initially.
101
MAP
User application. MAP user application must implement interfaces to listen MAP messages and dialogue and component handling primitives. One interface is (listening associated with dialog events). Others are one or more interfaces for listening associated with component events based on org.mobicents.protocols.ss7.map.api.MAPServiceListener interface. Each MAP-User interested in listening messages specific to MAP Service implements specific MAPServiceListener.
org.mobicents.protocols.ss7.map.api.MAPDialogListener
Each MAP-User interested in listening messages specific to MAP Service implements specific MAPServiceListener.
MAP-User
interested
only
in
call
handling
operations
implements
org.mobicents.protocols.ss7.map.api.service.callhandling.MAPServiceCallHandlingListener
MAP-User
interested
only
in
LMS
operations
implements
org.mobicents.protocols.ss7.map.api.service.lsm.MAPServiceLsmListener
MAP-User
interested
only
in
mobility
operations
implements
org.mobicents.protocols.ss7.map.api.service.mobility.MAPServiceMobilityListener
MAP-User
interested
only
in
OAM
operations
implements
org.mobicents.protocols.ss7.map.api.service.oam.MAPServiceOamListener
MAP-User
interested
only
in
PDP
context
activation
operations
implements
org.mobicents.protocols.ss7.map.api.service.pdpContextActivation.MAPServicePdpContextActivati
MAP-User
interested
only
in
SMS
operations
implements
org.mobicents.protocols.ss7.map.api.service.sms.MAPServiceSmsListener
MAP-User
interested
only
in
supplementary
operations
implements
org.mobicents.protocols.ss7.map.api.service.supplementary.MAPServiceSupplementaryListener
MAP-User interested in all the services must implement all the service listener class. The org.mobicents.protocols.ss7.map.MAPStackImpl is concrete implementation of MAPStack. The MAP User application creates an instance of MAPStackImpl passing the reference of SccpProvider and Sub System Number and then start it. All incoming messages are checked for destination SSN, if it matches with the one registered with this MAPStackImpl the corresponding listener is called else the peer receives error.
SccpProvider sccpProvider = getSccpProvider(); MAPStackImpl mapStack = new MAPStackImpl(sccpProvider, 8); mapStack.start(); ...
The reference to SccpProvider is received from SccpStack. To get handle to SccpStack do the JNDI look-up passing the JNDI name configured in SS7 service as explained in ???.
102
MAP
The MAP User application should register the concrete implementation of MAPDialogListener with MAPProvider to listen for incoming MAP Dialog and MAP Primitive messages. The MAP User application should register the concrete implementation of MAPServiceListener with corresponding MAPServiceBase to listen for incoming MAP Service messages. Following MAPServiceBase are exposed by MAPProvider.
For
call
handling
service
org.mobicents.protocols.ss7.map.api.service.callhandling.MAPServiceCallHandling
org.mobicents.protocols.ss7.map.api.service.mobility.MAPServiceMobility
org.mobicents.protocols.ss7.map.api.service.pdpContextActivation.MAPServicePdpContextActivati
org.mobicents.protocols.ss7.map.api.service.supplementary.MAPServiceSupplementary
public class MAPExample implements MAPDialogListener, MAPServiceSupplementaryListener { .... mapProvider = mapStack.getMAPProvider(); mapProvider.addMAPDialogListener(this); mapProvider.getMAPServiceSupplementary().addMAPServiceListener(this); .... }
Before any MAP specific service can be used, the corresponding service should be activated.
MAPParameterFactory to create instances of USSDString, ISDNAddressString and many other primitives that are used by MAP services.
103
MAP
MAPSmsTpduParameterFactory to create instances of SMS TPDU primitives used for sending SMS messages like SmsDeliverTpdu or SmsSubmitTpdu. MAPErrorMessageFactory to create instances of MAP error messages like
MAPErrorMessageSystemFailure.
MapParameterFactory paramFact = mapProvider.getMapServiceFactory(); USSDString ussdString = paramFact.createUSSDString("*125*+31628839999#", null); ISDNAddressString msisdn = paramFact.createISDNAddressString( AddressNature.international_number, NumberingPlan.ISDN, "31628838002");
// First create Dialog SccpAddress origAddress = createLocalAddress(); ISDNAddressString origReference = client.getMAPProvider().getMAPParameterFactory(). createISDNAddressString(AddressNature.international_number, NumberingPlan.land_mobile, "31628968300"); SccpAddress destAddress = createRemoteAddress(); ISDNAddressString destReference = client.getMAPProvider().getMAPParameterFactory(). createISDNAddressString(AddressNature.international_number, NumberingPlan.land_mobile, "204208300008002"); currentMapDialog = mapProvider.getMAPServiceSupplementary(). createNewDialog(MAPApplicationContext.getInstance(MAPApplicationContextName.networkUnstructuredSsContext, MAPApplicationContextVersion.version2), origAddress, destReference, remoteAddress, destReference);
// The dataCodingScheme is still byte, as I am not exactly getting how // to encode/decode this. byte ussdDataCodingScheme = 0x0f; // The Charset is null, here we let system use default Charset (UTF-7 as // explained in GSM 03.38. However if MAP User wants, it can set its own // impl of Charset USSDString ussdString = paramFact.createUSSDString(ussdMessage, null); ISDNAddressString msisdn = client.getMAPProvider().getMAPParameterFactory(). createISDNAddressString(AddressNature.international_number, NumberingPlan.ISDN, "31628838002"); currentMapDialog.addProcessUnstructuredSSRequest(ussdDataCodingScheme, ussdString, alertingPattern, msisdn);
104
MAP
currentMapDialog.send();
- Wait for a response from the server At the server side when receiving TC-Begin message the following sequence of events occurs:
void MAPDialogListener. onDialogRequest(MAPDialog mapDialog, AddressString destReference, AddressString origReference, MAPExtensionContainer extensionContainer);
This is the request for MAP Dialog processing. A MAP user can reject the Dialog by invoking mapDialog.refuse() method. Then the incoming primitives corresponded events (one or more) occur. In this case it is
When processing component-depended messages you can add response components. In this case it is processUnstructuredSS-Response as an example:
USSDString ussdString = ind.getUSSDString(); String request = ussdString.getString(); // processing USSD request String response = "Your balans is 100$"; // The dataCodingScheme is still byte, as I am not exactly getting how // to encode/decode this. byte ussdDataCodingScheme = 0x0f; USSDString ussdResponse = paramFact.createUSSDString(response, null); try { mapDialog.addProcessUnstructuredSSResponse(ind.getInvokeId(), ussdDataCodingScheme, ussdResponse); } catch (MAPException e) { // TODO Auto-generated catch block e.printStackTrace(); }
If the preparing the response spends much time we should return the control and prepare the answer in your thread. If error or reject primitives are included into a TCAP message following events occur:
105
MAP
public void onErrorComponent(MAPDialog mapDialog, Long invokeId, MAPErrorMessage mapErrorMessage); public void onProviderErrorComponent(MAPDialog mapDialog, Long invokeId, MAPProviderError providerError); public void onRejectComponent(MAPDialog mapDialog, Long invokeId, Problem problem);
After all incoming components have been processing onDialogDelimiter(MAPDialog mapDialog); event is invoking (or onDialogClose(MAPDialog mapDialog) in TC-END case). If all response components have been prepared we can tell the stack to send response: mapDialog.close(false); - to send TC-END mapDialog.send(); - to send TC-CONTINUE mapDialog.close(true); - sends TC-END without any components (prearrangedEnd) Instead of send() and close(boolean prearrangedEnd) methods you can invoke sendDelayed() or closeDelayed(boolean prearrangedEnd) methods. These methods make the same as sned and close() methods. But when invoking it from events of parsing incoming components real sending and dialog closing will occur only when all incoming components events and onDialogDelimiter() or onDialogClose() would be processed. If all response components have been prepared we should return the control and will send a response when all components are ready. In the error case you can terminate a MAP dialog in any method by invoking mapDialog.abort(mapUserAbortChoice); - sends TC-U-ABORT primitive If no local actions or no response from a remote size for a long time timeouts occur and the following methods are invoked: MAPDialogListener.onDialogTimeout(MAPDialog mapDialog); MAPServiceListener.onInvokeTimeout(MAPDialog mapDialog, Long invokeId); In onDialogTimeout() method you can invoke mapDialog.keepAlive(); to prevent closing a Dialog. For preventing an Invoke timeout you should invoke resetInvokeTimer(Long invokeId); (before onInvokeTimeout() occured).
package org.mobicents.protocols.ss7.map; import javax.naming.InitialContext; import javax.naming.NamingException; import org.mobicents.protocols.ss7.indicator.RoutingIndicator; import org.mobicents.protocols.ss7.map.api.primitives.AddressNature; import org.mobicents.protocols.ss7.map.api.primitives.ISDNAddressString; import org.mobicents.protocols.ss7.map.api.primitives.NumberingPlan; import org.mobicents.protocols.ss7.sccp.SccpStack;
106
MAP
import org.mobicents.protocols.ss7.sccp.SccpProvider; import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; public class Example { private static SccpProvider getSccpProvider() ..... ..... } {
private static SccpAddress createLocalAddress() { return new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, 1, null, 8); } private static SccpAddress createRemoteAddress() { return new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, 2, null, 8); }
public static void startUssdClient() throws Exception { SccpProvider sccpProvider = getSccpProvider(); // JNDI lookup of SCCP UssdClientExample client = new UssdClientExample(sccpProvider, 8); client.start(); SccpAddress origAddress = createLocalAddress(); ISDNAddressString origReference = client.getMAPProvider().getMAPParameterFactory() .createISDNAddressString(AddressNature.international_number, NumberingPlan.land_mobile, "31628968300"); SccpAddress destAddress = createRemoteAddress(); ISDNAddressString destReference = client.getMAPProvider().getMAPParameterFactory() .createISDNAddressString(AddressNature.international_number, NumberingPlan.land_mobile, "204208300008002"); ISDNAddressString msisdn = client.getMAPProvider().getMAPParameterFactory() .createISDNAddressString(AddressNature.international_number, NumberingPlan.ISDN, "31628838002"); client.sendProcessUssdRequest(origAddress, origReference, destAddress, destReference, "*123#", null, msisdn); // wait for answer Thread.sleep(600000); client.stop(); } public static void startUssdServer() throws Exception { SccpProvider sccpProvider = getSccpProvider(); UssdServerExample server = new UssdServerExample(sccpProvider, 8); server.start(); // wait for a request Thread.sleep(600000); server.stop(); } }
107
MAP
package org.mobicents.protocols.ss7.map; import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.map.api.MAPApplicationContext; org.mobicents.protocols.ss7.map.api.MAPApplicationContextName; org.mobicents.protocols.ss7.map.api.MAPApplicationContextVersion; org.mobicents.protocols.ss7.map.api.MAPDialog; org.mobicents.protocols.ss7.map.api.MAPDialogListener; org.mobicents.protocols.ss7.map.api.MAPException; org.mobicents.protocols.ss7.map.api.MAPMessage; org.mobicents.protocols.ss7.map.api.MAPParameterFactory; org.mobicents.protocols.ss7.map.api.MAPProvider; org.mobicents.protocols.ss7.map.api.MAPStack; org.mobicents.protocols.ss7.map.api.datacoding.CBSDataCodingScheme; org.mobicents.protocols.ss7.map.api.dialog.MAPAbortProviderReason; org.mobicents.protocols.ss7.map.api.dialog.MAPAbortSource; org.mobicents.protocols.ss7.map.api.dialog.MAPNoticeProblemDiagnostic; org.mobicents.protocols.ss7.map.api.dialog.MAPProviderError;
import org.mobicents.protocols.ss7.map.api.dialog.MAPRefuseReason; import org.mobicents.protocols.ss7.map.api.dialog.MAPUserAbortChoice; import org.mobicents.protocols.ss7.map.api.errors.MAPErrorMessage; import org.mobicents.protocols.ss7.map.api.primitives.AddressString; import org.mobicents.protocols.ss7.map.api.primitives.AlertingPattern; import org.mobicents.protocols.ss7.map.api.primitives.IMSI; import org.mobicents.protocols.ss7.map.api.primitives.ISDNAddressString; import org.mobicents.protocols.ss7.map.api.primitives.MAPExtensionContainer; import org.mobicents.protocols.ss7.map.api.primitives.USSDString; import org.mobicents.protocols.ss7.map.api.service.supplementary.MAPDialogSupplementary; import org.mobicents.protocols.ss7.map.api.service.supplementary.MAPServiceSupplementaryListener; import org.mobicents.protocols.ss7.map.api.service.supplementary.ProcessUnstructuredSSRequest; import org.mobicents.protocols.ss7.map.api.service.supplementary.ProcessUnstructuredSSResponse; import org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSNotifyRequest; import import import import import import import import org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSNotifyResponse; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSRequest; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSResponse; org.mobicents.protocols.ss7.map.datacoding.CBSDataCodingSchemeImpl; org.mobicents.protocols.ss7.sccp.SccpProvider; org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; org.mobicents.protocols.ss7.tcap.asn.ApplicationContextName; org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
public class UssdClientExample implements MAPDialogListener, MAPServiceSupplementaryListener { private MAPStack mapStack; private MAPProvider mapProvider; private MAPParameterFactory paramFact; private MAPDialogSupplementary currentMapDialog; public UssdClientExample(SccpProvider sccpPprovider, int ssn) { mapStack = new MAPStackImpl(sccpPprovider, ssn); mapProvider = mapStack.getMAPProvider(); paramFact = mapProvider.getMAPParameterFactory(); mapProvider.addMAPDialogListener(this); mapProvider.getMAPServiceSupplementary().addMAPServiceListener(this);
108
MAP
} public MAPProvider getMAPProvider() { return mapProvider; } public void start() { mapStack.start(); // Make the supplementary service activated mapProvider.getMAPServiceSupplementary().acivate(); currentMapDialog = null; } public void stop() { mapStack.stop(); }
public void sendProcessUssdRequest(SccpAddress origAddress, AddressString origReference, SccpAddress remoteAdd String ussdMessage, AlertingPattern alertingPattern, ISDNAddressString msisdn) throws MAPException { // First create Dialog currentMapDialog = mapProvider.getMAPServiceSupplementary().createNewDialog( MAPApplicationContext.getInstance(MAPApplicationContextName.networkUnstructuredSsContext, MAPAppli destReference, remoteAddress, destReference); CBSDataCodingScheme ussdDataCodingScheme = new CBSDataCodingSchemeImpl(0x0f); // The Charset is null, here we let system use default Charset (UTF-7 as // explained in GSM 03.38. However if MAP User wants, it can set its own // impl of Charset USSDString ussdString = paramFact.createUSSDString(ussdMessage, null, null);
currentMapDialog.addProcessUnstructuredSSRequest(ussdDataCodingScheme, ussdString, alertingPattern, msisdn // This will initiate the TC-BEGIN with INVOKE component currentMapDialog.send(); } public void onProcessUnstructuredSSResponse(ProcessUnstructuredSSResponse ind) { if (currentMapDialog == ind.getMAPDialog()) { USSDString ussdString = ind.getUSSDString(); try { String response = ussdString.getString(null); // processing USSD response } catch (MAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
public void onErrorComponent(MAPDialog mapDialog, Long invokeId, MAPErrorMessage mapErrorMessage) { // TODO Auto-generated method stub } public void onProviderErrorComponent(MAPDialog mapDialog, Long invokeId, MAPProviderError providerError) { // TODO Auto-generated method stub
109
MAP
} public void onRejectComponent(MAPDialog mapDialog, Long invokeId, Problem problem) { // TODO Auto-generated method stub } public void onInvokeTimeout(MAPDialog mapDialog, Long invokeId) { // TODO Auto-generated method stub } public void onMAPMessage(MAPMessage mapMessage) { // TODO Auto-generated method stub } public void onProcessUnstructuredSSRequest(ProcessUnstructuredSSRequest procUnstrReqInd) { // TODO Auto-generated method stub } public void onUnstructuredSSRequest(UnstructuredSSRequest unstrReqInd) { // TODO Auto-generated method stub } public void onUnstructuredSSResponse(UnstructuredSSResponse unstrResInd) { // TODO Auto-generated method stub } public void onUnstructuredSSNotifyRequest(UnstructuredSSNotifyRequest unstrNotifyInd) { // TODO Auto-generated method stub } public void onUnstructuredSSNotifyResponse(UnstructuredSSNotifyResponse unstrNotifyInd) { // TODO Auto-generated method stub } public void onDialogDelimiter(MAPDialog mapDialog) { // TODO Auto-generated method stub }
public void onDialogRequest(MAPDialog mapDialog, AddressString destReference, AddressString origReference, MAP // TODO Auto-generated method stub }
public void onDialogRequestEricsson(MAPDialog mapDialog, AddressString destReference, AddressString origRefere // TODO Auto-generated method stub } public void onDialogAccept(MAPDialog mapDialog, MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub
110
MAP
} public void onDialogReject(MAPDialog mapDialog, MAPRefuseReason refuseReason, MAPProviderError providerError, ApplicationContextName alternativeApplicationContext, MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub }
public void onDialogUserAbort(MAPDialog mapDialog, MAPUserAbortChoice userReason, MAPExtensionContainer extens // TODO Auto-generated method stub }
public void onDialogProviderAbort(MAPDialog mapDialog, MAPAbortProviderReason abortProviderReason, MAPAbortSou MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub } public void onDialogClose(MAPDialog mapDialog) { // TODO Auto-generated method stub } public void onDialogNotice(MAPDialog mapDialog, MAPNoticeProblemDiagnostic noticeProblemDiagnostic) { // TODO Auto-generated method stub } public void onDialogRelease(MAPDialog mapDialog) { currentMapDialog = null; } public void onDialogTimeout(MAPDialog mapDialog) { // TODO Auto-generated method stub } }
package org.mobicents.protocols.ss7.map; import org.mobicents.protocols.ss7.map.api.MAPDialog; import org.mobicents.protocols.ss7.map.api.MAPDialogListener; import org.mobicents.protocols.ss7.map.api.MAPException; import org.mobicents.protocols.ss7.map.api.MAPMessage; import org.mobicents.protocols.ss7.map.api.MAPParameterFactory; import org.mobicents.protocols.ss7.map.api.MAPProvider; import org.mobicents.protocols.ss7.map.api.MAPStack; import org.mobicents.protocols.ss7.map.api.datacoding.CBSDataCodingScheme; import org.mobicents.protocols.ss7.map.api.dialog.MAPAbortProviderReason; import org.mobicents.protocols.ss7.map.api.dialog.MAPAbortSource; import org.mobicents.protocols.ss7.map.api.dialog.MAPNoticeProblemDiagnostic; import org.mobicents.protocols.ss7.map.api.dialog.MAPProviderError;
111
MAP
import org.mobicents.protocols.ss7.map.api.dialog.MAPRefuseReason; import import import import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.map.api.dialog.MAPUserAbortChoice; org.mobicents.protocols.ss7.map.api.errors.MAPErrorMessage; org.mobicents.protocols.ss7.map.api.primitives.AddressString; org.mobicents.protocols.ss7.map.api.primitives.IMSI; org.mobicents.protocols.ss7.map.api.primitives.MAPExtensionContainer; org.mobicents.protocols.ss7.map.api.primitives.USSDString; org.mobicents.protocols.ss7.map.api.service.supplementary.MAPDialogSupplementary; org.mobicents.protocols.ss7.map.api.service.supplementary.MAPServiceSupplementaryListener; org.mobicents.protocols.ss7.map.api.service.supplementary.ProcessUnstructuredSSRequest; org.mobicents.protocols.ss7.map.api.service.supplementary.ProcessUnstructuredSSResponse; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSNotifyRequest; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSNotifyResponse; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSRequest; org.mobicents.protocols.ss7.map.api.service.supplementary.UnstructuredSSResponse; org.mobicents.protocols.ss7.map.datacoding.CBSDataCodingSchemeImpl; org.mobicents.protocols.ss7.sccp.SccpProvider; org.mobicents.protocols.ss7.tcap.asn.ApplicationContextName; org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
public class UssdServerExample implements MAPDialogListener, MAPServiceSupplementaryListener { private MAPStack mapStack; private MAPProvider mapProvider; private MAPParameterFactory paramFact; private MAPDialogSupplementary currentMapDialog; public UssdServerExample(SccpProvider sccpPprovider, int ssn) { mapStack = new MAPStackImpl(sccpPprovider, ssn); mapProvider = mapStack.getMAPProvider(); paramFact = mapProvider.getMAPParameterFactory(); mapProvider.addMAPDialogListener(this); mapProvider.getMAPServiceSupplementary().addMAPServiceListener(this); } public MAPProvider getMAPProvider() { return mapProvider; } public void start() { mapStack.start(); // Make the supplementary service activated mapProvider.getMAPServiceSupplementary().acivate(); currentMapDialog = null; } public void stop() { mapStack.stop(); } public void onProcessUnstructuredSSRequest(ProcessUnstructuredSSRequest ind) { USSDString ussdString = ind.getUSSDString(); try { String request = ussdString.getString(null);
112
MAP
// processing USSD request String response = "Your balans is 100$"; CBSDataCodingScheme ussdDataCodingScheme = new CBSDataCodingSchemeImpl(0x0f); USSDString ussdResponse = paramFact.createUSSDString(response, null, null);
currentMapDialog.addProcessUnstructuredSSResponse(ind.getInvokeId(), ussdDataCodingScheme, ussdRespons } catch (MAPException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public void onDialogDelimiter(MAPDialog mapDialog) { // This will initiate the TC-END with ReturnResultLast component try { currentMapDialog.send(); } catch (MAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public void onErrorComponent(MAPDialog mapDialog, Long invokeId, MAPErrorMessage mapErrorMessage) { // TODO Auto-generated method stub } public void onProviderErrorComponent(MAPDialog mapDialog, Long invokeId, MAPProviderError providerError) { // TODO Auto-generated method stub } public void onRejectComponent(MAPDialog mapDialog, Long invokeId, Problem problem) { // TODO Auto-generated method stub } public void onInvokeTimeout(MAPDialog mapDialog, Long invokeId) { // TODO Auto-generated method stub } public void onMAPMessage(MAPMessage mapMessage) { // TODO Auto-generated method stub } public void onProcessUnstructuredSSResponse(ProcessUnstructuredSSResponse ind) { // TODO Auto-generated method stub } public void onUnstructuredSSRequest(UnstructuredSSRequest unstrReqInd) { // TODO Auto-generated method stub }
113
MAP
public void onUnstructuredSSResponse(UnstructuredSSResponse unstrResInd) { // TODO Auto-generated method stub } public void onUnstructuredSSNotifyRequest(UnstructuredSSNotifyRequest unstrNotifyInd) { // TODO Auto-generated method stub } public void onUnstructuredSSNotifyResponse(UnstructuredSSNotifyResponse unstrNotifyInd) { // TODO Auto-generated method stub }
public void onDialogRequest(MAPDialog mapDialog, AddressString destReference, AddressString origReference, MAP // TODO Auto-generated method stub }
public void onDialogRequestEricsson(MAPDialog mapDialog, AddressString destReference, AddressString origRefere // TODO Auto-generated method stub } public void onDialogAccept(MAPDialog mapDialog, MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub } public void onDialogReject(MAPDialog mapDialog, MAPRefuseReason refuseReason, MAPProviderError providerError, ApplicationContextName alternativeApplicationContext, MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub }
public void onDialogUserAbort(MAPDialog mapDialog, MAPUserAbortChoice userReason, MAPExtensionContainer extens // TODO Auto-generated method stub }
public void onDialogProviderAbort(MAPDialog mapDialog, MAPAbortProviderReason abortProviderReason, MAPAbortSou MAPExtensionContainer extensionContainer) { // TODO Auto-generated method stub } public void onDialogClose(MAPDialog mapDialog) { // TODO Auto-generated method stub } public void onDialogNotice(MAPDialog mapDialog, MAPNoticeProblemDiagnostic noticeProblemDiagnostic) { // TODO Auto-generated method stub } public void onDialogRelease(MAPDialog mapDialog) { currentMapDialog = null;
114
MAP
115
Important
For better understanding of this chapter you must be familiar with the specifications defined in 3GPP TS 22.078 (service aspects) and 3GPP TS 23.078 (technical realization).
Note
Mobicents jSS7 Stack CAP has full implementation for Phase 1 and Phase 2 we welcome any contribution to implement other Phases. We will provide you with all the guidance you may require. The list of implemented operations can be found at CAPMessagesImplemented.ods [http://code.google.com/p/jss7/source/ browse/cap/CAPMessagesImplemented.ods]. You can find the list of implemented operations here: CAPMessagesImplemented.ods [http://code.google.com/p/jss7/ source/browse/cap/CAPMessagesImplemented.ods]. The document uses color coding to represent the status of the implementation:
Green Fully Implemented Red Interface available (but not yet implemented) Yellow Implementation in progress Blue Implemeted only for CAP V2 and not available for CAP V3 and V4
116
CAP
Each CAP-User interested in listening to messages specific to CAP Service implements specific CAPServiceListener.
CAP-User implements
interested
only
in
circuit
switched
call
operations
org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.
CAPServiceCircuitSwitchedCallListener
CAP-User
interested
only
in
GPRS
operations
implements
org.mobicents.protocols.ss7.cap.api.service.gprs.CAPServiceGprsListener
CAP-User
interested
only
in
SMS
operations
implements
org.mobicents.protocols.ss7.cap.api.service.sms.CAPServiceSmsListener
CAP-User interested in all the services must implement all the service listener class. The org.mobicents.protocols.ss7.cap.CAPStackImpl is concrete implementation of CAPStack. The CAP User application creates an instance of CAPStackImpl passing the reference of SccpProvider and Sub System Number and then start it. All incoming messages are checked for destination SSN, if it matches with the one registered with this CAPStackImpl the corresponding listener is called, else the peer receives error.
SccpProvider sccpProvider = getSccpProvider(); CAPStackImpl capStack = new CAPStackImpl(sccpProvider, 146); capStack.start(); ...
The reference to SccpProvider is received from SccpStack. To get handle to SccpStack do the JNDI look-up passing the JNDI name configured in SS7 service as explained in ???. The CAP User application should register the concrete implementation of CAPDialogListener with CAPProvider to listen for incoming CAP Dialog and CAP Primitive messages. The CAP User application should register the concrete implementation of CAPServiceListener with
117
CAP
corresponding CAPServiceBase to listen for incoming CAP Service messages. Following CAPServiceBase are exposed by CAPProvider.
For
circuit
switched
call
service
org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall. CAPServiceCircuitSwitchedCall
For
GPRS
service
org.mobicents.protocols.ss7.cap.api.service.gprs.CAPServiceGprs
public class CAPExample implements CAPDialogListener, CAPServiceCircuitSwitchedCallListener { .... capProvider = capStack.getCAPProvider(); capProvider.addCAPDialogListener(this); capProvider.getCAPServiceCircuitSwitchedCall().addCAPServiceListener(this); .... }
Before any CAP specific service can be used, the corresponding service should be activated.
MAPParameterFactory to create instances of IMSI, ISDNAddressString and many other MAP primitives that are used by CAP services. CAPParameterFactory to create instances of CAP primitives that are used by CAP services. ISUPParameterFactory to create instances of ISUP primitives that are used by CAP services. INAPPParameterFactory to create instances of INAP primitives that are used by CAP services. CAPErrorMessageFactory to create instances of CAP error messages like
CAPErrorMessageSystemFailure.
118
CAP
CapParameterFactory capParamFact = capProvider.getCapServiceFactory(); ISDNAddressString msisdn = mapParamFact.createISDNAddressString( AddressNature.international_number, NumberingPlan.ISDN, "31628838002"); BCSMEvent ev = capParamFact.createBCSMEvent(EventTypeBCSM.routeSelectFailure, MonitorMode.notifyAndContinue, null, null, false);
// First create Dialog SccpAddress origAddress = createLocalAddress(); SccpAddress destAddress = createRemoteAddress(); CAPApplicationContext acn = CAPApplicationContext.CapV2_gsmSSF_to_gsmSCF; currentCapDialog = capProvider.getCAPServiceCircuitSwitchedCall(). createNewDialog(acn, origAddress, remoteAddress);
int serviceKey = 1; CalledPartyNumber calledPartyNumber = client.getCAPProvider(). getISUPParameterFactory().createCalledPartyNumber(); calledPartyNumber.setAddress("552348762"); calledPartyNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); calledPartyNumber.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); calledPartyNumber.setInternalNetworkNumberIndicator(CalledPartyNumber._INN_ROUTING_ALLOWED); CalledPartyNumberCap calledPartyNumberCap = client.getCAPProvider(). getCAPParameterFactory().createCalledPartyNumberCap(calledPartyNumber); CallingPartyNumber callingPartyNumber = client.getCAPProvider(). getISUPParameterFactory().createCallingPartyNumber(); callingPartyNumber.setAddress("55998223"); callingPartyNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); callingPartyNumber.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); callingPartyNumber.setAddressRepresentationREstrictedIndicator(CallingPartyNumber._APRI_ALLOWED); callingPartyNumber.setScreeningIndicator(CallingPartyNumber._SI_NETWORK_PROVIDED); CallingPartyNumberCap callingPartyNumberCap = client.getCAPProvider(). getCAPParameterFactory().createCallingPartyNumberCap(callingPartyNumber); LocationNumber locationNumber = client.getCAPProvider().getISUPParameterFactory(). createLocationNumber(); locationNumber.setAddress("55200001"); locationNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); locationNumber.setNumberingPlanIndicator(LocationNumber._NPI_ISDN); locationNumber.setAddressRepresentationRestrictedIndicator(LocationNumber._APRI_ALLOWED);
119
CAP
locationNumber.setScreeningIndicator(LocationNumber._SI_NETWORK_PROVIDED); locationNumber.setInternalNetworkNumberIndicator(LocationNumber._INN_ROUTING_ALLOWED); LocationNumberCap locationNumberCap = client.getCAPProvider().getCAPParameterFactory(). createLocationNumberCap(locationNumber); ISDNAddressString vlrNumber = client.getCAPProvider().getMAPParameterFactory() .createISDNAddressString(AddressNature.international_number, NumberingPlan.ISDN, "552000002"); LocationInformation locationInformation = client.getCAPProvider().getMAPParameterFactory() .createLocationInformation(10, null, vlrNumber, null, null, null, null, vlrNumber, null, false, false, null, null); currentCapDialog.addInitialDPRequest(serviceKey, calledPartyNumber, callingPartyNumber, null, null, null, locationNumber, null, null, null, null, null, eventTypeBCSM, null, null, null, null, null, null, null, false, null, null, locationInformation, null, null, null, null, null, false, null);
- Wait for a response and other instructions from the SCF At the SCF side when receiving TC-Begin message the following sequence of events occur:
This is the request for CAP Dialog processing. A CAP user can reject the Dialog by invoking capDialog.refuse() method. Then the incoming primitives corresponded events (one or more) occur. In this case it is
When processing component-dependant messages you can add response components or add other Invoke requests. In this case it is RequestReportBCSMEventRequest as an example:
ArrayList<BCSMEvent> bcsmEventList = new ArrayList<BCSMEvent>(); BCSMEvent ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.routeSelectFailure, MonitorMode.notifyAndContinue, null, null, false);
120
CAP
bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oCalledPartyBusy, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oNoAnswer, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oAnswer, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); LegID legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg1); ev = this.capProvider.getCAPParameterFactory() .createBCSMEvent(EventTypeBCSM.oDisconnect, MonitorMode.notifyAndContinue, legId, null, false); bcsmEventList.add(ev); legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg2); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oDisconnect, MonitorMode.interrupted, legId, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent(EventTypeBCSM.oAbandon, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); currentCapDialog.addRequestReportBCSMEventRequest(bcsmEventList, null); currentCapDialog.send();
If preparing the response spends much time we should return the control and prepare the answer in your thread. If error or reject primitives are included into a TCAP message following events occur:
public void onErrorComponent(CAPDialog capDialog, Long invokeId, CAPErrorMessage capErrorMessage); public void onProviderErrorComponent(CAPDialog capDialog, Long invokeId, CAPComponentErrorReason providerError); public void onRejectComponent(CAPDialog capDialog, Long invokeId, Problem problem);
After all incoming components have been processing onDialogDelimiter(CAPDialog capDialog); event is invoking (or onDialogClose(CAPDialog capDialog) in TC-END case). If all response components have been prepared we can tell the stack to send response: capDialog.close(false); - to send TC-END capDialog.send(); - to send TC-CONTINUE capDialog.close(true); - sends TC-END without any components (prearrangedEnd) Instead of send() and close(boolean prearrangedEnd) methods you can invoke sendDelayed() or closeDelayed(boolean prearrangedEnd) methods. These methods make the same as sned and close() methods. But when invoking it from events of parsing incoming components real sending and dialog closing will occur only when all incoming components events and onDialogDelimiter() or onDialogClose() would be processed. If all response components have been prepared we should return the control and will send a response when all components are ready.
121
CAP
In the error case you can terminate a CAP dialog in any method by invoking capDialog.abort(CAPUserAbortReason abortReason); - sends TC-U-ABORT primitive If no local actions or no response from a remote size for a long time timeouts occur and the following methods are invoked: CAPDialogListener.onDialogTimeout(CAPDialog capDialog); CAPServiceListener.onInvokeTimeout(CAPDialog capDialog, Long invokeId); In onDialogTimeout() method you can invoke capDialog.keepAlive(); to prevent closing a Dialog. For preventing an Invoke timeout you should invoke resetInvokeTimer(Long invokeId); (before onInvokeTimeout() occured).
package org.mobicents.protocols.ss7.cap; import javax.naming.InitialContext; import javax.naming.NamingException; import import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.cap.api.EsiBcsm.OAnswerSpecificInfo; org.mobicents.protocols.ss7.cap.api.EsiBcsm.ODisconnectSpecificInfo; org.mobicents.protocols.ss7.cap.api.isup.CalledPartyNumberCap; org.mobicents.protocols.ss7.cap.api.isup.CallingPartyNumberCap; org.mobicents.protocols.ss7.cap.api.isup.CauseCap; org.mobicents.protocols.ss7.cap.api.isup.LocationNumberCap; org.mobicents.protocols.ss7.cap.api.primitives.EventTypeBCSM; org.mobicents.protocols.ss7.cap.api.primitives.ReceivingSideID; org.mobicents.protocols.ss7.inap.api.primitives.LegType; org.mobicents.protocols.ss7.inap.api.primitives.MiscCallInfo; org.mobicents.protocols.ss7.inap.api.primitives.MiscCallInfoMessageType; org.mobicents.protocols.ss7.indicator.RoutingIndicator; org.mobicents.protocols.ss7.isup.message.parameter.CalledPartyNumber; org.mobicents.protocols.ss7.isup.message.parameter.CallingPartyNumber; org.mobicents.protocols.ss7.isup.message.parameter.CauseIndicators; org.mobicents.protocols.ss7.isup.message.parameter.LocationNumber;
import org.mobicents.protocols.ss7.isup.message.parameter.NAINumber; import org.mobicents.protocols.ss7.map.api.primitives.AddressNature; import org.mobicents.protocols.ss7.map.api.primitives.ISDNAddressString; import org.mobicents.protocols.ss7.map.api.primitives.NumberingPlan; import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.LocationInformation; import org.mobicents.protocols.ss7.sccp.SccpProvider; import org.mobicents.protocols.ss7.sccp.SccpStack; import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; public class Example { private static SccpProvider getSccpProvider() .... .... {
122
CAP
} private static SccpAddress createLocalAddress() { return new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, 1, null, 146); } private static SccpAddress createRemoteAddress() { return new SccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, 2, null, 146); }
public static void startCallSsf() throws Exception { SccpProvider sccpProvider = getSccpProvider(); // JNDI lookup of SCCP CallSsfExample client = new CallSsfExample(sccpProvider, 146); client.start(); // starting a call SccpAddress origAddress = createLocalAddress(); SccpAddress destAddress = createRemoteAddress(); int serviceKey = 1; CalledPartyNumber calledPartyNumber = client.getCAPProvider().getISUPParameterFactory(). createCalledPartyNumber(); calledPartyNumber.setAddress("552348762"); calledPartyNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); calledPartyNumber.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); calledPartyNumber.setInternalNetworkNumberIndicator(CalledPartyNumber._INN_ROUTING_ALLOWED); CalledPartyNumberCap calledPartyNumberCap = client.getCAPProvider(). getCAPParameterFactory().createCalledPartyNumberCap(calledPartyNumber); CallingPartyNumber callingPartyNumber = client.getCAPProvider().getISUPParameterFactory(). createCallingPartyNumber(); callingPartyNumber.setAddress("55998223"); callingPartyNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); callingPartyNumber.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); callingPartyNumber.setAddressRepresentationREstrictedIndicator( CallingPartyNumber._APRI_ALLOWED); callingPartyNumber.setScreeningIndicator(CallingPartyNumber._SI_NETWORK_PROVIDED); CallingPartyNumberCap callingPartyNumberCap = client.getCAPProvider(). getCAPParameterFactory().createCallingPartyNumberCap(callingPartyNumber); LocationNumber locationNumber = client.getCAPProvider().getISUPParameterFactory(). createLocationNumber(); locationNumber.setAddress("55200001"); locationNumber.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); locationNumber.setNumberingPlanIndicator(LocationNumber._NPI_ISDN); locationNumber.setAddressRepresentationRestrictedIndicator(LocationNumber._APRI_ALLOWED); locationNumber.setScreeningIndicator(LocationNumber._SI_NETWORK_PROVIDED); locationNumber.setInternalNetworkNumberIndicator(LocationNumber._INN_ROUTING_ALLOWED); LocationNumberCap locationNumberCap = client.getCAPProvider().getCAPParameterFactory(). createLocationNumberCap(locationNumber); ISDNAddressString vlrNumber = client.getCAPProvider().getMAPParameterFactory() .createISDNAddressString(AddressNature.international_number, NumberingPlan.ISDN, "552000002"); LocationInformation locationInformation = client.getCAPProvider().getMAPParameterFactory() .createLocationInformation(10, null, vlrNumber, null, null, null, null,
123
CAP
vlrNumber, null, false, false, null, null); client.sendInitialDP(origAddress, destAddress, serviceKey, calledPartyNumberCap, callingPartyNumberCap, locationNumberCap, EventTypeBCSM.collectedInfo, locationInformation); // sending oAnswer in 5 sec Thread.sleep(5000); OAnswerSpecificInfo oAnswerSpecificInfo = client.getCAPProvider().getCAPParameterFactory() .createOAnswerSpecificInfo(null, false, false, null, null, null); ReceivingSideID legID = client.getCAPProvider().getCAPParameterFactory(). createReceivingSideID(LegType.leg2); MiscCallInfo miscCallInfo = client.getCAPProvider().getINAPParameterFactory(). createMiscCallInfo(MiscCallInfoMessageType.notification, null); client.sendEventReportBCSM_OAnswer(oAnswerSpecificInfo, legID, miscCallInfo); // sending oDisconnect in 20 sec Thread.sleep(20000); CauseIndicators causeIndicators = client.getCAPProvider().getISUPParameterFactory(). createCauseIndicators(); causeIndicators.setLocation(CauseIndicators._LOCATION_USER); causeIndicators.setCodingStandard(CauseIndicators._CODING_STANDARD_ITUT); causeIndicators.setCauseValue(CauseIndicators._CV_ALL_CLEAR); CauseCap releaseCause = client.getCAPProvider().getCAPParameterFactory(). createCauseCap(causeIndicators); ODisconnectSpecificInfo oDisconnectSpecificInfo = client.getCAPProvider(). getCAPParameterFactory().createODisconnectSpecificInfo(releaseCause); legID = client.getCAPProvider().getCAPParameterFactory().createReceivingSideID(LegType.leg1); miscCallInfo = client.getCAPProvider().getINAPParameterFactory(). createMiscCallInfo(MiscCallInfoMessageType.notification, null); client.sendEventReportBCSM_ODisconnect(oDisconnectSpecificInfo, legID, miscCallInfo); // wait for answer Thread.sleep(600000); client.stop(); } public static void startCallScf() throws Exception { SccpProvider sccpProvider = getSccpProvider(); // JNDI lookup of SCCP CallScfExample server = new CallScfExample(sccpProvider, 146); server.start(); // wait for a request Thread.sleep(600000); server.stop(); } }
124
CAP
import org.mobicents.protocols.ss7.cap.api.CAPDialog; import import import import import import import import import import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.cap.api.CAPDialogListener; org.mobicents.protocols.ss7.cap.api.CAPException; org.mobicents.protocols.ss7.cap.api.CAPMessage; org.mobicents.protocols.ss7.cap.api.CAPParameterFactory; org.mobicents.protocols.ss7.cap.api.CAPProvider; org.mobicents.protocols.ss7.cap.api.CAPStack; org.mobicents.protocols.ss7.cap.api.EsiBcsm.OAnswerSpecificInfo; org.mobicents.protocols.ss7.cap.api.EsiBcsm.ODisconnectSpecificInfo; org.mobicents.protocols.ss7.cap.api.dialog.CAPComponentErrorReason; org.mobicents.protocols.ss7.cap.api.dialog.CAPGeneralAbortReason; org.mobicents.protocols.ss7.cap.api.dialog.CAPGprsReferenceNumber; org.mobicents.protocols.ss7.cap.api.dialog.CAPNoticeProblemDiagnostic; org.mobicents.protocols.ss7.cap.api.dialog.CAPUserAbortReason; org.mobicents.protocols.ss7.cap.api.errors.CAPErrorMessage; org.mobicents.protocols.ss7.cap.api.isup.CalledPartyNumberCap; org.mobicents.protocols.ss7.cap.api.isup.CallingPartyNumberCap; org.mobicents.protocols.ss7.cap.api.isup.LocationNumberCap; org.mobicents.protocols.ss7.cap.api.primitives.EventTypeBCSM; org.mobicents.protocols.ss7.cap.api.primitives.ReceivingSideID; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestResponse; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingReportRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.AssistRequestInstructionsRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPDialogCircuitSwitchedCall; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPServiceCircuitSwitchedCallListener; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationReportRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationRequestRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CancelRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectToResourceRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ContinueRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectForwardConnectionRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EstablishTemporaryConnectionRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EventReportBCSMRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.FurnishChargingInformationRequest; import import import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.InitialDPRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PlayAnnouncementRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationResponse; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ReleaseCallRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.RequestReportBCSMEventRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ResetTimerRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SendChargingInformationRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SpecializedResourceReportRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.primitive.DestinationRoutingAddress; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.primitive.EventSpecificInformationBCSM; org.mobicents.protocols.ss7.inap.api.primitives.MiscCallInfo; org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.LocationInformation; org.mobicents.protocols.ss7.sccp.SccpProvider; org.mobicents.protocols.ss7.sccp.parameter.SccpAddress; org.mobicents.protocols.ss7.tcap.asn.comp.PAbortCauseType; org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
public class CallSsfExample implements CAPDialogListener, CAPServiceCircuitSwitchedCallListener { private CAPStack capStack; private CAPProvider capProvider;
125
CAP
private CAPParameterFactory paramFact; private CAPDialogCircuitSwitchedCall currentCapDialog; private CallContent cc; public CallSsfExample(SccpProvider sccpPprovider, int ssn) { capStack = new CAPStackImpl(sccpPprovider, ssn); capProvider = capStack.getCAPProvider(); paramFact = capProvider.getCAPParameterFactory(); capProvider.addCAPDialogListener(this); capProvider.getCAPServiceCircuitSwitchedCall().addCAPServiceListener(this); } public CAPProvider getCAPProvider() { return capProvider; } public void start() { capStack.start(); // Make the circuitSwitchedCall service activated capProvider.getCAPServiceCircuitSwitchedCall().acivate(); currentCapDialog = null; } public void stop() { capStack.stop(); } public void sendInitialDP(SccpAddress origAddress, SccpAddress remoteAddress, int serviceKey, CalledPartyNumberCap calledPartyNumber, CallingPartyNumberCap callingPartyNumber, LocationNumberCap locationNumber, EventTypeBCSM eventTypeBCSM, LocationInformation locationInformation) throws CAPException { // First create Dialog CAPApplicationContext acn = CAPApplicationContext.CapV2_gsmSSF_to_gsmSCF; currentCapDialog = capProvider.getCAPServiceCircuitSwitchedCall().createNewDialog(acn, origAddress, remoteAddress); currentCapDialog.addInitialDPRequest(serviceKey, calledPartyNumber, callingPartyNumber, null, null, null, locationNumber, null, null, null, null, null, eventTypeBCSM, null, null, null, null, null, null, null, false, null, null, locationInformation, null, null, null, null, null, false, null); // This will initiate the TC-BEGIN with INVOKE component currentCapDialog.send(); this.cc.step = Step.initialDPSent; this.cc.calledPartyNumber = calledPartyNumber; this.cc.callingPartyNumber = callingPartyNumber; } public void sendEventReportBCSM_OAnswer(OAnswerSpecificInfo oAnswerSpecificInfo, ReceivingSideID legID, MiscCallInfo miscCallInfo) throws CAPException { if (currentCapDialog != null && this.cc != null) { EventSpecificInformationBCSM eventSpecificInformationBCSM = this.capProvider. getCAPParameterFactory().createEventSpecificInformationBCSM(oAnswerSpecificInfo); currentCapDialog.addEventReportBCSMRequest(EventTypeBCSM.oAnswer,
126
CAP
eventSpecificInformationBCSM, legID, miscCallInfo, null); currentCapDialog.send(); this.cc.step = Step.answered; } } public void sendEventReportBCSM_ODisconnect(ODisconnectSpecificInfo oDisconnectSpecificInfo, ReceivingSideID legID, MiscCallInfo miscCallInfo) throws CAPException { if (currentCapDialog != null && this.cc != null) { EventSpecificInformationBCSM eventSpecificInformationBCSM = this.capProvider. getCAPParameterFactory().createEventSpecificInformationBCSM(oDisconnectSpecificInfo); currentCapDialog.addEventReportBCSMRequest(EventTypeBCSM.oDisconnect, eventSpecificInformationBCSM, legID, miscCallInfo, null); currentCapDialog.send(); this.cc.step = Step.disconnected; } } @Override public void onRequestReportBCSMEventRequest(RequestReportBCSMEventRequest ind) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) { this.cc.requestReportBCSMEventRequest = ind; // initiating BCSM events processing } } @Override public void onActivityTestRequest(ActivityTestRequest ind) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) { this.cc.activityTestInvokeId = ind.getInvokeId(); } } @Override public void onActivityTestResponse(ActivityTestResponse ind) { // TODO Auto-generated method stub } @Override public void onContinueRequest(ContinueRequest ind) { this.cc.step = Step.callAllowed; // sending Continue to use the original calledPartyAddress } @Override public void onConnectRequest(ConnectRequest ind) { this.cc.step = Step.callAllowed; this.cc.destinationRoutingAddress = ind.getDestinationRoutingAddress(); // sending Connect to force routing the call to a new number } @Override public void onDialogTimeout(CAPDialog capDialog) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) { // if the call is still up - keep the sialog alive currentCapDialog.keepAlive(); }
127
CAP
} @Override public void onDialogDelimiter(CAPDialog capDialog) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected) { if (this.cc.activityTestInvokeId != null) { try { currentCapDialog.addActivityTestResponse(this.cc.activityTestInvokeId); this.cc.activityTestInvokeId = null; currentCapDialog.send(); } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } @Override public void onErrorComponent(CAPDialog capDialog, Long invokeId, CAPErrorMessage capErrorMessage) { // TODO Auto-generated method stub } @Override public void onRejectComponent(CAPDialog capDialog, Long invokeId, Problem problem) { // TODO Auto-generated method stub } @Override public void onInvokeTimeout(CAPDialog capDialog, Long invokeId) { // TODO Auto-generated method stub } @Override public void onProviderErrorComponent(CAPDialog capDialog, Long invokeId, CAPComponentErrorReason providerError) { // TODO Auto-generated method stub } @Override public void onCAPMessage(CAPMessage capMessage) { // TODO Auto-generated method stub } @Override public void onInitialDPRequest(InitialDPRequest ind) { // TODO Auto-generated method stub } @Override public void onApplyChargingRequest(ApplyChargingRequest ind) { // TODO Auto-generated method stub
128
CAP
} @Override public void onEventReportBCSMRequest(EventReportBCSMRequest ind) { // TODO Auto-generated method stub } @Override public void onApplyChargingReportRequest(ApplyChargingReportRequest ind) { // TODO Auto-generated method stub } @Override public void onReleaseCallRequest(ReleaseCallRequest ind) { // TODO Auto-generated method stub } @Override public void onCallInformationRequestRequest(CallInformationRequestRequest ind) { // TODO Auto-generated method stub } @Override public void onCallInformationReportRequest(CallInformationReportRequest ind) { // TODO Auto-generated method stub } @Override public void onAssistRequestInstructionsRequest(AssistRequestInstructionsRequest ind) { // TODO Auto-generated method stub } @Override public void onEstablishTemporaryConnectionRequest(EstablishTemporaryConnectionRequest ind) { // TODO Auto-generated method stub } @Override public void onDisconnectForwardConnectionRequest(DisconnectForwardConnectionRequest ind) { // TODO Auto-generated method stub } @Override public void onConnectToResourceRequest(ConnectToResourceRequest ind) { // TODO Auto-generated method stub } @Override public void onResetTimerRequest(ResetTimerRequest ind) {
129
CAP
// TODO Auto-generated method stub } @Override public void onFurnishChargingInformationRequest(FurnishChargingInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onSendChargingInformationRequest(SendChargingInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onSpecializedResourceReportRequest(SpecializedResourceReportRequest ind) { // TODO Auto-generated method stub } @Override public void onPlayAnnouncementRequest(PlayAnnouncementRequest ind) { // TODO Auto-generated method stub } @Override public void onPromptAndCollectUserInformationRequest(PromptAndCollectUserInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onPromptAndCollectUserInformationResponse(PromptAndCollectUserInformationResponse ind) { // TODO Auto-generated method stub } @Override public void onCancelRequest(CancelRequest ind) { // TODO Auto-generated method stub } @Override public void onDialogRequest(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) { // TODO Auto-generated method stub } @Override public void onDialogAccept(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) { // TODO Auto-generated method stub } @Override
130
CAP
public void onDialogUserAbort(CAPDialog capDialog, CAPGeneralAbortReason generalReason, CAPUserAbortReason userReason) { // TODO Auto-generated method stub } @Override public void onDialogProviderAbort(CAPDialog capDialog, PAbortCauseType abortCause) { // TODO Auto-generated method stub } @Override public void onDialogClose(CAPDialog capDialog) { // TODO Auto-generated method stub } @Override public void onDialogRelease(CAPDialog capDialog) { this.currentCapDialog = null; this.cc = null; } @Override public void onDialogNotice(CAPDialog capDialog, CAPNoticeProblemDiagnostic noticeProblemDiagnostic) { // TODO Auto-generated method stub } private enum Step { initialDPSent, callAllowed, answered, disconnected; } private class CallContent { public Step step; public Long activityTestInvokeId; public public public public } } CalledPartyNumberCap calledPartyNumber; CallingPartyNumberCap callingPartyNumber; RequestReportBCSMEventRequest requestReportBCSMEventRequest; DestinationRoutingAddress destinationRoutingAddress;
131
CAP
import org.mobicents.protocols.ss7.cap.api.CAPDialogListener; import import import import import import import import import import import import import import import import import import import import import import import import org.mobicents.protocols.ss7.cap.api.CAPException; org.mobicents.protocols.ss7.cap.api.CAPMessage; org.mobicents.protocols.ss7.cap.api.CAPParameterFactory; org.mobicents.protocols.ss7.cap.api.CAPProvider; org.mobicents.protocols.ss7.cap.api.CAPStack; org.mobicents.protocols.ss7.cap.api.dialog.CAPComponentErrorReason; org.mobicents.protocols.ss7.cap.api.dialog.CAPGeneralAbortReason; org.mobicents.protocols.ss7.cap.api.dialog.CAPGprsReferenceNumber; org.mobicents.protocols.ss7.cap.api.dialog.CAPNoticeProblemDiagnostic; org.mobicents.protocols.ss7.cap.api.dialog.CAPUserAbortReason; org.mobicents.protocols.ss7.cap.api.errors.CAPErrorMessage; org.mobicents.protocols.ss7.cap.api.isup.CalledPartyNumberCap; org.mobicents.protocols.ss7.cap.api.primitives.BCSMEvent; org.mobicents.protocols.ss7.cap.api.primitives.EventTypeBCSM; org.mobicents.protocols.ss7.cap.api.primitives.MonitorMode; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ActivityTestResponse; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingReportRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ApplyChargingRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.AssistRequestInstructionsRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPDialogCircuitSwitchedCall; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CAPServiceCircuitSwitchedCallListener; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationReportRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CallInformationRequestRequest;
import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.CancelRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ConnectToResourceRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ContinueRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.DisconnectForwardConnectionRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EstablishTemporaryConnectionRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.EventReportBCSMRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.FurnishChargingInformationRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.InitialDPRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PlayAnnouncementRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationRequest; import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.PromptAndCollectUserInformationResponse; import import import import import import import import import import import import import org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ReleaseCallRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.RequestReportBCSMEventRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.ResetTimerRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SendChargingInformationRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.SpecializedResourceReportRequest; org.mobicents.protocols.ss7.cap.api.service.circuitSwitchedCall.primitive.DestinationRoutingAddress; org.mobicents.protocols.ss7.inap.api.primitives.LegID; org.mobicents.protocols.ss7.inap.api.primitives.LegType; org.mobicents.protocols.ss7.isup.message.parameter.CalledPartyNumber; org.mobicents.protocols.ss7.isup.message.parameter.NAINumber; org.mobicents.protocols.ss7.sccp.SccpProvider; org.mobicents.protocols.ss7.tcap.asn.comp.PAbortCauseType; org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
public class CallScfExample implements CAPDialogListener, CAPServiceCircuitSwitchedCallListener { private private private private private CAPStack capStack; CAPProvider capProvider; CAPParameterFactory paramFact; CAPDialogCircuitSwitchedCall currentCapDialog; CallContent cc;
132
CAP
public CallScfExample(SccpProvider sccpPprovider, int ssn) { capStack = new CAPStackImpl(sccpPprovider, ssn); capProvider = capStack.getCAPProvider(); paramFact = capProvider.getCAPParameterFactory(); capProvider.addCAPDialogListener(this); capProvider.getCAPServiceCircuitSwitchedCall().addCAPServiceListener(this); } public CAPProvider getCAPProvider() { return capProvider; } public void start() { capStack.start(); // Make the circuitSwitchedCall service activated capProvider.getCAPServiceCircuitSwitchedCall().acivate(); currentCapDialog = null; } public void stop() { capStack.stop(); } @Override public void onInitialDPRequest(InitialDPRequest ind) { this.cc = new CallContent(); this.cc.idp = ind; this.cc.step = Step.initialDPRecieved; } @Override public void onEventReportBCSMRequest(EventReportBCSMRequest ind) { if (this.cc != null) { this.cc.eventList.add(ind); switch (ind.getEventTypeBCSM()) { case oAnswer: this.cc.step = Step.answered; break; case oDisconnect: this.cc.step = Step.disconnected; break; } } } @Override public void onDialogDelimiter(CAPDialog capDialog) { try { if (this.cc != null) { switch (this.cc.step) { case initialDPRecieved: // informing SSF of BCSM events processing ArrayList<BCSMEvent> bcsmEventList = new ArrayList<BCSMEvent>(); BCSMEvent ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.routeSelectFailure, MonitorMode.notifyAndContinue,
133
CAP
null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.oCalledPartyBusy, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.oNoAnswer, MonitorMode.interrupted, null, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.oAnswer, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); LegID legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg1); ev = this.capProvider.getCAPParameterFactory() .createBCSMEvent(EventTypeBCSM.oDisconnect, MonitorMode.notifyAndContinue, legId, null, false); bcsmEventList.add(ev); legId = this.capProvider.getINAPParameterFactory().createLegID(true, LegType.leg2); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.oDisconnect, MonitorMode.interrupted, legId, null, false); bcsmEventList.add(ev); ev = this.capProvider.getCAPParameterFactory().createBCSMEvent( EventTypeBCSM.oAbandon, MonitorMode.notifyAndContinue, null, null, false); bcsmEventList.add(ev); currentCapDialog.addRequestReportBCSMEventRequest(bcsmEventList, null); // calculating here a new called party number if it is needed String newNumber = "22123124"; if (newNumber != null) { // sending Connect to force routing the call to a new ArrayList<CalledPartyNumberCap> calledPartyNumber = new ArrayList<CalledPartyNumberCap>(); CalledPartyNumber cpn = this.capProvider.getISUPParameterFactory(). createCalledPartyNumber(); cpn.setAddress("5599999988"); cpn.setNatureOfAddresIndicator(NAINumber._NAI_INTERNATIONAL_NUMBER); cpn.setNumberingPlanIndicator(CalledPartyNumber._NPI_ISDN); cpn.setInternalNetworkNumberIndicator(CalledPartyNumber._INN_ROUTING_ALLOWED); CalledPartyNumberCap cpnc = this.capProvider.getCAPParameterFactory(). createCalledPartyNumberCap(cpn); calledPartyNumber.add(cpnc); DestinationRoutingAddress destinationRoutingAddress = this.capProvider. getCAPParameterFactory().createDestinationRoutingAddress( calledPartyNumber); currentCapDialog.addConnectRequest(destinationRoutingAddress, null, null, null, null, null, null, null, null, null, null, null, null, false, false, false, null, false); } else { // sending Continue to use the original calledPartyAddress currentCapDialog.addContinueRequest(); } currentCapDialog.send(); break; case disconnected: // the call is terminated - close dialog currentCapDialog.close(false); number
134
CAP
break; } } } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onDialogTimeout(CAPDialog capDialog) { if (currentCapDialog != null && this.cc != null && this.cc.step != Step.disconnected && this.cc.activityTestInvokeId == null) { // check the SSF if the call is still alive currentCapDialog.keepAlive(); try { this.cc.activityTestInvokeId = currentCapDialog.addActivityTestRequest(); currentCapDialog.send(); } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void onActivityTestResponse(ActivityTestResponse ind) { if (currentCapDialog != null && this.cc != null) { this.cc.activityTestInvokeId = null; } } @Override public void onInvokeTimeout(CAPDialog capDialog, Long invokeId) { if (currentCapDialog != null && this.cc != null) { if (this.cc.activityTestInvokeId == invokeId) { // activityTest failure try { currentCapDialog.close(true); } catch (CAPException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } @Override public void onErrorComponent(CAPDialog capDialog, Long invokeId, CAPErrorMessage capErrorMessage) { // TODO Auto-generated method stub } @Override public void onRejectComponent(CAPDialog capDialog, Long invokeId, Problem problem) { // TODO Auto-generated method stub }
135
CAP
@Override public void onProviderErrorComponent(CAPDialog capDialog, Long invokeId, CAPComponentErrorReason providerError) { // TODO Auto-generated method stub } @Override public void onCAPMessage(CAPMessage capMessage) { // TODO Auto-generated method stub } @Override public void onRequestReportBCSMEventRequest(RequestReportBCSMEventRequest ind) { // TODO Auto-generated method stub } @Override public void onApplyChargingRequest(ApplyChargingRequest ind) { // TODO Auto-generated method stub } @Override public void onContinueRequest(ContinueRequest ind) { // TODO Auto-generated method stub } @Override public void onApplyChargingReportRequest(ApplyChargingReportRequest ind) { // TODO Auto-generated method stub } @Override public void onReleaseCallRequest(ReleaseCallRequest ind) { // TODO Auto-generated method stub } @Override public void onConnectRequest(ConnectRequest ind) { // TODO Auto-generated method stub } @Override public void onCallInformationRequestRequest(CallInformationRequestRequest ind) { // TODO Auto-generated method stub } @Override public void onCallInformationReportRequest(CallInformationReportRequest ind) { // TODO Auto-generated method stub
136
CAP
} @Override public void onActivityTestRequest(ActivityTestRequest ind) { // TODO Auto-generated method stub } @Override public void onAssistRequestInstructionsRequest(AssistRequestInstructionsRequest ind) { // TODO Auto-generated method stub } @Override public void onEstablishTemporaryConnectionRequest(EstablishTemporaryConnectionRequest ind) { // TODO Auto-generated method stub } @Override public void onDisconnectForwardConnectionRequest(DisconnectForwardConnectionRequest ind) { // TODO Auto-generated method stub } @Override public void onConnectToResourceRequest(ConnectToResourceRequest ind) { // TODO Auto-generated method stub } @Override public void onResetTimerRequest(ResetTimerRequest ind) { // TODO Auto-generated method stub } @Override public void onFurnishChargingInformationRequest(FurnishChargingInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onSendChargingInformationRequest(SendChargingInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onSpecializedResourceReportRequest(SpecializedResourceReportRequest ind) { // TODO Auto-generated method stub } @Override public void onPlayAnnouncementRequest(PlayAnnouncementRequest ind) { // TODO Auto-generated method stub
137
CAP
} @Override public void onPromptAndCollectUserInformationRequest(PromptAndCollectUserInformationRequest ind) { // TODO Auto-generated method stub } @Override public void onPromptAndCollectUserInformationResponse(PromptAndCollectUserInformationResponse ind) { // TODO Auto-generated method stub } @Override public void onCancelRequest(CancelRequest ind) { // TODO Auto-generated method stub } @Override public void onDialogRequest(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) { // TODO Auto-generated method stub } @Override public void onDialogAccept(CAPDialog capDialog, CAPGprsReferenceNumber capGprsReferenceNumber) { // TODO Auto-generated method stub } @Override public void onDialogUserAbort(CAPDialog capDialog, CAPGeneralAbortReason generalReason, CAPUserAbortReason userReason) { // TODO Auto-generated method stub } @Override public void onDialogProviderAbort(CAPDialog capDialog, PAbortCauseType abortCause) { // TODO Auto-generated method stub } @Override public void onDialogClose(CAPDialog capDialog) { // TODO Auto-generated method stub } @Override public void onDialogRelease(CAPDialog capDialog) { this.currentCapDialog = null; this.cc = null; } @Override
138
CAP
public void onDialogNotice(CAPDialog capDialog, CAPNoticeProblemDiagnostic noticeProblemDiagnostic) { // TODO Auto-generated method stub } private enum Step { initialDPRecieved, answered, disconnected; } private class CallContent { public Step step; public InitialDPRequest idp; public ArrayList<EventReportBCSMRequest> eventList = new ArrayList<EventReportBCSMRequest>(); public Long activityTestInvokeId; } }
139
Go to: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archivedownloads-java-plat-419418.html#7657-jmx-1.2.1-othJPR&usg=AFQjCNGOqUaCB1ULVG7cMULio9u70MKocA Select "Java Management Extension (JMX) 1.2.1" Press "Accept License Agreement" Download jmx-1_2_1-ri.zip file Extract lib/jmxtools:jar You can just put this file as ".m2/repository/com/sun/jdmk/jmxtools/1.2.1/jmxtools-1.2.1.jar" file into maven repository (if ".m2/repository" is a root of this repository) or register it. After compiling Simulator binaries can be found in the folder simulator/bootstrap/target/simulatorss7. Use "run.bat" or "run.sh" command file for running Simulator (from a folder simulator/ bootstrap/target/simulator-ss7/bin). You can run several instances of Simulator from one folder. Each of this instances can have its own configuration options. Configuration options are saved into a xml configuration file. Each running instance has its own name (called "host name") and the name of configuration file depends on this host name. For example if the host name is "a1", the name of the configuration file will be "a1_simulator.xml". Each running Simulator instance must have different host name in order to each running Simulator instance can have different options. Before running a test all layers must be configured. After test running a user can perform some actions depending on the test. Results of a test are emitted as "notifications". Notifications are displayed in GUI interface of Simulator and Jconsole application (also GUI interface) and also are written into a file "<host name>.log" (for example "a1.log") and into a console. You can run and manage SS7 Simulator locally or remotely. If you are running Simulator locally you are using a GUI interface. If you are running Simulator remotely you can use RMI access (via a GUI interface) and HTML interface (using a HTML Browser).
140
SS7 Simulator
The GUI application form "Connecting to a testerHost ..." will appear. You have to fill "Host name" field (if it is empty), select "Create a local testerHost" option and press "Start" button. The local Simulator host will be run.
141
SS7 Simulator
142
SS7 Simulator
143
SS7 Simulator
or
Options "-n" (or "--name=") defines a host name ("a1"). Options "-r" (or "--rmi=") defines a port for rmi requests listerning (9999). Options "-t" (or "--http=") defines a port for html requests listerning (8001). You can use only rmi connector or only http connector or both.
run gui
After launching we should select the option "Connect to the existing testerHost via JMX" and in the default RMI connection string replace "localhost" with the proper IP address of the tester host computer and the "9999" with the proper RMI port (the port from option "-r" or "--rmi=") (if needed). After connecting the management will be the same as if the application is run locally (see Section 11.1.1, Running SS7 Simulator locally ).
144
SS7 Simulator
we can use any html browser. Use "http://<IP address>:<port>" as an URL. The port is defined in "-t" or "--http=" options.
145
SS7 Simulator
146
SS7 Simulator
11.1.3.1. SCCP
SCCP layer supports processing messages in two modes:
Route on DPC and SSN mode Route on GlobalTitle mode For both modes we need to set the following options:
Remote SPC Local SPC Network indicator Remote SSN Local SSN When starting SCCP layer creates:
Mtp3ServiceAccessPoint (using Local SPC and Network indicator) with the single Mtp3Destination (Remote SPC, all SLS's) RemoteSpc (using Remote SPC) RemoteSsn (using Remote SPC and Remote SSN) For "Route on GlobalTitle" mode there are following extra options:
GlobalTitle type ("Nature of address indicator only", "Translation type only", "Translation type, numbering plan and encoding scheme", "Translation type, numbering plan, encoding scheme and NOA ind"), the last choice is default AddressNature NumberingPlan Translation type (those four options are used both for CalledPartyAddress, CallingPartyAddress and routing rules) CallingPartyAddress digits Extra local addresses (used for routing rules). We can define here several addresses separated by comma. "?" and "*" characters can also be used here.
147
SS7 Simulator
If "Route on GlobalTitle" mode is used, several rules for routing are created when SCCP layer starting. Addresses that are equal CallingPartyAddress or Extra local addresses are routed to the local SCCP user. All other addresses are routed to the Remote SPC/Remote SSN. SCCP layer provide creating CalledPartyAddress and CallingPartyAddress for upper layers and test cases. When "Route on DPC and SSN" mode these are ROUTING_BASED_ON_DPC_AND_SSN with no GlobalTitle, pc=Local SPC (for CallingPartyAddress) or Remote SSN (for CalledPartyAddress), SSN=Local SSN and Remote SSN accordingly. When "Route on GlobalTitle" mode ROUTING_BASED_ON_GT is used:
CallingPartyAddress is created based on CallingPartyAddress digits and Local SSN. CalledPartyAddress is created using digits and SSN that are supplied by upper levels or test cases.
Sending a ProcessUnstructiredSs response / UnstructiredSs request in automatic or manual modes. Ussd Client must initiate a dialog using ProcessUnstructiredSs request. Manually sending an UnstructuredSsNotify.
148
SS7 Simulator
149
SS7 Simulator
value is 10). The more dialogs is defined the more messages per second will be sent. Msisdn, data coding schema and alerting pattern values should be also configured before test starting. For the auto mode we recomment to check the option "One notification for 100 dialogs" for preventing too many notifications when load testing. You can send ProcessUnstructuredSs request and UnstructuredSs response manually by inserting a message text and pressing buttons. You can not send a new ProcessUnstructiredSs request till the response for previos request has been received (or till dialog timeout). You can also manually close the current dialog by pressing "Close current dialog" button.
150
SS7 Simulator
Send sendRoutingInfoForSM to the HLR, receive the response and send mt-forwardSM using data from the first request Receive mo-forwardSM request from VLR and display the received message We need to set the following options to SMS server: AddressNature and NumberingPlan for AddressString creation TypeOfNumber and NumberingPlanIdentification SMS tpdu addresses MAP protocol version (1, 2 or 3) (version 3 is default) Character set for SMS message encoding (GSM7 or UCS2) Origination Service center address string (this address must be equal the SCCP layer CallingPartyAddress digits) HLR and VLR SSN values (default values are 8 and 6) Remark: if you want to use SMS Server and SMS Client for sending SMS to each other: set HLR SSN at SMS Server the equal value that VLR SSN (8 in our case)
151
SS7 Simulator
For sending sendRoutingInfoForSM ("Send SRIForSM" button) we should set "Destination ISDN number" For sending sendRoutingInfoForSM and then mt-forwardSM ("Send SRIForSM + MtForwardSM" button) we should set "Message text", "Destination ISDN number" and "Origination ISDN number" For sending mt-forwardSM only ("Send MtForwardSM" button) we should set "Message text", "IMSI", "VLR number" and "Origination ISDN number"
Receive sendRoutingInfoForSM from SMSC and send as a response predefined IMSI and VLR number Receive mt-forwardSM from SMSC and display the received message Send mo-forwardSM to the SMSC We need to set the following options to SMS client:
AddressNature and NumberingPlan for AddressString creation TypeOfNumber and NumberingPlanIdentification SMS tpdu addresses MAP protocol version (1, 2 or 3) (version 3 is default) Character set for SMS message encoding (GSM7 or UCS2) Destination Service center address string (this address must be equal the SCCP layer CallingPartyAddress digits) SMSC SSN value (default value is 8) IMSI and VLR addresses values that will be used when responding on sendRoutingInfoForSM
152
SS7 Simulator
For sending mo-forwardSM ("Send MoForwardSM" button) we should set "Message text", "Destination ISDN number" and "Origination ISDN number" When recieving sendRoutingInfoForSM client automatically generate a response with preconfigured IMSI and VLR address
153
At this point in time, it is possible to run most Mobicents servers, such as the JAIN SLEE, using a Java 6 JRE or JDK. Be aware, however, that presently the XML Document Management Server does not run on Java 6. We suggest checking the Mobicents web site, forums or discussion pages if you need to inquire about the status of running the XML Document Management Server with Java 6.
154
Java Development Kit (JDK): Installing, Configuring and Running system), read and agree to the Java Development Kit 5.0 License Agreement, and proceed to the download page. The Sun website will present two download alternatives to you: one is an RPM inside a selfextracting file (for example, jdk-1_5_0_16-linux-i586-rpm.bin), and the other is merely a selfextracting file (e.g. jdk-1_5_0_16-linux-i586.bin). If you are installing the JDK on Red Hat Enterprise Linux, Fedora, or another RPM-based Linux system, we suggest that you download the self-extracting file containing the RPM package, which will set up and use the SysV service scripts in addition to installing the JDK. We also suggest installing the self-extracting RPM file if you will be running Mobicents in a production environment. Installing. The following procedures detail how to install the Java Development Kit on both Linux and Windows.
You Installed Using the Non-RPM Installer, but Want the SysV Service Scripts
If you download the non-RPM self-extracting file (and installed it), and you are running on an RPM-based system, you can still set up the SysV service scripts by downloading and installing one of the -compat packages from the JPackage project. Remember to download the -compat package which corresponds correctly to the minor release number of the JDK you installed. The compat packages are available from ftp://jpackage.hmdc.harvard.edu/ JPackage/1.7/generic/RPMS.non-free/.
Important
You do not need to install a -compat package in addition to the JDK if you installed the self-extracting RPM file! The -compat package merely performs the same SysV service script set up that the RPM version of the JDK installer does.
155
Java Development Kit (JDK): Installing, Configuring and Running Configuring. Configuring your system for the JDK consists in two tasks: setting the JAVA_HOME environment variable, and ensuring that the system is using the proper JDK (or JRE) using the alternatives command. Setting JAVA_HOME usually overrides the values for java, javac and java_sdk_1.5.0 in alternatives, but we will set them all just to be safe and consistent.
Setting the JAVA_HOME Environment Variable on Generic Linux After installing the JDK, you must ensure that the JAVA_HOME environment variable exists and points to the location of your JDK installation. Setting the JAVA_HOME Environment Variable on Linux. You can determine whether JAVA_HOME is set on your system by echoing it on the command line:
~]$ echo $JAVA_HOME
If JAVA_HOME is not set already, then you must set its value to the location of the JDK installation on your system. You can do this by adding two lines to your personal ~/.bashrc configuration file. Open ~/.bashrc (or create it if it doesn't exist) and add a line similar to the following one anywhere inside the file:
export JAVA_HOME="/usr/lib/jvm/jdk1.5.0_<version>"
You should also set this environment variable for any other users who will be running Mobicents (any environment variables exported from ~/.bashrc files are local to that user). Setting java, javac and java_sdk_1.5.0 Using the alternatives command Selecting the Correct System JVM on Linux using alternatives . On systems with the alternatives command, including Red Hat Enterprise Linux and Fedora, you can easily choose which JDK (or JRE) installation you wish to use, as well as which java and javac executables should be run when called. As the root user, call /usr/sbin/alternatives with the --config java option to select between JDKs and JREs installed on your system:
root@localhost ~]$ /usr/sbin/alternatives --config java There are 3 programs which provide 'java'. Selection Command
156
Java Development Kit (JDK): Installing, Configuring and Running In our case, we want to use the Sun JDK, version 5, that we downloaded and installed, to run the java executable. In the alternatives information printout above, a plus (+) next to a number indicates the one currently being used. As per alternatives' instructions, pressing Enter will simply keep the current JVM, or you can enter the number corresponding to the JVM you would prefer to use. Repeat the procedure above for the javac command and the java_sdk_1.5.0 environment variable, as the root user:
~]$ /usr/sbin/alternatives --config javac
Setting the JAVA_HOME Environment Variable on Windows For information on how to set environment variables in Windows, refer to http:// support.microsoft.com/kb/931715. Testing. Finally, to make sure that you are using the correct JDK or Java version (5 or higher), and that the java executable is in your PATH, run the java -version command in the terminal from your home directory:
~]$ java -version java version "1.5.0_16" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b03) Java HotSpot(TM) Client VM (build 1.5.0_16-b03, mixed mode, sharing)
Uninstalling. There is usually no reason (other than space concerns) to remove a particular JDK from your system, given that you can switch between JDKs and JREs easily using alternatives, and/or by setting JAVA_HOME. Uninstalling the JDK on Linux. On RPM-based systems, you can uninstall the JDK using the yum remove <jdk_rpm_name> command. Uninstalling the JDK on Windows. On Windows systems, check the JDK entry in the Start menu for an uninstall command, or use Add/Remove Programs.
157
The Mobicents Platform and most Mobicents servers are built on top of the JBoss Application Server (JBoss Application Server). When the Mobicents Platform or Mobicents servers are built from source, then JBOSS_HOME must be set, because the Mobicents files are installed into (or over top of if you prefer) a clean JBoss Application Server installation, and the build process assumes that the location pointed to by the JBOSS_HOME environment variable at the time of building is the JBoss Application Server installation into which you want it to install the Mobicents files. This guide does not detail building the Mobicents Platform or any Mobicents servers from source. It is nevertheless useful to understand the role played by JBoss AS and JBOSS_HOME in the Mobicents ecosystem. The immediately-following section considers whether you need to set JBOSS_HOME at all and, if so, when. The subsequent sections detail how to set JBOSS_HOME on Unix and Windows
Important
Even if you fall into the category below of not needing to set JBOSS_HOME, you may want to for various reasons anyway. Also, even if you are instructed that you do not need to set JBOSS_HOME, it is good practice nonetheless to check and make sure that JBOSS_HOME actually isn't set or defined on your system for some reason. This can save you both time and frustration.
158
Setting the JBOSS_HOME Environment Variable ...you have installed a Mobicents server binary distribution which bundles JBoss Application Server.
1.
Open the ~/.bashrc startup script, which is a hidden file in your home directory, in a text editor, and insert the following line on its own line while substituting for the actual install location on your system:
export JBOSS_HOME="/home/<username>/<path>/<to>/<install_directory>"
2. 3.
Save and close the .bashrc startup script. You should source the .bashrc script to force your change to take effect, so that JBOSS_HOME 1 becomes set for the current session .
~]$ source ~/.bashrc
4.
Finally, ensure that JBOSS_HOME is set in the current session, and actually points to the correct location:
Note that any other terminals which were opened prior to your having altered .bashrc will need to source ~/.bashrc as well should they require access to JBOSS_HOME.
159
Note
The command line usage below is based upon a binary installation of the Mobicents Platform. In this sample output, JBOSS_HOME has been set correctly to the topmost_directory of the Mobicents installation. Note that if you are installing one of the standalone Mobicents servers (with JBoss AS bundled!), then JBOSS_HOME would point to the topmost_directory of your server installation.
Setting the JBOSS_HOME Environment Variable on Windows. The JBOSS_HOME environment variable must point to the directory which contains all of the files for the Mobicents Platform or individual Mobicents server that you installed. As another hint, this topmost directory contains a bin subdirectory. For information on how to set environment variables in recent versions of Windows, refer to http:// support.microsoft.com/kb/931715.
160
161
Index
F
feedback, ix
162