private void Receiver_MessageReceived(object sender, MessageReceivedEventArgs e) { var comm = sender as SmsModemBlock; var messagelist = comm.ReadRawMessages(PhoneMessageStatus.All, PhoneStorageType.Sim); var messageString = string.Empty; StringBuilder sb = new StringBuilder(); if (messagelist.Length > 0) { // на случай, если длинное сообщение IList <SmsPdu> longMsg = new List <SmsPdu>(); foreach (ShortMessageFromPhone message in messagelist) { //сырая хуета var pdu = new SmsDeliverPdu(message.Data, true, -1); var origin = pdu.OriginatingAddress; var txt = pdu.UserDataText; bool isMultiPart = SmartMessageDecoder.IsPartOfConcatMessage(pdu); // если у сообщения есть датахедер, то скорее всего оно длинное if (pdu.UserDataHeaderPresent && isMultiPart) { if (longMsg.Count == 0 || SmartMessageDecoder.ArePartOfSameMessage(longMsg.Last(), pdu)) { longMsg.Add(pdu); } if (SmartMessageDecoder.AreAllConcatPartsPresent(longMsg)) // is Complete { txt = SmartMessageDecoder.CombineConcatMessageText(longMsg); } else { continue; } } sb.AppendFormat("{0}: {1}", origin, txt); } var sms = sb.ToString(); _hub.Invoke("SmsReceived", sms, comm.CurrentCommandID).Wait(); comm.SetWaiting(false); //Subscriptions.Remove(comm); } }
/// <summary> /// Обрабатывает длинные сообщения /// </summary> /// <param name="SMSPDU">Само сообщение</param> /// <param name="longMsg">Коллекция объектов <see cref="SmsPdu"/>, являющихся частями длинного сообщения</param> /// <param name="prevMsg">Предыдущее сообщение</param> public RecievedSMS DecodeLongMessage(SmsDeliverPdu SMSPDU) { if (longMsg.Count == 0 || SmartMessageDecoder.ArePartOfSameMessage(longMsg.Last(), SMSPDU)) { longMsg.Add(SMSPDU); } else if (prevMsg != null && SmartMessageDecoder.ArePartOfSameMessage(SMSPDU, prevMsg)) { longMsg.Clear(); longMsg.Add(SMSPDU); } prevMsg = SMSPDU; if (SmartMessageDecoder.AreAllConcatPartsPresent(longMsg)) // is Complete { var txt = SmartMessageDecoder.CombineConcatMessageText(longMsg); // создаем сообщение RecievedSMS longMessage = new RecievedSMS(i, "REC_READ", SMSPDU.OriginatingAddress, SMSPDU.SCTimestamp, txt); // очищаем за собой longMsg.Clear(); return(longMessage); } return(null); }
/// <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); }