Example #1
0
        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);
            }
        }
Example #2
0
 /// <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);
 }
Example #3
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);
        }