private EncodedMessage Encode(string sourceText) { StringBuilder sbMain = new StringBuilder(); StringBuilder sbMessage = new StringBuilder(); // номер SMS-сервера if (_smsServer == null) { // определяется настройками телефона sbMain.Append("00"); } else { // задан явно string smsServerNo = _smsServer.ToString(); // длина номера (число HEX-байт + 1) sbMain.Append((smsServerNo.Length / 2 + 1).ToString("X2")); // тип номера (международный) sbMain.Append("91"); // номер sbMain.Append(smsServerNo); } // собственно сообщение // поле данных протокола (тип сообщения - исходящее, задано относительное // время валидности сообщения, в днях) sbMessage.Append("11"); // ссылочный номер сообщения (будет возвращен телефоном) sbMessage.Append("00"); // длина номера получателя, число ДЕСЯТИЧНЫХ цифр sbMessage.Append( _recipient.ToString(PhoneNumberFormat.NonReadable).Length.ToString("X2")); // тип номера (международный) sbMessage.Append("91"); // номер получателя sbMessage.Append(_recipient.ToString(PhoneNumberFormat.SMS)); // идентификатор протокола (обычное сообщение) sbMessage.Append("00"); // схема кодирования данных в поле данных (кодировка UCS2) sbMessage.Append("08"); // период валидности сообщения sbMessage.Append((166 + _validityPeriod).ToString("X2")); // кодируем текст сообщения в UCS2 string ucs2Text = EncodeUSC2String(sourceText); // длина текста sbMessage.Append((ucs2Text.Length / 2).ToString("X2")); // текст sbMessage.Append(ucs2Text); // объединяем две строки sbMain.Append(sbMessage.ToString()); EncodedMessage encMessage = new EncodedMessage(sbMessage.ToString().Length / 2, sbMain.ToString()); return(encMessage); }
/// <summary> /// Отправка сообщения /// </summary> /// <param name="message">Сообщение, подготовленное к отправке</param> public void Send(EncodedMessage message) { PreparePort(); // включаем режим отправки SMS в PDU-формате CheckCommandStatus(SendATCommand("AT+CMGF=0")); // проверяем, поддреживает ли телефон SMS-команды CheckCommandStatus(SendATCommand("AT+CSMS=0")); // отправляем заголовок сообщения CheckCommandStatus( SendATCommand(string.Format("AT+CMGS={0}", message.NumberOfOctets)), ">"); // отправляем тело сообщения CheckCommandStatus(SendATCommand(message.Message, 0x1A)); }
/// <summary> /// Формирование короткого текстового сообщения для отправки /// </summary> /// <returns>Короткое текстовое сообщение в PDU-формате</returns> /// <remarks>Поскольку максимальная длина текста в одном сообщении ограничена, /// то исходный текст сообщения в результате может быть разбит на несколько /// сообщений в PDU-формате</remarks> public EncodedMessage[] Encode() { if (_recipient == null) { throw new InvalidOperationException("Не задан номер получателя сообщений"); } if (string.IsNullOrEmpty(_messageText)) { throw new InvalidOperationException("Не задан текст сообщения"); } // разбиваем текст на сообщения с учетом макс. длины List <string> rawMessages = ParseMessageText(); // здесь будут сохранены закодированные сообщения EncodedMessage[] messages = new EncodedMessage[rawMessages.Count]; for (int i = 0; i < rawMessages.Count; i++) { // кодируем очередное сообщение messages[i] = Encode(rawMessages[i]); } return(messages); }
/// <summary> /// Отправка нескольких сообщений /// </summary> /// <param name="messages">Сообщения, подготовленные к отправке</param> /// <param name="reverseOrder">Отправить сообщения в обратном порядке</param> public void Send(EncodedMessage[] messages, Boolean reverseOrder) { if (reverseOrder) { for (Int32 i = messages.Length; i > 0; i--) Send(messages[i - 1]); } else { foreach (EncodedMessage message in messages) Send(message); } }
/// <summary> /// Отправка нескольких сообщений /// </summary> /// <param name="messages">Сообщения, подготовленные к отправке</param> public void Send(EncodedMessage[] messages) { Send(messages, true); }
/// <summary> /// Отправка сообщения /// </summary> /// <param name="message">Сообщение, подготовленное к отправке</param> public void Send(EncodedMessage message) { PreparePort(); // включаем режим отправки SMS в PDU-формате CheckCommandStatus(SendATCommand("AT+CMGF=0")); // проверяем, поддреживает ли телефон SMS-команды CheckCommandStatus(SendATCommand("AT+CSMS=0")); // отправляем заголовок сообщения CheckCommandStatus( SendATCommand(String.Format("AT+CMGS={0}", message.NumberOfOctets)), ">"); // отправляем тело сообщения CheckCommandStatus(SendATCommand(message.Message, 0x1A)); }
private EncodedMessage Encode(String sourceText) { StringBuilder sbMain = new StringBuilder(); StringBuilder sbMessage = new StringBuilder(); // номер SMS-сервера if (_smsServer == null) // определяется настройками телефона sbMain.Append("00"); else { // задан явно String smsServerNo = _smsServer.ToString(); // длина номера (число HEX-байт + 1) sbMain.Append((smsServerNo.Length / 2 + 1).ToString("X2")); // тип номера (международный) sbMain.Append("91"); // номер sbMain.Append(smsServerNo); } // собственно сообщение // поле данных протокола (тип сообщения - исходящее, задано относительное // время валидности сообщения, в днях) sbMessage.Append("11"); // ссылочный номер сообщения (будет возвращен телефоном) sbMessage.Append("00"); // длина номера получателя, число ДЕСЯТИЧНЫХ цифр sbMessage.Append( _recipient.ToString(PhoneNumberFormat.NonReadable).Length.ToString("X2")); // тип номера (международный) sbMessage.Append("91"); // номер получателя sbMessage.Append(_recipient.ToString(PhoneNumberFormat.SMS)); // идентификатор протокола (обычное сообщение) sbMessage.Append("00"); // схема кодирования данных в поле данных (кодировка UCS2) sbMessage.Append("08"); // период валидности сообщения sbMessage.Append((166 + _validityPeriod).ToString("X2")); // кодируем текст сообщения в UCS2 String ucs2Text = EncodeUSC2String(sourceText); // длина текста sbMessage.Append((ucs2Text.Length / 2).ToString("X2")); // текст sbMessage.Append(ucs2Text); // объединяем две строки sbMain.Append(sbMessage.ToString()); EncodedMessage encMessage = new EncodedMessage(sbMessage.ToString().Length / 2, sbMain.ToString()); return encMessage; }
/// <summary> /// Формирование короткого текстового сообщения для отправки /// </summary> /// <returns>Короткое текстовое сообщение в PDU-формате</returns> /// <remarks>Поскольку максимальная длина текста в одном сообщении ограничена, /// то исходный текст сообщения в результате может быть разбит на несколько /// сообщений в PDU-формате</remarks> public EncodedMessage[] Encode() { if (_recipient == null) throw new InvalidOperationException("Не задан номер получателя сообщений"); if (String.IsNullOrEmpty(_messageText)) throw new InvalidOperationException("Не задан текст сообщения"); // разбиваем текст на сообщения с учетом макс. длины List<String> rawMessages = ParseMessageText(); // здесь будут сохранены закодированные сообщения EncodedMessage[] messages = new EncodedMessage[rawMessages.Count]; for (Int32 i = 0; i < rawMessages.Count; i++) { // кодируем очередное сообщение messages[i] = Encode(rawMessages[i]); } return messages; }