SMPP Gateway
When you resell SMPP traffic you need to implement SMPP Gateway or SMPP Proxy.
Such application should start at least one SmppServer to be able to receive SMPP commands on TCP port and several SmppClient instances to send message to another SMPP servers (SMSC, Provider).
On SubmitSm from your customer you send back a response SubmitSmResp with assigned MessageId. Later when you forward this message to another server you will receive another MessageId from SMSC . This SMSC MessageId should also be replaced in DeliverSm ( Receipt ) for the target client.
You can implement routing for incomming messages. F.i. when you are going to forward SMS message you can estimate which SmppClient connection accepts destination phone number and which costs cheaper.
When you need only forward SubmitSm messages I suggest following steps:
- Receive SubmitSm from client.
- Save client's Sequence number to the database. Possible good idea to save entire PDU.
- Send SubmitSmResp with client's Sequence number and MessageId generated on your server side.
- In another process/thread send this SubmitSm PDU to another SMPP provider.
- Change SubmitSm Sequence number to the next sequence number for the SmppClient that connected to that SMPP provider.
- Receive Provider's MessageId in SubmitSmResp
- Store Provider's MessageId and Sequence number to the same database table as for client's Sequence number.
These four values:
- Client's sequence number
- Client's MessageId
- Provider's sequence number
- Provider's MessageId help later to find corresponding client that should receive delivery receipt from provider.
When DeliverSm comes from the provider and contains Delivery Receipt following steps should be done:
- Get Provider's MessageId from delivery Receipt.
- Find client's MessageId and corresponding SMPP user.
- Replace Provider's MessageId in DeliverSm PDU with client's MessageId and send Delivery Receipt to the SmppServerClient that belongs to SMPP user.
- If there is no active connection with the client, place DeliverSm PDU to the outgoing persistent queue (another database table).