Table of Contents

Message Composer: How to combine concatenated messages

SMS message with long text must be split to 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 received PDU. MessageComposer saves PDU in memory and waits for 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 secodns.

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 provides also 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);
    }
}