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