代码之家  ›  专栏  ›  技术社区  ›  Daniel Žeimo

如何用c语言解析gsm调制解调器中的短消息#

  •  0
  • Daniel Žeimo  · 技术社区  · 7 年前

    我正在创建Messenger Web应用程序。已执行消息发送方法。我的消息接收方法与 串行数据接收设备
    我的代码:

     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();
        }
        }
    

    所以我只需要解析短消息信息和消息,然后将其存储到数据库中。

    //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 回复  |  直到 7 年前
        1
  •  0
  •   Daniel Žeimo    7 年前

    为了更好的解析,我切换到从modem获取pdu,用regex检查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);
            }
        }
    

    解码方法 我用这个方法 Source

    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;
            }          
        }
    
    推荐文章