Как разобрать смс с GSM модема в c # - PullRequest
0 голосов
/ 30 мая 2018

Я создаю веб-приложение для обмена сообщениями.Уже сделал метод отправки сообщения.Мой метод получения сообщений работает с SerialDataReceivedEventHandler
Мой код:

 public class InnerComPortSettings
{
    public static SerialPort SerialPort;

    public static void OpenPort()
    {
        SerialPort = new SerialPort("COM3", 115200)
        {
            Parity = Parity.None,
            DataBits = 8,
            StopBits = StopBits.One,
            Handshake = Handshake.None,
            DtrEnable = true,
            RtsEnable = true
        };

        //Thread.Sleep(1000);
        SerialPort.Open();
    }
}

private string _messageString;

    public Task ReceiveSms()
    {
        return Task.Run(() =>
        {
            InnerComPortSettings.SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            InnerComPortSettings.SerialPort.WriteLine("AT+CMGF?\r");

            Thread.Sleep(5000);
            InnerComPortSettings.SerialPort.WriteLine("AT+CNMI=1,2,0,0,0\r");
            Thread.Sleep(1000);
            InnerComPortSettings.SerialPort.WriteLine("AT+CMGF=0\r");
            Thread.Sleep(1000);

        });

    }

    public void DataReceivedHandler(
        object sender,
        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;         

        _messageString = sp.ReadLine();

        GetPdu();
    }
    }

Так что я хочу, чтобы проанализировать только SMS информацию и сообщение, а затем сохранить его в базе данных,

//Response after start
    AT+CMGF=1
    OK
    AT+CNMI=1,2,0,0,0
    OK

//Response after getting message
    +CMT: "+xxxxxxxxxx",,"18/05/30,10:08:08+18"
    Testing

Как лучше всего исключить первую часть и разделить вторую часть на миры?

1 Ответ

0 голосов
/ 20 июня 2018

Что касается лучшего анализа, я переключился на получение PDU от модема, проверку PDU с помощью регулярных выражений и после разбора PDU на части.
Изменен CMGF на 0

AT+CMGF=0
OK
AT+CNMI=1,2,0,0,0
OK

Проверка ответа последовательного порта для PDU

 public void GetPdu()
    {
        Console.WriteLine(_messageString);

        Regex regex = new Regex("^([0-9A-F]+\r)$");
        Match match = regex.Match(_messageString);
        if (match.Success)
        {
            Console.WriteLine("Match: " + match.Value);
            string messagePdu = match.Value;
            ParseMessage(messagePdu);
        }
    }

Метод декодирования Для этого метода я использовал этот Источник

ublic void ParseMessage(string messagePdu)
    {
        SMSType smsType = SmsBase.GetSMSType(messagePdu);
        switch (smsType)
        {
            case SMSType.SMS:
                Sms sms = new Sms();
                Sms.Fetch(sms, ref messagePdu);

                string messageBody = sms.Message;
                string phoneNumber = sms.PhoneNumber;
                DateTime messageDateTime = DateTime.Parse(sms.ServiceCenterTimeStamp.ToString());
                string state = "Received";
                SaveMessage(messageBody, phoneNumber, messageDateTime, state);

                break;
            case SMSType.StatusReport:
                SmsStatusReport statusReport = new SmsStatusReport();
                SmsStatusReport.Fetch(statusReport, ref messagePdu);
                break;
        }          
    }
...