Table of Contents

Message Composer: How to combine concatenated messages

SMS message with long text must be split into small parts (segments). In GSM Standard maximal length of the one short message is 140 bytes.

Inetlab.SMPP library provides an ability to combine all parts back into full message text. This can be done with MessageComposer class.

MessageComposer supports all types of PDUs: SubmitSm, SubmitMulti, DeliverSm.

You should invoke AddMessage<TSmppMessage>(TSmppMessage) method in each event handler for PDU received. MessageComposer saves PDU in memory and waits for the last segment of the message text and raises evFullMessageReceived event.

When PDU has no concatenation parameters this event will be raised right after calling AddMessage<TSmppMessage>(TSmppMessage) method.

When MessageComposer didn't receive last segment for a long time it raises evFullMessageTimeout event. Default timeout is 60 seconds.

private readonly SmppClient _client = new SmppClient();
private readonly MessageComposer _composer = new MessageComposer();

public MessageComposerSample()
{
    _client.evDeliverSm += client_evDeliverSm;

    _composer.evFullMessageReceived += OnFullMessageReceived;
    _composer.evFullMessageTimeout += OnFullMessageTimedout;
}

private void client_evDeliverSm(object sender, DeliverSm data)
{
    _composer.AddMessage(data);
}

private void OnFullMessageTimedout(object sender, MessageEventHandlerArgs args)
{
    DeliverSm pdu = args.GetFirst<DeliverSm>();
    _log.Info(string.Format("Incomplete message received from {0}", pdu.SourceAddress));
}

private void OnFullMessageReceived(object sender, MessageEventHandlerArgs args)
{
    DeliverSm pdu = args.GetFirst<DeliverSm>();
    _log.Info(string.Format("Full message received from {0}: {1}", pdu.SourceAddress, args.Text));
}

MessageComposer also provides methods for detecting last segment and getting full message:


private void client_evDeliverSmInline(object sender, DeliverSm data)
{
    _composer.AddMessage(data);
    if (_composer.IsLastSegment(data))
    {
       string receivedText = _composer.GetFullMessage(data);
    }
}