About the SMPP Resource Adaptor
The Short Message Peer-to-Peer Protocol (SMPP) resource adaptor provides support for writing SMPP services that can act in either a External Short Message Entity (ESME) or Message Center (MC) role.
It supports persistent "bound" connections to a Message Centre, in which the resource adaptor is responsible for all session-related logic (connecting, binding, etc.), as well as generic SMPP services, in which the service is responsible for managing the session.
When using service-managed sessions, services can function as ESME or MC nodes, or both (an RE or Routing Entity). The type of node is determined automatically when the service sends or receives its first PDUs in a session. For example, if a service creates a session and then sends an OUTBIND request, then this is MC behaviour so the node is treated as an MC from that point on, until the end of the session. Similarly if a node creates a session, and then sends a BIND_TRANSMITTER request then this is ESME behaviour. The node type determines what PDUs are allowed to be sent or received in a session. For example, an MC cannot send SUBMIT_SM requests because this is not allowed by the SMPP protocol.
When using bound connections, services may only function as ESME nodes. They cannot open or close SMPP sessions, or send or receive session-related requests.
Topics
How to configure general settings for a resource adaptor entity |
|
How to use profiles to configure bound sessions |
|
Events fired by the resource adaptor when messages are received |
|
The management beans which can be used to view the state of bound sessions |
Other documentation for the SMPP Resource Adaptor can be found on the SMPP Resource Adaptor product page.
Resource Adaptor Configuration
Resource adaptor configuration properties apply to when the resource adaptor is acting as a server and for service-managed client sessions. The only configuration properties used in bound mode are the two properties that reference the profiles (BoundSessionConfigurationProfileTable
and BoundSessionConfigurationProfileNames
), as well as SmppResponseReceivedTimeout
and SmppStateCheckingEnabled
. See Profile Configuration for information about configuration of bound sessions.
We do not recommend using service-managed client or server sessions and bound sessions in a single entity. So do not set both The resource adaptor will handle these cases but they are not supported for live production environments. |
Property Name | Type | Default | Comment |
---|---|---|---|
|
String |
Allows a different bind address (network address and port combination) to be specified for each node in a cluster. See note below. |
|
|
String |
Local IP address to listen on (empty = listen on all addresses). |
|
|
Integer |
2775 |
Local TCP port to listen on. |
|
Long |
30000 |
Timeout (in ms) for session init, an |
|
Long |
60000 |
Timeout (in ms) for link enquiry, an |
|
Long |
120000 |
Timeout (in ms) for session inactivity, an |
|
Long |
11000 |
Timeout (in ms) for receiving a response from the a peer, an |
|
Long |
10000 |
Timeout (in ms) for a service to send a response to an incoming request, resource adaptor will send a |
|
Boolean |
true |
Determines whether stack checks for correct session state when sending/receiving messages. |
|
String |
The profile table containing bound session configuration profiles. |
|
|
String |
The names of the bound session configuration profiles. |
Notes
SmppSessionInitTimeout
, SmppEnquireLinkTimeout
and SmppInactivityTimeout
These properties control timers in the resource adaptor and fire a SLEE event when the timeout elapses.
The resource adaptor does not send any messages or perform any other action as a result of these timeouts elapsing, other than to fire an event so the service managing the session can take some action. The exception to this is that if the inactivity timeout fires for a second time, the resource adaptor assumes the service has not closed the connection as it supposed to, and closes it itself. |
SmppBindAddresses
, SmppListenAddress
and SmppListenPort
These properties are used to specify an address and port for a TCP listen socket.
We recommend always using SmppBindAddresses . SmppListenAddress and SmppListenPort exist for compatibility with deployment scripts that used a previous version of the resource adaptor. |
The SmppBindAddresses
property allows a different bind address (network address and port combination) to be specified for each node in a cluster.
It is a string property with the format
{node}address:port,{node}address:port,...
This allows entities running on two nodes on the same host to use different ports, for example:
{101}0.0.0.0:2775,{102}0.0.0.0:2776
It also allows entities running on different hosts to specify an interface to listen on that is specific to each host, for example:
{101}192.168.1.100:2775,{102}192.168.1.101:2775
If SmppBindAddresses is empty, then SmppListenAddress and SmppListenPort will be used, and the same bind address will be used on all nodes. This configuration is not recommended. |
Active Reconfiguration
The resource adaptor supports active reconfiguration. You can update most configuration properties without having to deactivate the resource adaptor entity. The only properties that cannot be updated while the entity is active are SmppListenAddress
, SmppListenPort
and SmppBindAddresses
.
When BoundSessionConfigurationProfileNames is updated, the resource adaptor will compare the new value with the previous one to determine which sessions need to be stopped, started or reconfigured. |
Profile Configuration
Bound sessions are configured using SLEE profiles. You must create one profile per bound session peer.
Information about more general resource adaptor configuration properties is in resource adaptor configuration.
Profile Attribute | Type | Default | Comment |
---|---|---|---|
|
String |
localhost |
IP address or hostname of SMSC to connect to |
|
Integer |
2775 |
TCP port to connect to. |
|
String |
TRX |
Type of bind request to use, must be one of TX, RX or TRX (transmitter, receiver or transceiver). |
|
String |
null |
Value for system_id in bind request. Must be 15 characters or less. |
|
String |
null |
Value for password in bind request. Must be 8 characters or less. |
|
String |
50 |
Value for interface_version in bind request. Must be 2-digit hex value, "34" for SMPPv3.4 or "50" for SMPPv5.0 |
|
String |
null |
Optional value for system_type in bind request. |
|
String |
null |
Optional ESME address/range for bind request in the form: ton:npi:address, eg. 1:1:123456 |
|
Integer |
5000 |
Interval (in ms) between re-bind attempts. Must be greater than 100. |
|
Integer |
5000 |
Interval (in ms) between ENQUIRE_LINK requests. The resource adaptor periodically sends these to check the session is still active. Set to 0 to disable (not recommended). If set, must be greater than 100. |
|
Integer |
15000 |
If no transactions have completed (including ENQUIRE_LINKs) after this time, the session will be closed. Set to 0 to disable (not recommended). If set, must be greater than 100. |
|
Integer |
0 |
A maximum number of outgoing requests that may be outstanding on this session. 0 means no limit. |
|
String |
ESME_RINVSRCADR, ESME_RBINDFAIL, ESME_RINVPASWD, ESME_RINVSYSID, ESME_RINVSRCTON, ESME_RINVSRCNPI, ESME_RINVSYSTYP |
Bind failure codes that are considered permanent - the RA will not attempt to rebind. May be empty. |
EnquireLinkInterval/InactivityTimeout
Certain considerations must be taken into account when specifying these values.
ENQUIRE_LINK
request messages are sent if no message has been received in the time specified by EnquireLinkInterval
.
The ultimate determination of when to disconnect and reconnect is made according to the value of InactivityTimeout
. If no messages have been received (including ENQUIRE_LINK
or ENQUIRE_LINK_RESP
) within this time, then the session is closed.
So it is important that the value of InactivityTimeout
be sufficiently larger than EnquireLinkInterval
for the desired number of ENQUIRE_LINK
attempts to have occurred before the connection is closed.
For example, for the resource adaptor to close the connection after 6 seconds, and have a single ENQUIRE_LINK
attempt before that, you might set:
EnquireLinkInterval=5000 InactivityTimeout=6000
To close the connection after 8 seconds, and have two ENQUIRE_LINK
attempts before that, you might use:
EnquireLinkInterval=3500 InactivityTimeout=8000
PermanentBindFailureCodes
This configuration property is specified as a comma-delimited list, and may contain status codes or their symbolic names as defined in the SMPP specification.
The default value is: ESME_RINVSRCADR, ESME_RBINDFAIL, ESME_RINVPASWD, ESME_RINVSYSID, ESME_RINVSRCTON, ESME_RINVSRCNPI, ESME_RINVSYSTYP
.
Updating Configuration Profiles
Changes to profiles are not automatically picked up by the resource adaptor. The administrator must trigger a configuration reload for the profiles to be reloaded. This applies even when resource adaptor entities are deactivated and reactivated — the configuration profiles will not be reloaded unless triggered by the administrator. |
A configuration reload can be triggered in the Rhino command line console:
updateraentityconfigproperties <entity-name>
When using the Rhino Element Manager, you can edit and save an unchanged resource adaptor entity configuration to achieve the same result.
MBeans
The resource adaptor entity will register two types of MBean: SmppMXBean
and SmppBoundSessionMXBean
.
SmppMXBean
There is one of these per entity. It is registered when the entity is created.
It has attributes for the number of bound sessions, the internal state and links to the bound session MBeans.
The internal state refers to whether the entity regards itself as active and functioning (which is independent of the SLEE container’s view of that state). The possible states are INACTIVE, INITIALISING, INITIALISATION_FAILED, ACTIVE and STOPPING.
SmppBoundSessionMXBean
There is one of these per bound session. It is registered when a bound session name is read from the BoundSessionConfigurationProfileNames
configuration property, and deregistered if the bound session is removed from that list.
It has attributes for the bound session name, state, and a link to the entity.
It also has an operation to force an immediate reconnect.
The bound session states are: NEW, DISCONNECTED, CONNECTED, BOUND, RECONNECTING and UNBOUND.
Events
Each type of SMPP Protocol Data Unit (PDU) is a separate SLEE event type. In addition, there are several more event types that represent session opening/closing and communication error events (timeouts, I/O errors). For the complete list of event names see below.
The SMPP RA does not emit a SMPP_TIMEOUT_RESPONSE_SENT
event, even though this event type is defined by com.opencloud.slee.resources.smpp.SmppErrorEvent
. This event is handled internally by the RA, as it means that the application (SBB) has not sent a response to an incoming request within the stack’s ResponseSentTimeout. This may indicate that there was some error in the SLEE during event processing. The RA sends a GENERIC_NACK PDU with status ESME_RSYSERR in this case. The RA also sends a GENERIC_NACK if the event was processed successfully but not handled by any SBBs, or if the event processing failed for some other reason.
Bound sessions
The resource adaptor will not emit any bind request or response events since the session is already bound. The events SMPP_TIMEOUT_SESSION_INIT
, SMPP_TIMEOUT_INACTIVITY
, SMPP_TIMEOUT_ENQUIRE_LINK
, SMPP_NEW_SESSION
and SMPP_END_SESSION
are not emitted by this resource adaptor since these timeouts are not relevant to SBBs in this mode.
The SMPP_TIMEOUT_RESPONSE_RECEIVED
event will be emitted if a response to a request is not received in time (see SmppResponseReceivedTimeout
in the configuration properties table below).
SMPP Session Events
Class: com.opencloud.slee.resources.smpp.SmppSessionEvent
-
com.opencloud.slee.resources.smpp.SMPP_NEW_SESSION
-
com.opencloud.slee.resources.smpp.SMPP_END_SESSION
SMPP Request Events
Class: com.opencloud.slee.resources.smpp.SmppRequestEvent
-
com.opencloud.slee.resources.smpp.pdu.ALERT_NOTIFICATION
-
com.opencloud.slee.resources.smpp.pdu.BIND_TRANSMITTER
-
com.opencloud.slee.resources.smpp.pdu.BIND_RECEIVER
-
com.opencloud.slee.resources.smpp.pdu.BIND_TRANSCEIVER
-
com.opencloud.slee.resources.smpp.pdu.DELIVER_SM
-
com.opencloud.slee.resources.smpp.pdu.SUBMIT_SM
-
com.opencloud.slee.resources.smpp.pdu.DATA_SM
-
com.opencloud.slee.resources.smpp.pdu.CANCEL_SM
-
com.opencloud.slee.resources.smpp.pdu.QUERY_SM
-
com.opencloud.slee.resources.smpp.pdu.REPLACE_SM
-
com.opencloud.slee.resources.smpp.pdu.ENQUIRE_LINK
-
com.opencloud.slee.resources.smpp.pdu.OUTBIND
-
com.opencloud.slee.resources.smpp.pdu.UNBIND
SMPP Response Events
Class: com.opencloud.slee.resources.smpp.SmppResponseEvent
-
com.opencloud.slee.resources.smpp.pdu.GENERIC_NACK
-
com.opencloud.slee.resources.smpp.pdu.BIND_TRANSMITTER_RESP
-
com.opencloud.slee.resources.smpp.pdu.BIND_RECEIVER_RESP
-
com.opencloud.slee.resources.smpp.pdu.BIND_TRANSCEIVER_RESP
-
com.opencloud.slee.resources.smpp.pdu.DELIVER_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.SUBMIT_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.DATA_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.CANCEL_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.QUERY_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.REPLACE_SM_RESP
-
com.opencloud.slee.resources.smpp.pdu.ENQUIRE_LINK_RESP
-
com.opencloud.slee.resources.smpp.pdu.UNBIND_RESP
SMPP Error Events
Class: com.opencloud.slee.resources.smpp.SmppErrorEvent
-
com.opencloud.slee.resources.smpp.SMPP_ERROR
-
com.opencloud.slee.resources.smpp.SMPP_TIMEOUT_SESSION_INIT
-
com.opencloud.slee.resources.smpp.SMPP_TIMEOUT_ENQUIRE_LINK
-
com.opencloud.slee.resources.smpp.SMPP_TIMEOUT_INACTIVITY
-
com.opencloud.slee.resources.smpp.SMPP_TIMEOUT_RESPONSE_RECEIVED
-
com.opencloud.slee.resources.smpp.SMPP_TIMEOUT_RESPONSE_SENT
Session State Diagram
The state diagram shows the states and transitions that an SMPP Session can go through.
Note that for brevity each type of bind request has not been shown, instead BIND_xxx
is used to denote BIND_TRANSMITTER
, BIND_RECEIVER
and BIND_TRANSCEIVER
.
Note that, in any of the above states, either node closing the session will cause a transition to the INVALID
state.