AxSms.SmppServer
Introduction
Skip to properties and methods
The SmppServer object can be used to accept incoming SMPP connections, effectively setting up you own SMSC. The SMPP protocol supports sending and receive SMS messages using only an internet connection. It’s primarily used for high volumes / high performance applications.
The SmppServer implementation is completely asynchronous for maximum performance. After starting the SmppServer a separate thread will accept incoming connections on the specified port. For each incoming connection a dedicated worker thread will be started to handle the client connection, this is the SmppSession object. The session objects are used to exchange SMS messages with connected clients.
Send and receive SMS messages from multiple clients using SmppServer
Send and receive SMS messages to/from multiple clients simultaneously using the SmppServer object
Set objSmppServer = CreateObject("AxSms.SmppServer") ' Create the SMPP server object
Set objConstants = CreateObject("AxSms.Constants") ' Create the SMS constants object
' Show version information
WScript.Echo "SMS Component" & objSmppServer.Version & "; Build " & _
objSmppServer.Build & "; Module " & objSmppServer.Module
WScript.Echo "License Status: " & objSmppServer.LicenseStatus & vbCrLf
' Set a logfile and start the server on both IPv6 and IPv4
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775, objConstants.SMPP_IPVERSION_BOTH
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error while starting SMPP server: " & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
WScript.Echo "SMPP server started..."
While objSmppServer.IsStarted
Set objSmppSession = objSmppServer.GetFirstSession
While objSmppServer.LastError = 0
' Accept all sessions that request a bind
If objSmppSession.ConnectionState = objConstants.SMPP_SESSIONSTATE_BINDING Then
WScript.Echo "Client IP: " & objSmppSession.Ip & ":" & objSmppSession.Port
WScript.Echo "SystemId: " & objSmppSession.SystemId
WScript.Echo "AddressRange: " & objSmppSession.AddressRange
objSmppSession.LogFile = objSmppSession.SystemId & ".log"
objSmppSession.RespondToBind objConstants.SMPP_ESME_ROK
End If
If objSmppSession.ConnectionState = objConstants.SMPP_SESSIONSTATE_BOUND_TRX Then
' Receive incoming messages
Set objMessage = objSmppSession.ReceiveSubmitSms
While objSmppSession.LastError = 0
WScript.Echo "Receive SMS from: " & objSmppSession.SystemId & "; to: " & _
objMessage.ToAddress & "; suggested reference: " & objMessage.Reference
' Accept the incoming message with the suggested message reference
objSmppSession.RespondToSubmitSms objMessage
If objSmppSession.LastError <> 0 Then
WScript.Echo "Error while responding: " & _
objSmppSession.GetErrorDescription(objSmppSession.LastError)
WScript.Quit 1
End If
' Send a successful delivery report for the incoming message
objMessage.SmppStatus = objConstants.SMPP_MESSAGESTATE_DELIVERED
objSmppSession.DeliverReport objMessage
If objSmppSession.LastError <> 0 Then
WScript.Echo "Error while sending delivery report: " & _
objSmppSession.GetErrorDescription(objSmppSession.LastError)
WScript.Quit 1
End If
Set objMessage = objSmppSession.ReceiveSubmitSms
WEnd
' Deliver a new message to the client
Set objMessage = CreateObject("AxSms.Message")
objMessage.ToAddress = "+31122334455"
objMessage.FromAddress = "+35544332211"
objMessage.Body = "Hello from the Auron Gateway !"
objMessage.UserTag = 1 ' To identify this message when the client responds
objSmppSession.DeliverSms objMessage
If objSmppSession.LastError <> 0 Then
WScript.Echo "Error while delivering: " & _
objSmppSession.GetErrorDescription(objSmppSession.LastError)
WScript.Quit 1
End If
' Check if the client accepted any messages
Set objMessage = objSmppSession.ReceiveDeliverResponse
While objSmppSession.LastError = 0
WScript.Echo "Response: " & objMessage.SmppCommandStatus & _
" for UserTag: " & objMessage.UserTag
Set objMessage = objSmppSession.ReceiveDeliverResponse
WEnd
End If
Set objSmppSession = objSmppServer.GetNextSession
WEnd
objSmppServer.Sleep 1000
WEnd
objSmppServer.Stop
How to run this example
Properties and Methods
Property | Type | Read/Write | Description |
Version | String | Read | Version number of the SMS Component |
Build | String | Read | Build number of the SMS Component |
Module | String | Read | Module name of the SMS Component |
LicenseStatus | String | Read | License Status |
LicenseKey | String | Read/Write | License Key |
LastError | Number | Read | Result of the last called method |
LogFile | String | Read/Write | The path to a logfile which can be used for troubleshooting |
CertificateStore | String | Read/Write | The certificate store used to find/search certificates |
ListenIpv4 | String | Read/Write | The IP address to listen on |
ListenIpv6 | String | Read/Write | The IPv6 address to listen on |
IsStarted | Boolean | Read | Whether the SMPP server is started and running |
LastReference | Number | Read/Write | The last suggested message reference |
MaxClosedSessions | Number | Read/Write | The maximum number of closed sessions to keep |
Method | Description |
Clear | Reset all properties to their default values |
SaveLicenseKey | Save the License Key in the registry |
GetErrorDescription | Get the description of the given error |
Sleep | Sleep for the specified number of milliseconds |
Start | Starts the SMPP server |
Stop | Stops the SMPP server |
GetFirstSession | Get first connected client session |
GetNextSession | Get next connected client session |
GetSession | Get the specified, connected, session |
GetClosedSession | Get a recently closed session |
FindFirstMyServerCertificate | Find first server certificate in ‘My’ store |
FindNextMyServerCertificate | Find next server certificate in ‘My’ store |
FindFirstLocalIpAddress | Find first local IP address |
FindNextLocalIpAddress | Find next local IP address |
Version property
Return the version number of the SMS Component
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
WScript.Echo "SMS Component Version " & objSmppServer.Version & "; Build " & _
objSmppServer.Build & "; Module " & objSmppServer.Module
WScript.Echo "License Status: " & objSmppServer.LicenseStatus & vbCrLf
...
Build property
Return the build number of the SMS Component.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
WScript.Echo "SMS Component Version " & objSmppServer.Version & "; Build " & _
objSmppServer.Build & "; Module " & objSmppServer.Module
WScript.Echo "License Status: " & objSmppServer.LicenseStatus & vbCrLf
...
Module property
Return the module name of the SMS Component.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
WScript.Echo "SMS Component Version " & objSmppServer.Version & "; Build " & _
objSmppServer.Build & "; Module " & objSmppServer.Module
WScript.Echo "License Status: " & objSmppServer.LicenseStatus & vbCrLf
...
LicenseStatus property
The status of your license. In case you have not licensed the product, the property holds the trial expiration date. For details, see Product Activation.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer") ' Create new instance
WScript.Echo "License Status: " & objSmppServer.LicenseStatus
WScript.Echo "License Key: " & objSmppServer.LicenseKey
LicenseKey property
A license key is required to unlock this component after the trial period has expired. Assign the LicenseKey property every time a new instance of this component is created (see code below). Alternatively, the LicenseKey property can be set automatically. This requires the license key to be stored in the registry. For details, see Product Activation.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer") ' Create new instance
objSmppServer.LicenseKey = "XXXXX-XXXXX-XXXXX" ' Assign your license key
WScript.Echo "LicenseKey: " & objSmppServer.LicenseKey
LastError property
Completion code of the last called method. To find the error description of a given error code, go to the online error codes codes page.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
LogFile property
By default, LogFile holds an empty string and nothing is logged. If a valid file name is assigned to it, the SMS Component will write debug information to this file. Output data is written at the end of the file, the file is not cleared.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
CertificateStore property
Set this property to the certificate store that should be searched when finding a security certificate. The SMPP Server always searches in the ‘My’ location for certificates that have a ‘Server’ purpose. The MMC (Microsoft Management Console) snap-in will have the ‘My’ location listed as ‘Personal’.
This property is used when searching for available certificates as well as when starting a secure SMPP Server connection.
Set to one of the constants found here.
By default this is set to search in the current user store.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
objSmppServer.CertificateStore = objConstants.SMPP_CERTIFICATESTORE_CURRENTUSER
WScript.Echo objSmppServer.FindFirstMyServerCertificate
While objSmppServer.LastError = 0
WScript.Echo objSmppServer.FindNextMyServerCertificate
Wend
...
ListenIpv4 property
Set this property to the IP address the SMPP Server should listen on. Leave it empty to listen on ‘any’ (all) IPv4 addresses on the server.
This property is useful on servers with multiple network adapters as well as in testing and development situations. For instance: to prevent a connection from a remote PC set this property to ‘127.0.0.1’.
By default this property is set to an empty string.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
' Only accept local connections
objSmppServer.ListenIpv4 = "127.0.0.1"
objSmppServer.ListenIpv6 = "::1"
objSmppServer.Start 2775, objConstants.SMPP_IPVERSION_BOTH
...
ListenIpv6 property
Set this property to the IP address the SMPP Server should listen on. Leave it empty to listen on ‘any’ (all) IPv6 addresses on the server.
This property is useful on servers with multiple network adapters as well as in testing and development situations. For instance: to prevent a connection from a remote PC set this property to ‘::1’.
By default this property is set to an empty string.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
' Only accept local connections
objSmppServer.ListenIpv4 = "127.0.0.1"
objSmppServer.ListenIpv6 = "::1"
objSmppServer.Start 2775, objConstants.SMPP_IPVERSION_BOTH
...
IsStarted property
If the SMPP server is started and running this property returns ‘True’. If the server is stopped or not started yet, this property returns ‘False’.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
WScript.Echo "SMPP server started: " & objSmppServer.IsStarted
...
LastReference property
Every time a client submits a message to the SMPP server the SMPP server suggests message reference to return to the client. This message reference is an 8 digit hexadecimal number that is incremented for every message.
The message reference should uniquely identify an SMS message on the server.
When the message is received through the ReceiveSubmitSms method the suggested message reference is already set in the Reference property. This property can changed to suggest a different reference. The reference will be effective when calling RespondToSubmitSms.
Use this property to set a reference offset before starting or restarting the server to make sure no duplicate message references are issued. Store it regularly to keep track of the current last used message reference.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.LastReference = lLastReference + lRestartOffset
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
MaxClosedSessions property
After a SmppSession is closed a reference is kept in the closed sessions list. Recently closed sessions can be accessed using GetClosedSession.
By default this value is set to 100.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.LastReference = lLastReference + lRestartOffset
objSmppServer.MaxClosedSessions = 1000
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
Clear method
This method resets all properties to their default values.
Parameters:
- None
Return value:
Always 0.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
....
objSmppServer.Clear
...
SaveLicenseKey method
Description:
Use SaveLicenseKey to store the license key permanently in the registry. When a license key is saved, it is restored automatically every time a new instance of the object (‘SmppServer’) is created. It is not recommended to save the license key if you distribute the component with your own software, because the key can be easily used by others.
Parameters:
- None.
Return value:
Always 0. Check LastError property to see if the method was completed successfully.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer ") ' Create new instance
objSmppServer.LicenseKey = "XXXXX-XXXXX-XXXXX"
objSmppServer.SaveLicenseKey ' Save license key to registry
For more information, see Product Activation.
GetErrorDescription method
GetErrorDescription provides the error description of a given error code.
Parameters:
- The error code
Return value:
The error string.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
Sleep method
This method suspends the current thread for the specified number of milliseconds.
Parameters:
- Milliseconds to sleep
Return value:
Always 0.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
....
objSmppServer.Sleep 1000
...
Start method
Start the SMPP server on the specified port. A dedicated thread will be started in the background which listens on the specified port for incoming connections.
The server can be started, listening on IPv6, IPv4 or both. The both option is implemented as ‘dual stack’ which means that both an IPv4 and IPv6 socket are created. Use these constants to select the IP Version.
By default the server will listen on all IPv4 or IPv6 network adapters / IP addresses. Use either ListenIpv4 or ListenIpv6 to listen on a specific adapter / IP address.
The server can be started in secure mode by specifying the name of a server certificate. If no certificate is specified or if an empty string is specified the server will not be secured.
When started in secure mode the SMPP Server will only accept secure (TLS/SSL) connections. If a certificate is specified the server will search the ‘My’ (Personal) location in either the local machine or the current user store for the certificate. The certificate needs to have the ‘server’ purpose assigned to it. Access to the local machine store will need administrator privileges. The CertificateStore property determines if the ‘My’ store of the current user or the ‘My’ store of the local machine is searched.
For each connection an SmppSession object will be created. Use the GetFirstSession and GetNextSession methods to access these session and interact with them.
Parameters:
- Port number
- (Optional) IP version
- (Optional) Certificate
Return value:
Always 0.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775, objConstants.SMPP_IPVERSION_6, "gateway.auronsoftware.com"
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
Stop method
Stop the SMPP server.
Parameters:
- The error code
Return value:
The error string.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
objSmppServer.Logfile = "server.log"
objSmppServer.Start 2775
If objSmppServer.LastError <> 0 Then
WScript.Echo "Error: " & objSmppServer.LastError & "," & _
objSmppServer.GetErrorDescription(objSmppServer.LastError)
WScript.Quit 1
End If
...
objSmppServer.Stop
GetFirstSession method
This method returns the first connected session object. If no clients are connected nothing is returned and the LastError property is set.
Parameters:
- None
Return value:
An SmppSession object.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
Set objSmppSession = objSmppServer.GetFirstSession
While objSmppServer.LastError = 0
If objSmppSession.ConnectionState = objConstants.SMPP_SESSIONSTATE_BINDING Then
WScript.Echo "Client Ip: " & objSmppSession.Ip & ":" & objSmppSession.Port
WScript.Echo "SystemId: " & objSmppSession.SystemId
WScript.Echo "AddressRange: " & objSmppSession.AddressRange
objSmppSession.LogFile = objSmppSession.SystemId & ".log"
objSmppSession.RespondToBind objConstants.SMPP_ESME_ROK
End If
...
Set objSmppSession = objSmppServer.GetNextSession
WEnd
...
GetNextSession method
This method returns the next connected session object. If no clients are connected nothing is returned and the LastError property is set.
Parameters:
- None
Return value:
Always 0.
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
Set objSmppSession = objSmppServer.GetFirstSession
While objSmppServer.LastError = 0
If objSmppSession.ConnectionState = objConstants.SMPP_SESSIONSTATE_BINDING Then
WScript.Echo "Client Ip: " & objSmppSession.Ip & ":" & objSmppSession.Port
WScript.Echo "SystemId: " & objSmppSession.SystemId
WScript.Echo "AddressRange: " & objSmppSession.AddressRange
objSmppSession.LogFile = objSmppSession.SystemId & ".log"
objSmppSession.RespondToBind objConstants.SMPP_ESME_ROK
End If
...
Set objSmppSession = objSmppServer.GetNextSession
WEnd
...
GetSession method
This method returns the specified session object. If the specified session is no longer connected the LastError property is set.
Parameters:
- The session id of the session to return
Return value:
The specified session
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
...
Sub DeliverSms(SessionId, objSms)
Set objSession = objSmppServer.GetSession(SessionId)
If objSession.LastError <> 0 Then
objSession.DeliverSms objSms
End If
End Sub
...
GetClosedSession method
This method returns a recently closed session. If no closed sessions are available the LastError property is set.
The MaxClosedSessions property determines how many closed sessions are kept.
Parameters:
- None
Return value:
A SmppSession object.
Example:
Set objSmppSession = objSmppServer.GetClosedSession
While objSmppServer.LastError = 0
WScript.Echo "Session closed: " & objSmppSession.SystemId
WScript.Echo "Not responded: "
Set objMessage = objSmppSession.FetchNotResponded
While objSmppSession.LastError = 0
WScript.Echo "Usertag: " & objMessage.Usertag & "; SequenceNumber: " & _
objMessage.SmppSequenceNumber
Set objMessage = objSmppSession.FetchNotResponded
WEnd
WScript.Echo "Not delivered (seq is 0): "
Set objMessage = objSmppSession.FetchNotDelivered
While objSmppSession.LastError = 0
WScript.Echo "Usertag: " & objMessage.Usertag & "; SequenceNumber: " & _
objMessage.SmppSequenceNumber
Set objMessage = objSmppSession.FetchNotDelivered
WEnd
Set objSmppSession = objSmppServer.GetClosedSession
WEnd
FindFirstMyServerCertificate method
This method returns the first server certificate found in the ‘My’ store. If no certificate could be found or if the store cannot be openened LastError property is set.
A server certificate is a certificate that has ‘Server’ set as one of its purposes. The ‘My’ store will be labeled ‘Personal’ in the MMC (Microsoft Management Console) ‘Certificates’ plugin.
The CertificateStore property determines if the ‘My’ store of the current user or the ‘My’ store of the local machine is searched.
Parameters:
- None
Return value:
The name of the certificate
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
objSmppServer.CertificateStore = objConstants.SMPP_CERTIFICATESTORE_CURRENTUSER
WScript.Echo objSmppServer.FindFirstMyServerCertificate
While objSmppServer.LastError = 0
WScript.Echo objSmppServer.FindNextMyServerCertificate
Wend
...
FindNextMyServerCertificate method
This method returns the next server certificate found in the ‘My’ store. If no certificate could be found or if the store cannot be openened LastError property is set.
A server certificate is a certificate that has ‘Server’ set as one of its purposes. The ‘My’ store will be labeled ‘Personal’ in the MMC (Microsoft Management Console) ‘Certificates’ plugin.
The CertificateStore property determines if the ‘My’ store of the current user or the ‘My’ store of the local machine is searched.
Parameters:
- None
Return value:
The name of the certificate
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
objSmppServer.CertificateStore = objConstants.SMPP_CERTIFICATESTORE_CURRENTUSER
WScript.Echo objSmppServer.FindFirstMyServerCertificate
While objSmppServer.LastError = 0
WScript.Echo objSmppServer.FindNextMyServerCertificate
Wend
...
FindFirstLocalIpAddress method
This method returns the first local IP address. If local IP addresses cannot not be found the LastError property is set.
Use these constants to select the IP Version to browse.
Parameters:
- IP Version
Return value:
The IP address
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
WScript.Echo objSmppServer.FindFirstLocalIpAddress(objConstants.SMPP_IPVERSION_4)
While objSmppServer.LastError = 0
WScript.Echo objSmppServer.FindNextLocalIpAddress
Wend
...
FindNextLocalIpAddress method
This method returns the next local IP address. If no more local IP addresses can be found the LastError property is set.
Use these constants to select the IP Version to browse.
Parameters:
- none
Return value:
The IP address
Example:
Set objSmppServer = CreateObject("AxSms.SmppServer")
Set objConstants = CreateObject("AxSms.Constants")
...
WScript.Echo objSmppServer.FindFirstLocalIpAddress(objConstants.SMPP_IPVERSION_4)
While objSmppServer.LastError = 0
WScript.Echo objSmppServer.FindNextLocalIpAddress
Wend
...