PDU & UDH Trouble


#1

Any one with experience on this ?
I’ve manage to built pdu’s but due to unicode use we need more characters for the sms’s. The solution was to use multi part PDU’s.

I’ve manage to get something with my older code.

For the multi part sms is the code between /////////////////// UDH

I’m dividing that sentence in 3 ways, below is the result of the decode to text.

The information contained herein is subject to change without notice. Revisions may be issued to advice of such changes and/or additions.

PDU - 079153916209508141000C915391413316060008AA32DA0D350303A1030100540068006500200069006e0066006f0072006d006100740069006f006e00200063006f006e007400610069006e00650064002000680065007200650069006e0020006900730020007300750062006a00650063007400200074006f0020006300680061006e0067006500200077006900740068006f0075

Decoded PDU - ��㔃Ρ́The information contained herein is subject to

PDU - 079153916209508141000C915391413316060008AA32DA0D350303A103020020006e006f0074006900630065002e00200020005200650076006900730069006f006e00730020006d00610079002000620065002000690073007300750065006400200074006f00200061006400760069006300650020006f0066002000730075006300680020006300680061006e0067006500730020

Decoded PDU - ��㔃Ρ̂ notice. Revisions may be issued to advice of

PDU - 079153916209508141000C915391413316060008AAB718350303A10303006e0064002f006f00720020006100640064006900740069006f006e0073002e

Decoded PDU - ᠵ̃ꄃ̀渀搀⼀漀爀 愀搀搀椀琀椀漀渀猀⸀

The first 2 are not bad but i cant have the first characters, the third one is a mess !

Anyone that can help me ??

public static string GetPdu(string number, string message, string smscAddress, bool multi, int total, out int actualLength)
{

        if (multi == true)
        {
            smsCount++;
        }
        const byte internationalFormat = 0x91; // telephone/ISDN, international format
        const byte unknownFormat = 0x81; // telephone/ISDN, unknown format

        // Determine destination address type
        byte numberAddressType;
        string useNumber;
        if (number.StartsWith("+"))
        {
            numberAddressType = internationalFormat;
            useNumber = number.Substring(1); // strip initial "+" character
        }
        else
        {
            numberAddressType = unknownFormat;
            useNumber = number;
        }

        // Determine SMSC address type
        byte smscAddressType;
        string useSmscAddress;
        if (smscAddress.StartsWith("+"))
        {
            smscAddressType = internationalFormat;
            useSmscAddress = smscAddress.Substring(1); // strip initial "+" character
        }
        else
        {
            smscAddressType = unknownFormat;
            useSmscAddress = smscAddress;
        }

        // Encode the user data text
        byte dataLength;
        // byte[] encodedText = EncodeText(message, out dataLength);
        string encodedText = EncodeText2(message, out dataLength);
        //byte[] encoded8bit = Encode8bitText(message, out dataLength);
        // Encode the SMSC address
        string encodedSmsc = EncodeSmscAddress(useSmscAddress, smscAddressType);

        // Create the PDU string
        StringBuilder builder = new StringBuilder();
        builder.Append(IntToHex(0x41)); // message flags:
        //   msg type=SMS-SUBMIT-PDU,
        //   validity=relative
        builder.Append(IntToHex(0x00)); // Message Reference, 0=set by device
        builder.Append(EncodeDestinationAddress(useNumber, numberAddressType));
  
        builder.Append(IntToHex(0x00)); // Protocol ID, 0=SME-to-SME
        builder.Append(IntToHex(0x08)); // Data Coding Scheme, 0=7-Bit default
        builder.Append(IntToHex(0xAA)); // Relative Validity, 0xA7=24 hrs,0xAA=4days
        /////////////////// UDH
        int dlINT = ((dataLength*2) + 2 + 5);
        byte[] dlBYTE = SeptetsToOctetsInt(dlINT.ToString());
        foreach (byte b in dlBYTE)
        { 
        builder.Append(IntToHex(b)); // Data Lenght (UDHL + UDH + TEXT)
        }
        builder.Append(IntToHex(SeptetsToOctetsInt("5")));//User Header Data Lenght - UHDL (UDH LENGHT)
        //UDH
        builder.Append(IntToHex(0x03)); // Identifier
        builder.Append(IntToHex(0x03)); // Information Element Data Lenght
        builder.Append(IntToHex(0xA1)); // Ref num
        builder.Append(IntToHex((byte)total)); // Total
        builder.Append(IntToHex((byte)smsCount)); // This Part
        //UDH
        ////////////////// UDH
        builder.Append(encodedText);
        //builder.Append(IntToHex(encoded8bit)); 

         actualLength = builder.Length / 2;
         builder.Insert(0, encodedSmsc);
         builder.Insert(builder.Length, "_");
         builder.Insert(builder.Length, actualLength);
         return builder.ToString();
    
    }