C# 利用AT指令开发短信功能

xiaoxiao2021-02-28  8

论坛中看到的AT发送短信的代码,可以学习用

[csharp] view plain copy print ? namespace ModemImpl {      public class Modem {          public bool IsOpen { get { return isOpen; } }             public Modem(string portName) {              this.portName = portName;                 Regex r1 = new Regex(@"^\+CMTI\:");              Regex r2 = new Regex(@"^\+CMGR\:");              Regex r3 = new Regex(@"^\+RING\:");                 ATBeginHandlerMap.Add(r1, OnBeginCMTI);              ATBeginHandlerMap.Add(r2, OnBeginCMGR);              ATBeginHandlerMap.Add(r3, OnBeginRING);                 ATHandlerMap.Add(r1, OnCMTI);              ATHandlerMap.Add(r2, OnCMGR);              ATHandlerMap.Add(r3, OnRING);                 responseMap.Add(typeof(SendMessageRequest), OnCMGSResponse);          }             public void Open() {              port = new SerialPort(portName);              port.Encoding = Encoding.Default;              port.ReadTimeout = 30000;              port.WriteTimeout = 30000;              port.BaudRate = 9600;              port.RtsEnable = true;                 port.Open();              port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);                 AddRequestToQueue(new SettingReuqest("AT").Execute(port));              Thread.Sleep(50);              AddRequestToQueue(new SettingReuqest("ATE0").Execute(port));              AddRequestToQueue(new SettingReuqest("AT+CMGF=1").Execute(port));              AddRequestToQueue(new SettingReuqest("AT+CNMI=2,1").Execute(port));              AddRequestToQueue(new SettingReuqest("AT+CSMP=49,167,0,8").Execute(port));                 isOpen = true;          }             public void Close() {              port.DataReceived -= port_DataReceived;              port.Close();              isOpen = false;          }             public void Send(Message arg) {              if (arg.Text.Length > 70) {                  throw new ArgumentOutOfRangeException("短信不能超过70个字符");              }                 AddRequestToQueue(new SendMessageRequest(arg).Execute(port));          }             // ----------------------------------------------------------------------          private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {              string line = string.Empty;                 try {                  while (port.BytesToRead > 0) {                      line = port.ReadLine();                      if (!string.IsNullOrEmpty(line) && "\r" != line) {                          Console.WriteLine(line);                          receiveBuffer.Add(line);                             if (!isInterrupt) {                              if (IsBeginInterrupt(line)) {                                  if (IsEndInterrupt()) {                                      EndInterrupt();                                  }                              } else {                                  string c = line.TrimEnd('\r');                                  if ("OK" == c || "ERROR" == c) {                                      var response = new ModemResponse(receiveBuffer);                                      response.Request = requestQueue.Dequeue();                                      Type t = response.Request.GetType();                                      if (responseMap.ContainsKey(t)) {                                          responseMap[t](response);                                      }                                      receiveBuffer.Clear();                                  }                              }                          } else {                              if (IsEndInterrupt()) {                                  EndInterrupt();                              }                          }                      }                  }              } catch (Exception ex) {                  Trace.WriteLine(ex);              }          }             private void EndInterrupt() {              interruptHandler(receiveBuffer);                 beginInterruptHandler = null;              interruptHandler = null;              receiveBuffer.Clear();          }             private bool IsEndInterrupt() {              Trace.Assert(beginInterruptHandler != null);              bool result = false;              if (beginInterruptHandler(receiveBuffer)) {                  result = true;              }              return result;          }             private bool IsBeginInterrupt(string arg) {              bool result = false;                 foreach (var each in ATBeginHandlerMap.Keys) {                  if (each.IsMatch(arg)) {                      beginInterruptHandler = ATBeginHandlerMap[each];                      interruptHandler = ATHandlerMap[each];                      result = true;                      break;                  }              }                 return result;          }             private bool OnBeginCMTI(List<string> content) {              return true;          }             private void OnCMTI(List<string> content) {              // +CMTI:"SM",1              Regex pattern = new Regex(@"^\+CMTI:.+,(\d+)");              Match m = pattern.Match(content[0]);              index = Convert.ToInt32(m.Groups[1].Value);                 AddRequestToQueue(new RetrieveMessageReuqest(index).Execute(port));          }             private bool OnBeginCMGR(List<string> content) {              return (content.Count == 3);          }             private void OnCMGR(List<string> content) {              Regex pattern = new Regex("^\\+CMGR:.+,\"(\\S+)\",");                 Match m = pattern.Match(content[0]);              string address = m.Groups[1].Value;              if (address.StartsWith("+86")) {                  address = address.Substring(3);              }              string content1 = content[1].TrimEnd('\r');              if (content1.StartsWith("050003")) {                  content1 = content1.Substring(12);              }                 Message message = new Message(address, MessageHelper.MessageDecode(content1));              message.Raw = content[1].TrimEnd('\r');              message.Flags = MessageFlags.UNREAD;              message.CreatedAt = DateTime.Now;                 DeleteByIndex(index);              Receive(message);          }             private bool OnBeginRING(List<string> content) {              return true;          }             private void OnRING(List<string> content) {             }             private void OnCMGSResponse(ModemResponse response) {              SendResult(response);          }             private void DeleteByIndex(int index) {              port.Write(string.Format("AT+CMGD={0}\r", index));          }             private void AddRequestToQueue(ModemMessage arg) {              if (arg is ModemRequest) {                  requestQueue.Enqueue(arg as ModemRequest);              }          }             private List<string> receiveBuffer = new List<string>();          private ATReceivedEventHandler interruptHandler;          private ATBeginReceivedEventHandler beginInterruptHandler;          private bool isInterrupt { get { return beginInterruptHandler != null; } }             private Queue<ModemRequest> requestQueue = new Queue<ModemRequest>();          private Dictionary<Type, ModemResponseHandler> responseMap = new Dictionary<Type, ModemResponseHandler>();          private Dictionary<Regex, ATBeginReceivedEventHandler> ATBeginHandlerMap = new Dictionary<Regex, ATBeginReceivedEventHandler>();          private Dictionary<Regex, ATReceivedEventHandler> ATHandlerMap = new Dictionary<Regex, ATReceivedEventHandler>();          private string portName;          private SerialPort port;          private int index;          private bool isOpen = false;             public event MessageReceivedEventHandler Receive;          public event MessageSendEventHandler SendResult;      }         public abstract class ModemMessage {          public List<string> Content { getset; }          public virtual ModemMessage Execute(SerialPort port) { return this; }      }         public class ModemRequest : ModemMessage {         }         public class ModemResponse : ModemMessage {          public ModemRequest Request { getset; }             public ModemResponse(List<string> content) {              Content = content;          }      }         public class ModemNotify : ModemMessage { }      public class SettingReuqest : ModemRequest {          public SettingReuqest(string command) {              this.command = command;          }             public override ModemMessage Execute(SerialPort port) {              base.Execute(port);                 port.Write(command + "\r");                 return this;          }             private string command;      }      public class SendMessageRequest : ModemRequest {          public Message Message { getset; }             public SendMessageRequest(Message message) {              Message = message;          }             public override ModemMessage Execute(SerialPort port) {              base.Execute(port);                 try {                  port.DiscardInBuffer();                  port.Write(string.Format("AT+CMGS={0}\r", Message.Address));                  port.DiscardInBuffer();                  port.Write(MessageHelper.MessageEncode(Message.Text) + ControlZ + "\r");                  Message.Flags = MessageFlags.SENDED;                  Message.CreatedAt = DateTime.Now;              } catch (Exception) {                  Message.Flags = MessageFlags.SENDFAILED;                  Message.CreatedAt = DateTime.Now;                  throw;              }                 return this;          }             private const char ControlZ = (char)0x1A;      }         public class RetrieveMessageReuqest : ModemRequest {          public RetrieveMessageReuqest(int index) {              this.index = index;          }             public override ModemMessage Execute(SerialPort port) {              base.Execute(port);              port.Write(string.Format("AT+CMGR={0}\r", index));              return this;          }             private int index;      }             public delegate bool ATBeginReceivedEventHandler(List<string> content);      public delegate void ATReceivedEventHandler(List<string> content);      public delegate void ModemResponseHandler(ModemResponse response);      public delegate void MessageReceivedEventHandler(Message arg);      public delegate void MessageSendEventHandler(ModemResponse response);  }   namespace ModemImpl { public class Modem { public bool IsOpen { get { return isOpen; } } public Modem(string portName) { this.portName = portName; Regex r1 = new Regex(@"^\+CMTI\:"); Regex r2 = new Regex(@"^\+CMGR\:"); Regex r3 = new Regex(@"^\+RING\:"); ATBeginHandlerMap.Add(r1, OnBeginCMTI); ATBeginHandlerMap.Add(r2, OnBeginCMGR); ATBeginHandlerMap.Add(r3, OnBeginRING); ATHandlerMap.Add(r1, OnCMTI); ATHandlerMap.Add(r2, OnCMGR); ATHandlerMap.Add(r3, OnRING); responseMap.Add(typeof(SendMessageRequest), OnCMGSResponse); } public void Open() { port = new SerialPort(portName); port.Encoding = Encoding.Default; port.ReadTimeout = 30000; port.WriteTimeout = 30000; port.BaudRate = 9600; port.RtsEnable = true; port.Open(); port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); AddRequestToQueue(new SettingReuqest("AT").Execute(port)); Thread.Sleep(50); AddRequestToQueue(new SettingReuqest("ATE0").Execute(port)); AddRequestToQueue(new SettingReuqest("AT+CMGF=1").Execute(port)); AddRequestToQueue(new SettingReuqest("AT+CNMI=2,1").Execute(port)); AddRequestToQueue(new SettingReuqest("AT+CSMP=49,167,0,8").Execute(port)); isOpen = true; } public void Close() { port.DataReceived -= port_DataReceived; port.Close(); isOpen = false; } public void Send(Message arg) { if (arg.Text.Length > 70) { throw new ArgumentOutOfRangeException("短信不能超过70个字符"); } AddRequestToQueue(new SendMessageRequest(arg).Execute(port)); } // ---------------------------------------------------------------------- private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { string line = string.Empty; try { while (port.BytesToRead > 0) { line = port.ReadLine(); if (!string.IsNullOrEmpty(line) && "\r" != line) { Console.WriteLine(line); receiveBuffer.Add(line); if (!isInterrupt) { if (IsBeginInterrupt(line)) { if (IsEndInterrupt()) { EndInterrupt(); } } else { string c = line.TrimEnd('\r'); if ("OK" == c || "ERROR" == c) { var response = new ModemResponse(receiveBuffer); response.Request = requestQueue.Dequeue(); Type t = response.Request.GetType(); if (responseMap.ContainsKey(t)) { responseMap[t](response); } receiveBuffer.Clear(); } } } else { if (IsEndInterrupt()) { EndInterrupt(); } } } } } catch (Exception ex) { Trace.WriteLine(ex); } } private void EndInterrupt() { interruptHandler(receiveBuffer); beginInterruptHandler = null; interruptHandler = null; receiveBuffer.Clear(); } private bool IsEndInterrupt() { Trace.Assert(beginInterruptHandler != null); bool result = false; if (beginInterruptHandler(receiveBuffer)) { result = true; } return result; } private bool IsBeginInterrupt(string arg) { bool result = false; foreach (var each in ATBeginHandlerMap.Keys) { if (each.IsMatch(arg)) { beginInterruptHandler = ATBeginHandlerMap[each]; interruptHandler = ATHandlerMap[each]; result = true; break; } } return result; } private bool OnBeginCMTI(List<string> content) { return true; } private void OnCMTI(List<string> content) { // +CMTI:"SM",1 Regex pattern = new Regex(@"^\+CMTI:.+,(\d+)"); Match m = pattern.Match(content[0]); index = Convert.ToInt32(m.Groups[1].Value); AddRequestToQueue(new RetrieveMessageReuqest(index).Execute(port)); } private bool OnBeginCMGR(List<string> content) { return (content.Count == 3); } private void OnCMGR(List<string> content) { Regex pattern = new Regex("^\\+CMGR:.+,\"(\\S+)\","); Match m = pattern.Match(content[0]); string address = m.Groups[1].Value; if (address.StartsWith("+86")) { address = address.Substring(3); } string content1 = content[1].TrimEnd('\r'); if (content1.StartsWith("050003")) { content1 = content1.Substring(12); } Message message = new Message(address, MessageHelper.MessageDecode(content1)); message.Raw = content[1].TrimEnd('\r'); message.Flags = MessageFlags.UNREAD; message.CreatedAt = DateTime.Now; DeleteByIndex(index); Receive(message); } private bool OnBeginRING(List<string> content) { return true; } private void OnRING(List<string> content) { } private void OnCMGSResponse(ModemResponse response) { SendResult(response); } private void DeleteByIndex(int index) { port.Write(string.Format("AT+CMGD={0}\r", index)); } private void AddRequestToQueue(ModemMessage arg) { if (arg is ModemRequest) { requestQueue.Enqueue(arg as ModemRequest); } } private List<string> receiveBuffer = new List<string>(); private ATReceivedEventHandler interruptHandler; private ATBeginReceivedEventHandler beginInterruptHandler; private bool isInterrupt { get { return beginInterruptHandler != null; } } private Queue<ModemRequest> requestQueue = new Queue<ModemRequest>(); private Dictionary<Type, ModemResponseHandler> responseMap = new Dictionary<Type, ModemResponseHandler>(); private Dictionary<Regex, ATBeginReceivedEventHandler> ATBeginHandlerMap = new Dictionary<Regex, ATBeginReceivedEventHandler>(); private Dictionary<Regex, ATReceivedEventHandler> ATHandlerMap = new Dictionary<Regex, ATReceivedEventHandler>(); private string portName; private SerialPort port; private int index; private bool isOpen = false; public event MessageReceivedEventHandler Receive; public event MessageSendEventHandler SendResult; } public abstract class ModemMessage { public List<string> Content { get; set; } public virtual ModemMessage Execute(SerialPort port) { return this; } } public class ModemRequest : ModemMessage { } public class ModemResponse : ModemMessage { public ModemRequest Request { get; set; } public ModemResponse(List<string> content) { Content = content; } } public class ModemNotify : ModemMessage { } public class SettingReuqest : ModemRequest { public SettingReuqest(string command) { this.command = command; } public override ModemMessage Execute(SerialPort port) { base.Execute(port); port.Write(command + "\r"); return this; } private string command; } public class SendMessageRequest : ModemRequest { public Message Message { get; set; } public SendMessageRequest(Message message) { Message = message; } public override ModemMessage Execute(SerialPort port) { base.Execute(port); try { port.DiscardInBuffer(); port.Write(string.Format("AT+CMGS={0}\r", Message.Address)); port.DiscardInBuffer(); port.Write(MessageHelper.MessageEncode(Message.Text) + ControlZ + "\r"); Message.Flags = MessageFlags.SENDED; Message.CreatedAt = DateTime.Now; } catch (Exception) { Message.Flags = MessageFlags.SENDFAILED; Message.CreatedAt = DateTime.Now; throw; } return this; } private const char ControlZ = (char)0x1A; } public class RetrieveMessageReuqest : ModemRequest { public RetrieveMessageReuqest(int index) { this.index = index; } public override ModemMessage Execute(SerialPort port) { base.Execute(port); port.Write(string.Format("AT+CMGR={0}\r", index)); return this; } private int index; } public delegate bool ATBeginReceivedEventHandler(List<string> content); public delegate void ATReceivedEventHandler(List<string> content); public delegate void ModemResponseHandler(ModemResponse response); public delegate void MessageReceivedEventHandler(Message arg); public delegate void MessageSendEventHandler(ModemResponse response); }

from:http://blog.csdn.net/trassion/article/details/8287809

转载请注明原文地址: https://www.6miu.com/read-1150013.html

最新回复(0)