/// <summary> /// Stellt eine zu sendende SMS in die Liste zur Abarbeitung /// </summary> /// <param name="phone">Telefonnummer an die diese SMS gesendet werden soll (als Zahl mit Ländervorwahl).</param> /// <param name="content">Inhalt der SMS, wird ggf. auf max. 160 Zeichen gekürzt.</param> public static void SmsSend(ulong phone, string content) { //Ist diese SMS schon in der Warteschleife? List <Sms> results = SmsSendQueue.FindAll(x => x.Phone == phone && x.Message == content); if (results.Count == 0) { content.Replace("\r\n", " "); if (content.Length > 160) { content = content.Substring(0, 160); } Sms sms = new Sms { Message = content, Phone = phone }; SmsSendQueue.Add(sms); SmsSendFromList(); } }
/// <summary> /// Sendet die erste SMS aus der Sendeliste /// Sperrt weiteres SMS-senden, bis der gesendeten SMS vom Modem eine Referenz zugewiesen wurde. /// </summary> private static void SmsSendFromList() { //CurrentSmsSend wird zur Sendefreigabe auf null gesetzt. Siehe Modem-Antwort '+CMGS: <mr>' if (SmsSendQueue.Count == 0) { return; } if (CurrentSmsSend != null) { Gsm_Basics.RaiseGsmEvent(GsmEventArgs.Telegram.GsmSystem, "SMS-Sendeplatz noch nicht frei. Warte auf: " + CurrentSmsSend.Message); return; } Console.WriteLine("### zu sendende SMSen {0} ###", SmsSendQueue.Count); foreach (Sms sms in SmsSendQueue) { Console.WriteLine("Index: {0}\tAn: {1}\t{2}", sms.Index, sms.Phone, sms.Message); } CurrentSmsSend = SmsSendQueue.FirstOrDefault(); SmsSendQueue.Remove(SmsSendQueue.FirstOrDefault()); //.RemoveAt(0); GlobalProperty.LastSmsSend = CurrentSmsSend.Message; const string ctrlz = "\u001a"; //Senden Gsm_Basics.AddAtCommand("AT+CMGS=\"+" + CurrentSmsSend.Phone + "\"\r"); Gsm_Basics.AddAtCommand(CurrentSmsSend.Message + ctrlz); //Danach warten auf Antwort von GSM-Modem '+CMGS: <mr>' um CurrentSmsSend die Referenz für Empfangsbestätigung zuzuweisen. //Nach Zuweisung der Referenz: //1) CurrentSmsSend als gesendete SMS in DB schreiben //2) CurrentSmsSend = null setzen //3) diese Methode erneut aufrufen. }