Esempio 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));
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Lese SMS-Textnachricht aus Modemspeicher, melde und lösche die Nachricht anschließend.
        /// </summary>
        /// <param name="input"></param>
        private static void ParseSmsMessages(string input)
        {
            if (input == null)
            {
                return;
            }
            try
            {
                #region comment

                /*
                 +CMGL: <index> ,  <stat> ,  <oa> / <da> , [ <alpha> ], [ <scts> ][,  <tooa> / <toda> ,  <length> ]
                 * <data>
                 * [... ]
                 * OK
                 *
                 +CMGL: 9,"REC READ","+4917681371522",,"20/11/08,13:47:10+04"
                 * Ein Test 08.11.2020 13:46 PS sms38.de
                 * //*/
                #endregion

                Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""(.+|\n)+?(?=OK)"); //SAMBA75
                //Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)\r\n"); //SAMBA75
                //Regex r = new Regex(@"(\d+),(.+\s.+),(.+),(.+),(.+),(.+),(.+)\n{2}"); //SAMSUNG GALAXY A3
                Match m = r.Match(input.Replace('\n', ' '));

                while (m.Success)
                {
                    Sms sms = new Sms();
                    sms.SetIndex(m.Groups[1].Value);
                    sms.Status = m.Groups[2].Value;
                    sms.Phone  = GsmConverter.StrToPhone(m.Groups[3].Value);
                    sms.Name   = m.Groups[4].Value;
                    sms.SetTimeStamp(m.Groups[5].Value);
                    sms.Message = m.Groups[6].Value;

                    if (sms.Status == "REC UNREAD" || sms.Status == "REC READ")
                    {
                        RaiseSmsRecievedEvent(sms);
#if DEBUG
                        DebugShowSms(sms, "SMS von Modem");
#endif
                        SmsToDelete.Add(sms.Index);
                    }

                    m = m.NextMatch();
                }

                SmsDeletePending();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public void SetPhone(string strPhone)
 {
     Phone = GsmConverter.StrToPhone(strPhone);
 }
 /// <summary>
 /// TP-Discharge-Time in time-string format: "yy/MM/dd,hh:mm:ss+zz", where characters indicate year
 /// (two last digits), month, day, hour, minutes, seconds and time zone.For example, 6th of May 1994, 22:10:00
 /// GMT+2 hours equals "94/05/06,22:10:00+08"
 /// </summary>
 /// <param name="strDateTime"></param>
 public void SetTimeStamp(string strDateTime)
 {
     SmsProviderTimeStamp = GsmConverter.ReadDateTime(strDateTime);
 }
        /// <summary>
        /// Verarbeitet die Anfrage aus dem Formular 'Benutzerkonto'
        /// </summary>
        /// <param name="args"></param>
        /// <param name="createNewAccount">Soll ein neuer Benutzer erstellt werden?</param>
        /// <returns>html - Rückmeldung der ausgeführten Operation</returns>
        public static string ProcessFormAccount(Dictionary <string, string> args, bool createNewAccount)
        {
            StringBuilder builder = new StringBuilder();

            int    contactId     = 0;
            string name          = "-KEIN NAME-";
            string password      = null;
            int    companyId     = -1;
            string email         = null;
            ulong  phone         = 0;
            int    sendSms       = 0; //Hinweis: <input type='checkbox' > wird nur übertragen, wenn angehakt => immer zurücksetzten, wenn nicht gesetzt
            int    sendEmail     = 0;
            int    maxInactivity = -1;

            foreach (string arg in args.Keys)
            {
                switch (arg)
                {
                //case "pageTitle":
                //    if (args[arg] != "Benutzerkonto")
                //    {
                //        builder.Append(MelBoxWeb.HtmlAlert(1, "Ungültiger Aufruf", "Aufruf von ungültiger Stelle."));
                //    }
                //    break;
                case "ContactId":
                    contactId = int.Parse(args[arg]);
                    break;

                case "Name":
                    name = args[arg];    //.Replace('+', ' ');
                    break;

                case "Passwort":
                    if (args[arg].Length > 1)
                    {
                        password = args[arg];
                    }
                    break;

                case "CompanyId":
                    companyId = int.Parse(args[arg]);
                    break;

                case "Email":
                    email = args[arg];
                    break;

                case "Telefon":
                    phone = GsmConverter.StrToPhone(args[arg]);
                    break;

                case "Max_Inaktiv":
                    maxInactivity = int.Parse(args[arg]);
                    break;

                case "SendSms":
                    if (args[arg].ToLower() == "on")
                    {
                        sendSms = 1;
                    }
                    else
                    {
                        sendSms = 0;
                    }
                    break;

                case "SendEmail":
                    if (args[arg].ToLower() == "on")
                    {
                        sendEmail = 1;
                    }
                    else
                    {
                        sendEmail = 0;
                    }
                    break;

                default:
                    break;
                }
            }

            if (createNewAccount)
            {
                if (password == null || password.Length < 4)
                {
                    builder.Append(MelBoxWeb.HtmlAlert(2, "Fehler - Passwort ungültig", "Das vergebene Passwort entspricht nicht den Vorgaben. Der Benutzer wird nicht erstellt."));
                }
                else
                {
                    int newId = Program.Sql.InsertContact(name, password, companyId, email, phone, maxInactivity, sendSms == 1, sendEmail == 1);
                    if (newId == 0)
                    {
                        builder.Append(MelBoxWeb.HtmlAlert(1, "Fehler beim Schreiben in die Datenbank", "Der Benutzer '" + name + "' konnte nicht erstellt werden."));
                    }
                    else
                    {
                        builder.Append(MelBoxWeb.HtmlAlert(3, "Benutzer '" + name + "' erstellt", "Der Benutzer '" + name + "' wurde in der Datenbank neu erstellt."));
                    }
                }
            }
            else
            {
                if (!Program.Sql.UpdateContact(contactId, name, password, companyId, phone, sendSms, email, sendEmail, string.Empty, maxInactivity))
                {
                    builder.Append(MelBoxWeb.HtmlAlert(2, "Keine Änderungen für Benutzer '" + name + "'", "Die Änderungen konnten nicht in die Datenbank übertragen werden."));
                }
                else
                {
                    builder.Append(MelBoxWeb.HtmlAlert(3, "Änderungen für Benutzer '" + name + "' übernommen", "Die Änderungen an Benutzer '" + name + "' wurden in der Datenbank gespeichert."));
                }
            }

            return(builder.ToString());
        }
Esempio n. 6
0
        /// <summary>
        /// Wird bei jedem Empfang von Daten durch COM aufgerufen!
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void ParseGsmRecEvent(object sender, GsmEventArgs e)
        {
            if (e.Type != GsmEventArgs.Telegram.GsmRec)
            {
                return;
            }

            string input = e.Message;

            if (input == null)
            {
                return;
            }
            if (input == "\r\nOK\r\n")
            {
                return;
            }

            #region SMS-Verarbeitung
            //COM-Antwort auf Gesendete SMS: Referenzzuweisung für Empfangsbestätigung
            if (input.Contains("+CMGS:") || input.Contains("+CMSS:")) //
            {
                ParseSmsReference(input);
            }

            //Liste der Nachrichten im GSM-Speicher
            if (input.Contains("+CMGL:"))
            {
                //Empfangsbestätigungen lesen
                ParseStatusReport(input);
                SmsDeletePending();

                //Empfangen neuer Nachrichten
                ParseSmsMessages(input);
                SmsDeletePending();
            }

            //Indikator neuen Statusreport empfangen
            if (input.Contains("+CDSI:"))
            {
                /*
                 * Meldung einer neu eingegangenen Nachricht von GSM-Modem
                 *
                 * Neuen Statusreport empfangen:
                 * bei AT+CNMI= [ <mode> ][,  <mt> ][,  <bm> ][,  2 ][,  <bfr> ]
                 * erwartete Antwort: +CDSI: <mem3>, <index>
                 * //*/

                ReadGsmMemory();
            }

            //Indikator neue SMS empfangen
            if (input.Contains("+CMTI:"))
            {
                /*
                 * Meldung einer neu eingegangenen Nachricht von GSM-Modem
                 *
                 * Neue SMS emfangen:
                 * bei AT+CNMI= [ <mode> ][,  1 ][,  <bm> ][,  <ds> ][,  <bfr> ]
                 * erwartete Antwort: +CMTI: <mem3>, <index>
                 * //*/
                ReadGsmMemory();
            }

            //Fehlermeldung von Modem bei SMS senden oder Empfangen
            if (input.Contains("+CMS ERROR:"))
            {
                Gsm_Basics.RaiseGsmEvent(GsmEventArgs.Telegram.GsmError, "Am GSM-Modem ist ein Fehler beim Senden oder Empfangen einer SMSM aufgetreten", input);
            }
            #endregion

            #region Sprachanruf
            //+CRING: VOICE
            if (input.Contains("+CRING: VOICE"))
            {
                Email.VoiceCallRing();
            }
            #endregion

            #region SIM-Status
            //GSM-Signalqualität
            if (input.Contains("+CSQ:"))
            {
                //+CSQ: <rssi> , <ber>
                //<rssi> Mögliche Werte: 2 - 9 marginal, 10 - 14 OK, 15 - 19 Good, 20 - 30 Excellent, 99 = kein Signal
                //<ber> Bit-Error-Rate: 0 bis 7 = Sprachqualität absteigend, 99 = unbekannt
                Regex rS = new Regex(@"CSQ:\s([0-9]+),([0-9]+)");
                Match m  = rS.Match(input);

                if (!int.TryParse(m.Groups[1].Value, out int rawQuality))
                {
                    return;
                }
                int qualityPercent = 0;

                if (rawQuality < 99)
                {
                    qualityPercent = rawQuality * 100 / 31;
                }

                while (m.Success)
                {
                    RaiseGsmSignalQualityEvent(new GsmEventArgs(GsmEventArgs.Telegram.GsmSignal, string.Format("GSM Signalstärke {0:00}%", qualityPercent), qualityPercent));
                    m = m.NextMatch();
                }
            }

            //Eigene Rufnummer lesen
            if (input.Contains("+CNUM:"))
            {
                Regex r = new Regex(@"\+CNUM: ""(.+)"",""(.+)"",(.*)"); //SAMBA75
                Match m = r.Match(input);

                //Console.WriteLine(input);
                while (m.Success)
                {
                    string name     = m.Groups[1].Value;
                    string strPhone = m.Groups[2].Value;

                    Gsm_Basics.RaiseGsmEvent(GsmEventArgs.Telegram.GsmOwnPhone, string.Format("Eigene Nummer: '{0}' {1}", name, strPhone), GsmConverter.StrToPhone(strPhone));
                    m = m.NextMatch();
                }
            }

            //BAUSTELLE
            //Herstellername Modem
            if (input.Contains("+CGMI:"))
            {
                Regex r = new Regex(@"\+CGMI\n(.+)");
                Match m = r.Match(input);

                if (m.Success)
                {
                    GlobalProperty.ModemManufacturer = m.Groups[1].Value;
                }
            }

            //BAUSTELLE
            //SMS Service-Center Adresse // +CSCA: "+491710760000",145  //+CSCA: "+491710760000",145
            if (input.Contains("+CSCA: "))
            {
                //+CSCA: "+491710760000",145
                Regex r = new Regex(@"\+CSCA: ""(.+)"",(\d+)");
                Match m = r.Match(input);

                if (m.Success)
                {
                    GlobalProperty.NetworkServiceCenterNumber = m.Groups[1].Value;
                }
            }

            //SIM-Schubfach / SIM erkannt
            if (input.Contains("^SCKS:"))
            {
                //Antwort auf 'AT^SCKS?':   '^SCKS: <mode>,<SimStatus>'
                Regex r = new Regex(@"\^SCKS: (\d+),(\d+)");
                Match m = r.Match(input);

                if (m.Success)
                {
                    if (int.TryParse(m.Groups[2].Value, out int simCardHolderStatus))
                    {
                        if (simCardHolderStatus == 1)
                        {
                            GlobalProperty.SimHolderDetected = true;
                        }
                        else
                        {
                            GlobalProperty.SimHolderDetected = false;
                        }
                    }
                }

                else
                {
                    //Meldung von Modem nach Ereignis 'Sim-Schublade'
                    r = new Regex(@"\^SCKS: (\d+)");
                    m = r.Match(input);

                    if (m.Success)
                    {
                        if (int.TryParse(m.Groups[1].Value, out int simCardHolderStatus))
                        {
                            if (simCardHolderStatus == 1)
                            {
                                GlobalProperty.SimHolderDetected = true;
                            }
                            else
                            {
                                GlobalProperty.SimHolderDetected = false;
                            }
                        }
                    }
                }
            }

            //Registrierung im Mobilfunknetz
            if (input.Contains("+CREG:"))
            {
                Regex r = new Regex(@"\+CREG: (\d),(\d)"); //SAMBA75
                Match m = r.Match(input);

                while (m.Success)
                {
                    if (int.TryParse(m.Groups[2].Value, out int networkRegStatus))
                    {
                        switch (networkRegStatus)
                        {
                        case 0:
                            GlobalProperty.NetworkRegistrationStatus = "nicht registriert";
                            break;

                        case 1:
                            GlobalProperty.NetworkRegistrationStatus = "registriert";

                            SetupGsm(null, null);
                            break;

                        case 2:
                            GlobalProperty.NetworkRegistrationStatus = "Netzsuche";
                            break;

                        case 3:
                            GlobalProperty.NetworkRegistrationStatus = "Registrierung abgelehnt";
                            break;

                        case 5:
                            GlobalProperty.NetworkRegistrationStatus = "Roaming";
                            break;

                        default:
                            GlobalProperty.NetworkRegistrationStatus = "unbekannt";
                            break;
                        }
                    }

                    m = m.NextMatch();
                }
                if (input.Contains("+CREG: 0,0"))
                {
                    Gsm_Basics.RaiseGsmEvent(GsmEventArgs.Telegram.GsmError, "Das GSM-Modem ist nicht im Mobilfunknetz angemeldet.");
                }
            }

            //Anbietername Mobilfunknetz
            if (input.Contains("+COPS:"))
            {
                Regex r = new Regex(@"\+COPS: (\d),(\d),""(.*)"""); //z.B. +COPS: 0,0,"T-Mobile D"

                Match m = r.Match(input);

                while (m.Success)
                {
                    GlobalProperty.NetworkProviderName = m.Groups[3].Value;

                    m = m.NextMatch();
                }
            }

            #endregion
        }