Exemplo n.º 1
0
        /// <summary>
        /// Lese Statusreport-SMS Modemspeicher, melde und lösche den Statusreport anschließend.
        /// ACHTUNG: Überprüfung des Reports
        /// </summary>
        /// <param name="input"></param>
        private static void ParseStatusReport(string input)
        {
            if (input == null)
            {
                return;
            }
            try
            {
                //+CMGL: < index > ,  < stat > ,  < fo > ,  < mr > , [ < ra > ], [ < tora > ],  < scts > ,  < dt > ,  < st >
                //[... ]
                //OK
                //<st> 0-31 erfolgreich versandt; 32-63 versucht weiter zu senden: 64-127 Sendeversuch abgebrochen

                //z.B.: +CMGL: 1,"REC READ",6,34,,,"20/11/06,16:08:45+04","20/11/06,16:08:50+04",0
                //Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",(\d+),(\d+),,,""(.+)"",""(.+)"",(\d+)\r\n");
                Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",(\d+),(\d+),,,""(.+)"",""(.+)"",(\d+)");
                Match m = r.Match(input);

                while (m.Success)
                {
                    Sms smsReport = new Sms();
                    smsReport.SetIndex(m.Groups[1].Value);                                         //<index>
                    smsReport.Status           = m.Groups[2].Value;                                //<stat>
                    smsReport.FirstOctet       = byte.Parse(m.Groups[3].Value);                    //<fo>
                    smsReport.MessageReference = byte.Parse(m.Groups[4].Value);                    //<mr>
                    //sms.SmsProviderTimeStamp = GsmConverter.ReadDateTime(m.Groups[5].Value); //<scts: ServiceCenterTimeStamp>
                    smsReport.SmsProviderTimeStamp = GsmConverter.ReadDateTime(m.Groups[6].Value); //<dt: DischargeTime>
                    smsReport.SendStatus           = byte.Parse(m.Groups[7].Value);                //<st>

                    //Für Wiedererkennung Werte aus 'Orignal-SMS' einfügen
                    Sms smsTracking = SmsTrackingQueue.Find(x => x.MessageReference == smsReport.MessageReference);

                    if (smsTracking != null)
                    {
                        smsReport.Message = smsTracking.Message;
                        smsReport.Phone   = smsTracking.Phone;

                        SmsTrackingQueue.Remove(smsTracking);
                        MelBox2.GlobalProperty.SmsPendingReports = SmsTrackingQueue.Count;
                    }

                    if (smsReport.Status == "REC UNREAD" || smsReport.Status == "REC READ")
                    {
                        RaiseSmsStatusreportEvent(smsReport);
#if DEBUG
                        DebugShowSms(smsReport, "Sendebestätigung von Modem");
#endif
                        SmsToDelete.Add(smsReport.Index);
                    }

                    m = m.NextMatch();
                }

                SmsDeletePending();
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("ParseStatusReport() {0}\r\n{1}\r\n{2}", ex.GetType(), ex.Message, ex.InnerException));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Lese die Referenz einer zuvor gesendeten Nachricht aus und weise sie der gesendeten SMS zu.
        /// Gebe das Senden der nächsten SMS frei.
        /// </summary>
        /// <param name="input"></param>
        private static void ParseSmsReference(string input)
        {
            if (input == null)
            {
                return;
            }
            //CMGS=[...]    CMSS=[...]

            /* z.B.
             +CMGS: 67       +CMSS: 67
             * OK              OK
             */

            Regex r = new Regex(@"\+CM[GS]S: (\d+)");
            Match m = r.Match(input);

            while (m.Success)
            {
                if (byte.TryParse(m.Groups[1].Value, out byte trackingId))
                {
                    if (CurrentSmsSend == null)
                    {
                        //Fehler: Empfangsbestätigung, aber keine SMS gesendet
                        Gsm_Basics.RaiseGsmEvent(GsmEventArgs.Telegram.GsmError, string.Format("Erhaltene Empfangsbestätigung {0} konnte nicht zugewiesen werden.", trackingId), trackingId);
                        break;
                    }

                    Console.WriteLine("Tracking-ID {0} erfasst für Nachricht an:\r\n+{1}\r\n{2}", trackingId, CurrentSmsSend.Phone, CurrentSmsSend.Message);

                    CurrentSmsSend.MessageReference     = trackingId;
                    CurrentSmsSend.SmsProviderTimeStamp = DateTime.UtcNow; // für Timeout Sendungsverfolgung

                    SmsTrackingQueue.Add(CurrentSmsSend);
                    MelBox2.GlobalProperty.SmsPendingReports = SmsTrackingQueue.Count;

                    RaiseSmsSentEvent(CurrentSmsSend);

                    //Wieder frei machen für nächste zu sendende SMS
                    CurrentSmsSend = null;

                    //Nächste Nachricht senden
                    //SmsSendFromList();
                }

                m = m.NextMatch();
            }
        }