/// <summary> /// Method adds `Concat` information into the User Header /// </summary> /// <param name="udhStruct">stucture representing the </param> /// <param name="messageUDH">message user header</param> private byte[] GetConcatPdu(ConcatedUDH udhStruct, byte[] messageUDH) { const byte CONCATED_UDH_DATA_LENGTH = 0x06; using (var stream = new MemoryStream()) { // If we have message for concating, write concating header if (udhStruct.Parts > 1) { stream.WriteByte((byte)(CONCATED_UDH_DATA_LENGTH + messageUDH.Length)); stream.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT); stream.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT_HEADERLENGTH); stream.WriteByte((byte)(udhStruct.Reference >> 8)); stream.WriteByte((byte)udhStruct.Reference); stream.WriteByte(udhStruct.Parts); stream.WriteByte(udhStruct.Sequence); } // if we have some messageuUDH, write the header length else if (messageUDH.Length > 0) { stream.WriteByte((byte)messageUDH.Length); } stream.Write(messageUDH, 0, messageUDH.Length); return(stream.ToArray()); } }
/// <summary> /// Method adds `Concat` information into the User Header /// </summary> /// <param name="udhStruct">stucture representing the </param> /// <param name="messageUDH">message user header</param> private byte[] GetConcatPdu(ConcatedUDH udhStruct, byte[] messageUDH) { MemoryStream stream = new MemoryStream(); // If we have message for concating, write concating header if (udhStruct.Parts > 1) { MemoryStream concatHeader = new MemoryStream(); concatHeader.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT); concatHeader.WriteByte(PDU_UDH_CONCATED_MESSAGE_16BIT_HEADERLENGTH); concatHeader.WriteByte((byte)(udhStruct.Reference >> 8)); concatHeader.WriteByte((byte)udhStruct.Reference); concatHeader.WriteByte(udhStruct.Parts); concatHeader.WriteByte(udhStruct.Sequence); stream.WriteByte((byte)(concatHeader.Length + messageUDH.Length)); concatHeader.WriteTo(stream); } // if we have some messageuUDH, write the header length else if (messageUDH.Length > 0) stream.WriteByte((byte)messageUDH.Length); stream.Write(messageUDH, 0, messageUDH.Length); return stream.ToArray(); }
/// <summary> /// Method returns list of PDU formated messages. /// If data fits into one message than the list has only one item. /// Otherwise the data is concated into more messages. /// </summary> /// <returns></returns> public List <byte[]> GetPDUList() { int maxOctetsCount; switch (MessageToSend.DataEncoding) { case DataEncoding.Default7bit: maxOctetsCount = 160; break; case DataEncoding.Data8bit: maxOctetsCount = 140; // Might be lower, some roaming partners don't like it when set to 140 break; case DataEncoding.UCS2_16bit: maxOctetsCount = 140; break; default: maxOctetsCount = 140; break; } byte[] body = MessageToSend.GetSMSBytes(); byte[] messageUdh = MessageToSend.GetUDHBytes(); // If UDH exists then reserve one more byte for UDH length int maxLen = maxOctetsCount - messageUdh.Length; maxLen -= (messageUdh.Length > 0) ? 1 : 0; // Count parts int parts = (int)Math.Ceiling((double)body.Length / (double)maxLen); parts = (int)Math.Ceiling((double)(body.Length + parts * messageUdh.Length) / (double)maxLen); if (parts > 1) { parts = (int)Math.Ceiling((double)(body.Length + parts * messageUdh.Length + parts * (CONCATED_UDH_FULL_LENGTH + 1)) / (double)maxLen); } List <byte[]> messagePart = new List <byte[]>(); byte[] udhByteArray; byte[] messageByteArray; ConcatedUDH conUDH = new ConcatedUDH(); // This will hold the byteCount send in message (without UDH) int bytesCount = maxOctetsCount; // Thiis will hold the position in the message array int messagePos = 0; if (parts > 1) { conUDH.Reference = 01; conUDH.Parts = (byte)parts; for (int i = 0; i < parts; i++) { conUDH.Sequence = (byte)(i + 1); udhByteArray = GetConcatPdu(conUDH, messageUdh); // if it's not last message then if (i < (parts - 1)) { bytesCount = maxOctetsCount - udhByteArray.Length - 1; } else { bytesCount = body.Length - messagePos; } byte[] bodyPart = new byte[bytesCount]; Array.Copy(body, messagePos, bodyPart, 0, bytesCount); // Encode message with given encoding byte[] encodedBody = GetEncodedMessage(bodyPart); // Takes the message length before encoding int messageLength = (bodyPart.Length) + udhByteArray.Length; // There is a align in 7bit encoding if (MessageToSend.DataEncoding == DataEncoding.Default7bit) { messageLength++; } //creates message messageByteArray = new byte[encodedBody.Length + udhByteArray.Length]; Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length); Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length); messagePos += bytesCount; messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0)); messagePart.Add(messageByteArray); } } else { conUDH.Parts = 1; udhByteArray = GetConcatPdu(conUDH, messageUdh); // Encode body according to given Encoding :) byte[] encodedBody = GetEncodedMessage(body); // Takes the message length before encoding int messageLength = (body.Length) + udhByteArray.Length; messageByteArray = new byte[encodedBody.Length + udhByteArray.Length]; Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length); Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length); messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0)); messagePart.Add(messageByteArray); } return(messagePart); }
/// <summary> /// Method returns list of PDU formated messages. /// If data fits into one message than the list has only one item. /// Otherwise the data is concated into more messages. /// </summary> /// <returns></returns> public List<byte[]> GetPDUList() { int maxOctetsCount; switch (MessageToSend.DataEncoding) { case DataEncoding.Default7bit: maxOctetsCount = 160; break; case DataEncoding.Data8bit: maxOctetsCount = 140; // Might be lower, some roaming partners don't like it when set to 140 break; case DataEncoding.UCS2_16bit: maxOctetsCount = 140; break; default: maxOctetsCount = 140; break; } byte[] body = MessageToSend.GetSMSBytes(); byte[] messageUdh = MessageToSend.GetUDHBytes(); // If UDH exists then reserve one more byte for UDH length int maxLen = maxOctetsCount - messageUdh.Length; maxLen -= (messageUdh.Length > 0) ? 1 : 0; // Count parts int parts = (int)Math.Ceiling((double)body.Length / (double)maxLen); parts = (int)Math.Ceiling((double)(body.Length + parts*messageUdh.Length) / (double)maxLen); List<byte[]> messagePart = new List<byte[]>(); byte[] udhByteArray; byte[] messageByteArray; ConcatedUDH conUDH = new ConcatedUDH(); // This will hold the byteCount send in message (without UDH) int bytesCount = maxOctetsCount; // Thiis will hold the position in the message array int messagePos = 0; if (parts > 1) { conUDH.Reference = 01; conUDH.Parts = (byte)parts; for (int i = 0; i < parts; i++) { conUDH.Sequence = (byte)(i + 1); udhByteArray = GetConcatPdu(conUDH, messageUdh); // if it's not last message then if (i < (parts - 1)) bytesCount = maxOctetsCount - udhByteArray.Length - 1; else bytesCount = body.Length - messagePos; byte[] bodyPart = new byte[bytesCount]; Array.Copy(body, messagePos, bodyPart, 0, bytesCount); // Encode message with given encoding byte[] encodedBody = GetEncodedMessage(bodyPart); // Takes the message length before encoding int messageLength = (bodyPart.Length) + udhByteArray.Length; // There is a align in 7bit encoding if (MessageToSend.DataEncoding == DataEncoding.Default7bit) messageLength++; //creates message messageByteArray = new byte[encodedBody.Length + udhByteArray.Length]; Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length); Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length); messagePos += bytesCount; messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0)); messagePart.Add(messageByteArray); } } else { conUDH.Parts = 1; udhByteArray = GetConcatPdu(conUDH, messageUdh); // Encode body according to given Encoding :) byte[] encodedBody = GetEncodedMessage(body); // Takes the message length before encoding int messageLength = (body.Length) + udhByteArray.Length; messageByteArray = new byte[encodedBody.Length + udhByteArray.Length]; Array.Copy(udhByteArray, messageByteArray, udhByteArray.Length); Array.Copy(encodedBody, 0, messageByteArray, udhByteArray.Length, encodedBody.Length); messageByteArray = GetPDUBytes(messageByteArray, messageLength, (udhByteArray.Length > 0)); messagePart.Add(messageByteArray); } return messagePart; }