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