Beispiel #1
0
        public static void ReceiveSMS(Settings.DevicesItem Device)
        {
            var Data = RunCommandWithFeedBack(Device.ModemPort, "AT+CPMS= \"ME\",\"ME\",\"ME\"");

            if (!Data.Contains("OK"))
            {
                throw new Exception($"Init Failure:{Data}");
            }
            Data = RunCommandWithFeedBack(Device.ModemPort, "AT+CPMS?");
            if (!Data.Contains("OK"))
            {
                throw new Exception($"Init Failure:{Data}");
            }
            var RegexStr = "\\r\\n\\+CPMS: [\\\"A-Z,0-9]*\\r\\n";

            Data = Regex.Match(Data, RegexStr).ToString().Replace("\r\n", "").Replace("+CPMS: ", "").Replace("\"", "");
            var SMSNum = Int32.Parse(Data.Split(',')[1]);

            if (SMSNum == 0)
            {
                return;
            }
            for (var SMSCount = 0; SMSNum >= SMSCount; SMSCount++)
            {
                Data = RunCommandWithFeedBack(Device.ModemPort, "AT+CMGR=" + SMSCount.ToString());
                if (!Data.Contains("OK"))
                {
                    throw new Exception("Recv Failure");
                }
                RegexStr = $"\r\n([0-9A-F]*)\r\n";
                Data     = Regex.Match(Data, RegexStr).ToString().Replace("\r\n", "");
                if (Data == "")
                {
                    continue;
                }
                GsmComm.PduConverter.IncomingSmsPdu PDU = IncomingSmsPdu.Decode(Data, true);
                var SendTime    = "GMT" + PDU.GetTimestamp().ToDateTime().ToString("z yyyy-MM-dd HH:mm:ss");
                var ReceiveTime = "GMT" + DateTime.Now.ToString("z yyyy-MM-dd HH:mm:ss");
                var SMSC        = PDU.SmscAddress;
                var Msg         = PDU as SmsDeliverPdu;
                var From        = Msg.OriginatingAddress;
                var To          = Device.Name + "@" + Device.PhoneNumber;
                var Tittle      = From + "->" + To;
                Data = "From:" + From + "\r\n" + "To:" + To + "\r\n" + "Send:" + SendTime + "\r\n" + "Received:" + ReceiveTime + "\r\n" + "SMSC:" + SMSC + "\r\n" + PDU.UserDataText;
                Console.WriteLine($"{Device.Name}-SMS Received:{Tittle}");
                Console.WriteLine($"SMS:{Data}");
                try
                {
                    Device.PostMessage(Tittle, Data);
                }
                catch (Exception ex)
                {
                    throw new Exception($"Push Exception: {ex.Message}");
                }
                Data = RunCommandWithFeedBack(Device.ModemPort, "AT+CMGD=" + SMSCount.ToString());
            }
        }
Beispiel #2
0
        /// <summary>
        /// Parses the SMS responses and displays the response on the DataGridView
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        private List <ConfirmationMessage> ParseConfirmationMessage(string message)
        {
            List <string> messages = message.Split(new string[] { "+CMGL: " }, StringSplitOptions.RemoveEmptyEntries).ToList();
            List <ConfirmationMessage> confirmationMessages = new List <ConfirmationMessage>();

            if (messages.Count != 0)
            {
                messages.RemoveAt(0);
            }
            foreach (var item in messages)
            {
                List <string>       messageParts           = item.Split(new string[] { "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries).ToList();
                ConfirmationMessage newConfirmationmessage = new ConfirmationMessage();
                foreach (var item2 in messageParts)
                {
                    string pattern = "^[0-9]+";
                    Regex  rgx     = new Regex(pattern);
                    if (item2.Contains(","))
                    {
                        string s = rgx.Match(item2).ToString();
                        newConfirmationmessage.SetID(Int32.Parse(s));
                    }
                    else if (item2.Contains("F"))
                    {
                        newConfirmationmessage.SetMessage(item2);
                        IncomingSmsPdu sms = IncomingSmsPdu.Decode(item2, true);
                        newConfirmationmessage.SetTelNr((sms as SmsStatusReportPdu).RecipientAddress);
                        newConfirmationmessage.SetTimeStamp((sms as SmsStatusReportPdu).SCTimestamp.ToDateTime());
                        newConfirmationmessage.SetDischarge((sms as SmsStatusReportPdu).DischargeTime.ToDateTime());
                        if ((sms as SmsStatusReportPdu).Status.Category.ToString() == "Success")
                        {
                            newConfirmationmessage.SetStatus("Received");
                        }
                        else
                        {
                            newConfirmationmessage.SetStatus("not Received");
                        }
                        confirmationMessages.Add(newConfirmationmessage);
                    }
                }
            }
            return(confirmationMessages);
        }
Beispiel #3
0
        private void Button1_Click(object sender, EventArgs e)
        {
            var messages = GSM.ListMessages(PhoneMessageStatus.All);

            dataReceivedRichTextBox.AppendText($"Messages:{messages.Length}\n");

            var inbox = new List <InboxMessage>();

            foreach (var msg in messages)
            {
                var sms = IncomingSmsPdu.Decode(msg.Data, true);
                inbox.Add(new InboxMessage
                {
                    Index   = msg.Index,
                    Status  = msg.Status == 0 ? "Unread" : "Read",
                    From    = ((SmsDeliverPdu)sms).OriginatingAddress,
                    Date    = sms.GetTimestamp().ToString(),
                    Message = sms.UserDataText
                });
            }
            smsInboxGrid.DataSource = inbox;
        }
Beispiel #4
0
        /// <summary>
        ///
        /// </summary>
        /// <returns>datatable:phone,message,date</returns>
        public DataTable f_getReceivedSMS()
        {
            if (!cls_Modem.p_getInstance.f_openPort())
            {
                return(null);
            }

            string str_report = "";

            try
            {
                m_semaphoreWriteSMS.WaitOne();

                string strCmd = "at+cmgf=0\r";
                cls_Modem.p_getInstance.f_write(strCmd);
                cls_Modem.p_getInstance.f_readFeedback();

                strCmd = "at+cnmi=1,0,0,1,0\r";
                cls_Modem.p_getInstance.f_write(strCmd);
                cls_Modem.p_getInstance.f_readFeedback();

                strCmd = "at+cpms=\"SM\"\r";
                cls_Modem.p_getInstance.f_write(strCmd);
                cls_Modem.p_getInstance.f_readFeedback();

                strCmd = "at+cmgl=4\r";
                cls_Modem.p_getInstance.f_write(strCmd);
                str_report = cls_Modem.p_getInstance.f_readFeedback();

                m_semaphoreWriteSMS.Release();
            }
            catch (Exception exp)
            {
                f_logReport(Enum_logState.Error, exp.Message + exp.StackTrace);
                m_semaphoreWriteSMS.Release();
                return(null);
            }

            if (Regex.IsMatch(str_report, cls_base.PATTERN_ERROR) || str_report == cls_base.ERROR_FEEDBACK)
            {
                f_logReport(Enum_logState.Error, str_report.Replace(cls_base.NEW_LINE, ""));
                return(null);
            }
            str_report = str_report.Replace(cls_base.OK_FEEDBACK, "");
            if (str_report == "")
            {
                return(null);
            }

            DataTable obj_receivedSMS = new DataTable();

            obj_receivedSMS.Columns.Add("phone");
            obj_receivedSMS.Columns.Add("message");
            obj_receivedSMS.Columns.Add("date");

            ///get respnces in parts
            ///
            string[] str_data = str_report.Split(new string[] { "+CMGL: ", cls_base.NEW_LINE }, StringSplitOptions.RemoveEmptyEntries);
            List <cls_CMGLResponse> obj_responses = new List <cls_CMGLResponse>();

            for (int i = 0; i < str_data.Length; i = i + 2)
            {
                string[] obj_strResp = str_data[i].Split(new string[] { "," }, StringSplitOptions.None);
                obj_responses.Add(new cls_CMGLResponse
                {
                    p_pdu = str_data[i + 1]
                    ,
                    p_idx = int.Parse(obj_strResp[0])
                    ,
                    p_state = int.Parse(obj_strResp[1])
                    ,
                    p_alpha = 0
                    ,
                    p_lenght = int.Parse(obj_strResp[3])
                });
            }

            ///this list , contain complete smses to delete from a SIM
            ///
            List <cls_CMGLResponse> obj_deleteResponses = new List <cls_CMGLResponse>();

            ///this list , catch the same smses to find that sms is complete receive or not
            ///
            List <cls_CMGLResponse> obj_tempResponses = new List <cls_CMGLResponse>();

            List <SmsPdu> obj_lstPDUs = new List <SmsPdu>();

            try
            {
                string str_smsText = "";

                for (int i = 0; i < obj_responses.Count; i++)
                {
                    str_smsText = "";
                    IncomingSmsPdu obj_pdu    = (IncomingSmsPdu)SmsDeliverPdu.Decode(obj_responses[0].p_pdu, true);
                    bool           isComplete = false;

                    obj_tempResponses.Add(obj_responses[i]);
                    obj_lstPDUs.Add(obj_pdu);

                    ///To know sms has other parts or not
                    ///
                    if (!SmartMessageDecoder.AreAllConcatPartsPresent(obj_lstPDUs))
                    {
                        for (int j = i + 1; (j < obj_responses.Count) && !SmartMessageDecoder.AreAllConcatPartsPresent(obj_lstPDUs); j++)
                        {
                            obj_pdu = (SmsDeliverPdu)SmsDeliverPdu.Decode(obj_responses[j].p_pdu, true);
                            if (SmartMessageDecoder.ArePartOfSameMessage(obj_lstPDUs[0], obj_pdu))
                            {
                                obj_tempResponses.Add(obj_responses[j]);
                                obj_lstPDUs.Add(obj_pdu);
                            }
                        }
                        if (SmartMessageDecoder.AreAllConcatPartsPresent(obj_lstPDUs))
                        {
                            str_smsText = SmartMessageDecoder.CombineConcatMessageText(obj_lstPDUs);
                            isComplete  = true;
                        }
                    }
                    else
                    {
                        str_smsText = SmartMessageDecoder.CombineConcatMessageText(obj_lstPDUs);
                        isComplete  = true;
                    }

                    for (int k = 0; k < obj_tempResponses.Count; k++)
                    {
                        obj_responses.Remove(obj_tempResponses[k]);
                        i--;
                    }

                    ///update DB and datagrid
                    if (isComplete)
                    {
                        obj_deleteResponses.AddRange(obj_tempResponses);

                        DataRow obj_dtRow = obj_receivedSMS.NewRow();
                        obj_dtRow["phone"]   = ((SmsDeliverPdu)obj_lstPDUs[0]).OriginatingAddress;
                        obj_dtRow["message"] = str_smsText;
                        obj_dtRow["date"]    = ((SmsDeliverPdu)obj_lstPDUs[0]).GetTimestamp().ToDateTime().ToString();

                        obj_receivedSMS.Rows.Add(obj_dtRow);
                        f_logReport(Enum_logState.None, "Message received from \"" + ((SmsDeliverPdu)obj_lstPDUs[0]).OriginatingAddress + "\" " + DateTime.Now.ToLongTimeString());
                    }
                    else
                    {
                        long y = DateTime.Now.Ticks - ((SmsDeliverPdu)obj_lstPDUs[0]).GetTimestamp().ToDateTime().Ticks;
                        if (y > 1800000)
                        {
                            obj_deleteResponses.AddRange(obj_tempResponses);
                        }
                    }

                    obj_tempResponses.Clear();
                    obj_lstPDUs.Clear();
                }
            }
            catch (Exception exp)
            {
                f_logReport(Enum_logState.Error, exp.Message + exp.StackTrace);
            }

            ///delete sms from memory
            ///
            try
            {
                m_semaphoreWriteSMS.WaitOne();

                for (int i = 0; i < obj_deleteResponses.Count; i++)
                {
                    string strCmd = "at+cmgd=" + obj_deleteResponses[i].p_idx.ToString() + ",0\r";
                    cls_Modem.p_getInstance.f_write(strCmd);
                    strCmd = cls_Modem.p_getInstance.f_readFeedback();
                }

                m_semaphoreWriteSMS.Release();
            }
            catch (Exception exp)
            {
                f_logReport(Enum_logState.Error, exp.Message + exp.StackTrace);
            }

            return(obj_receivedSMS);
        }
Beispiel #5
0
        /// <summary>
        /// Returns List Messages.
        /// </summary>
        /// <param name="status">Select status of the message</param>
        public List <BaseResult <SMSReadResult> > Read(SMSStatus status)
        {
            List <BaseResult <SMSReadResult> > listReads = new List <BaseResult <SMSReadResult> >();

            System.Diagnostics.Stopwatch sp = new System.Diagnostics.Stopwatch();

            BaseResult <GenericTypeResult <PhoneActivityStatus> > activityStatus = Connection.GetActivityStatus();

            if (activityStatus.Response.Result != PhoneActivityStatus.Ready)
            {
                return(listReads);
            }

            SetMessageFormat(Connection.PDUMode);
            string readValue = "ALL";
            string response;
            Regex  regexReadPattern;

            if (Connection.PDUMode)
            {
                regexReadPattern = new Regex("\\+CMGL: (\\d+),(\\d+),(?:\"(.*[A-Z0-9-_ ].*)\")?,(\\d+)\\r(\\w+)");
                switch (status)
                {
                case SMSStatus.ReceivedUnreadMessage:
                    readValue = "0";
                    break;

                case SMSStatus.ReceivedReadMessage:
                    readValue = "1";
                    break;

                case SMSStatus.StoredUnsentMessage:
                    readValue = "2";
                    break;

                case SMSStatus.StoredSentMessage:
                    readValue = "3";
                    break;

                case SMSStatus.AllMessages:
                    readValue = "4";
                    break;
                }
            }
            else
            {
                regexReadPattern = new Regex(@"\+CMGL: (\d+)," + (char)34 + "(.*[A-Z0-9-_ ].*)" + (char)34 + "," + (char)34 + "(.*[0-9-_ +].*)" + (char)34 + ",(?:\"(.*[A-Z0-9-_ ].*)\")?," + @"(.*[0-9-_ +/:].*)" + "\r([ 0-9A-Za-z#$%=@!{},`~&*()'<>?.:;_|^/+\t\r\n\\[\\]\"-]([^(CMGL)]+)*)");
                switch (status)
                {
                case SMSStatus.ReceivedUnreadMessage:
                    readValue = "\"REC UNREAD\"";
                    break;

                case SMSStatus.ReceivedReadMessage:
                    readValue = "\"REC READ\"";
                    break;

                case SMSStatus.StoredUnsentMessage:
                    readValue = "\"STO UNSENT\"";
                    break;

                case SMSStatus.StoredSentMessage:
                    readValue = "\"STO SENT\"";
                    break;

                case SMSStatus.AllMessages:
                    readValue = "\"ALL\"";
                    break;
                }
            }
            Connection.Connector.DiscardBuffer();

            sp.Start();
            response = Connection.Connector.Execute(Command.Set(Commands.CMGL, readValue));
            sp.Stop();

            int index = 1;
            BaseResult <SMSReadResult> smp;

            for (Match match = regexReadPattern.Match(response); match.Success; match = match.NextMatch())
            {
                IncomingSmsPdu sms = IncomingSmsPdu.Decode(match.Groups[5].Value, true);

                if (!string.IsNullOrEmpty(match.Groups[1].Value))
                {
                    index = int.Parse(match.Groups[1].Value);
                }
                SMSReadResult read = new SMSReadResult(index,
                                                       ((GSMCommunication.PDUDecoder.SmsDeliverPdu)(sms)).OriginatingAddress,
                                                       ((GSMCommunication.PDUDecoder.SmsDeliverPdu)(sms)).UserDataText,
                                                       ((GSMCommunication.PDUDecoder.SmsDeliverPdu)(sms)).SCTimestamp.ToDateTime(),
                                                       match.Groups[2].Value,
                                                       Connection.Operator);
                smp               = new BaseResult <SMSReadResult>();
                smp.Response      = read;
                smp.ExecutionTime = sp.Elapsed;
                listReads.Add(smp);
            }
            return(listReads);
        }