Отправка SMS через USB-модем - C#

Узнай цену своей работы

Формулировка задачи:

Интересует, можно ли и каким образом реализовать на С# механизм отправки смс через подключенный к машине ЮЗБ-модем. Может кто-то решал данную задачу?

Решение задачи: «Отправка SMS через USB-модем»

textual
Листинг программы
public class Sms : IDisposable
    {
        private readonly SerialPort _port;
        public bool AtOk { get; set; }
        public Sms(string portName)
        {
            try
            {
                _port = new SerialPort(portName)
                            {
                                PortName = portName,
                                WriteTimeout = 500,
                                ReadTimeout = 500,
                                BaudRate = 9600,
                                Parity = Parity.None,
                                DataBits = 8,
                                StopBits = StopBits.One,
                                Handshake = Handshake.RequestToSend,
                                DtrEnable = true,
                                RtsEnable = true,
                                NewLine = Environment.NewLine
                            };
 
                _port.Open();
                _port.DataReceived += SerialPortDataReceived;
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }
        [STAThread]
        private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //"\r\n+CMGS: 26\r\n\r\nOK\r\n"
            if (!_port.IsOpen) return;
 
            var tmp = _port.ReadExisting();
            tmp = tmp.Replace("\r\n", "").Replace(" ", "");
            if (tmp.Length < 5) return;
 
            if (tmp.Substring(0, 5) == "+CMGS")
            {
                AtOk = true;
            }
        }
        public void SendSms(string number, string text)
        {
            var revNumber = ReverseNumber(number);
            var revText = StringToUcs2(text);
 
            //Если номер преобразован верно
            if (string.IsNullOrEmpty(revNumber)) return;
            //Если строка нормально преобразована
            if (string.IsNullOrEmpty(revText)) return;
            //Формируем пакет sms
            var packSms = new StringBuilder();
 
            packSms.Append("00");//СМС-Центр    00  В начале указывается номер СМС-цента для отсылки, он просто хранится в телефоне и используется по умолчанию
            packSms.Append("11");//SMS-SUBMIT   11  Тип сообщения - 1 (SMS-SUBMIT). Далее указывается о наличии байта таймаута (+10)
            packSms.Append("00");//TP-Message-Reference 00  "Номер" сообщения TP-Message-Reference. Оставляем 0 - не наше дело
            packSms.Append("0B91" + revNumber); //Получатель:
            //0B    Длина номера получателя, 11 цифр, включая код страны "7"
            //91    Международный формат
            //Номер который сформирует reverseNumber
            packSms.Append("00");//TP-PID   00  Тип протокола. Оставляем 0.
            packSms.Append("08");//TP-DCS   08  Кодировка сообщения. 00 = 7bit, 04 - 8bit, 08 - 16 bit UCS-2. Для передачи русского языка выбираем 08.
            packSms.Append("AA");//TP-Validity-Period   AA  Таймаут для сообщения (наличие указывалось в SMS-SUBMIT). AA - 4 дня. 
            packSms.Append(ByteSize(revText));//TP-User-Data-Length Длина сообщения в байтах.
            packSms.Append(revText);//TP-User-Data Сообщение сформирует reverseText
            var resultSms = packSms.ToString();
 
 
            _port.WriteLine("AT+CMGF=0");//Режим PDU-0, TEXT-1
            System.Threading.Thread.Sleep(500);
            _port.WriteLine("AT+CMGS=" + ByteSizeRes(resultSms));//Кол-во байт-1
            System.Threading.Thread.Sleep(500);
            _port.WriteLine(resultSms + (char)(26));//Посылаем СМС и код клавиш ctrl+z
        }
        static string ReverseNumber(string numb)
        {
            var result = "";
            var ind = 0;
            var tmp = "";
            try
            {
                for (var i = 0; i < numb.Length; i++)
                {
                    if (ind > 1)
                    {
                        ind = 1;
 
                        result += ReverseDigit(tmp);
                        if (String.IsNullOrEmpty(result))
                        {
                            return "";
                        }
                        tmp = numb[i].ToString();
                        if (i == numb.Length - 1)
                        {
                            result += ReverseDigit(tmp);
                        }
                    }
                    else
                    {
                        tmp += numb[i];
                        ind++;
                    }
                }
            }
            catch /*(Exception ex)*/
            {
                //Тут надо отправить уведомление отделу ИТ
                result = "";
            }
            return result;
        }
        static string ReverseDigit(string twoDigit)
        {
            if (twoDigit.Length == 2) //Если 2 цифры, меняем местами
            {
                var tmp = twoDigit[0].ToString();
                twoDigit = twoDigit[1] + tmp;
                return twoDigit;
            }
            if (twoDigit.Length == 1) //Если 1, то добавляем к ней F
            {
                return "F" + twoDigit;
            }
            return "";
        }
        static string StringToUcs2(string text)
        {
            string result;
            try
            {
                var enc = Encoding.BigEndianUnicode;
                var intermediate = enc.GetBytes(text);
                var sb = new StringBuilder(intermediate.Length * 2);
                foreach (var b in intermediate)
                {
                    sb.Append(b.ToString("X2"));
                }
                result = sb.ToString();
            }
            catch /*(Exception ex)*/
            {
                //Тут надо отправить уведомление отделу ИТ
                result = "";
            }
            return result;
        }
        static string ByteSize(string str)
        {
            var size = str.Length / 2;
            var ost = str.Length % 2;
            if (ost != 0) size += 1;
            return size.ToString("X2");
        }
        static string ByteSizeRes(string str)
        {
            var size = str.Length / 2;
            var ost = str.Length % 2;
            if (ost != 0) size += 1;
            return (size - 1).ToString();
        }
        public void Dispose()
        {
            _port.Close();
            _port.Dispose();
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5