高分求解决:把短信猫收短信做成了windows服务,发送AT指令,没有返回值,怎么回事,求高手解决?
如题
//开始 protected override void OnStart(string[] args) { uint MobPort = uint.Parse(XmlHelper.GetValue("Config.xml", "port")); sp.BaudRate = 9600; sp.PortName = "COM" + MobPort.ToString(); //如果串口已经打开 则先关闭 if (sp.IsOpen) sp.Close(); sp.Open(); //初始化设备 if (sp.IsOpen) { sp.Write("ATE0\r"); Thread.Sleep(50); sp.Write("AT+CMGF=0\r");//选择短消息信息格式:0-PDU;1-文本 Thread.Sleep(50); sp.Write("AT+CNMI=2,1\r");//(新sms来时送出脉冲) Thread.Sleep(50); Log.WriteLog("设备就绪!"); //Log.WriteLog("准备开启接收短信"); TCheckNewSms(); //timer_CheckNewSms.Enabled = true; //Log.WriteLog("接收短信成功开启"); } } /// <summary> /// 开启新进程启动检查是否有新短信 /// </summary> private void TCheckNewSms() { Thread t = new Thread(new ThreadStart(CheckNewSms)); t.Start(); } /// <summary> /// 检测 是否收到新短信(收取所有短信息) /// </summary> private void CheckNewSms() { if (sp.IsOpen) { StringBuilder sb = new StringBuilder(); sp.RtsEnable = true;//Added By Tan In 2011-07-28 sp.Write("AT+CMEE=1\r"); Thread.Sleep(300); sp.Write("AT+CMGL=4\r"); Log.WriteLog("执行AT指令:AT+CMGL=4!"); //接收数据 循环读取数据 直至收到“OK”或“ERROR” try { string temp = string.Empty; while (temp.Trim() != "OK" && temp.Trim() != "ERROR") { temp = sp.ReadLine(); Log.WriteLog("Temp:" + temp); sb.Append(temp); } Log.WriteLog(sb.ToString()); } catch (Exception ex) { Log.WriteLog(ex.Message); //throw ex; } Thread.Sleep(300); if (sb.ToString() != "") { Log.WriteLog(sb.ToString()); } } }
#region 发送短息 /// <summary> /// SendMessage函数用于发送短信.参数strMobileNumber设置手机号码,strMsgContent指 /// 定要发送的内容 /// </summary> /// <param name="strMobileNumber">手机号码</param> /// <param name="strMsgContent">要发送的内容</param> /// <returns> 返回指示发送是否成功</returns> public bool SendMessage(string strMobileNumber,string strMsgContent) { SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.WriteTimeout = 2000; try { serialPort.ReadBufferSize = 900000; if (serialPort.IsOpen) serialPort.Close(); serialPort.Open(); serialPort.WriteLine("ATZ\r"); Thread.Sleep(500); serialPort.ReadExisting(); serialPort.WriteLine("AT+CSMP=1,167,0,8" + "\r"); serialPort.Write("AT+CMGS=" + strMobileNumber + "\r"); Thread.Sleep(1000); string content = GBToUnicode(strMsgContent); serialPort.Write(content + Convert.ToChar(26).ToString()); Thread.Sleep(2000); string msg = serialPort.ReadExisting(); serialPort.Close(); return true; } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } finally { //保证操作完成以后关闭端口,避免占用 if (serialPort.IsOpen) serialPort.Close(); } } #endregion
[解决办法]
全部贴了
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;using System.IO.Ports;using System.Threading;using System.Text.RegularExpressions;/// <summary>///SMS 的摘要说明/// </summary>public class SMS{ public SMS() { } public static char HexToChar(string hexstring) { return (char)Convert.ToInt32(hexstring, 16); } public static string CharToHex(char c) { return string.Format("{0:X}", (int)c); } public static string HexTostring(string hexstring) { StringBuilder sb = new StringBuilder(""); for (int i = 0; i < hexstring.Length; i += 4) { string temp = hexstring.Substring(i, 4); sb.Append(HexToChar(temp)); } return sb.ToString(); } public static string StringToHex(string s) { StringBuilder sb = new StringBuilder(""); foreach (char c in s) { sb.Append(CharToHex(c)); } return sb.ToString(); } /// <summary> /// 将汉字转换为Unicode /// </summary> /// <param name="text">要转换的字符串</param> /// <returns></returns> public static string GBToUnicode(string text) { byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text); string lowCode = "", temp = ""; for (int i = 0; i < bytes.Length; i++) { if (i % 2 == 0) { temp = System.Convert.ToString(bytes[i], 16);//取出元素4编码内容(两位16进制) if (temp.Length < 2) temp = "0" + temp; } else { string mytemp = Convert.ToString(bytes[i], 16); if (mytemp.Length < 2) mytemp = "0" + mytemp; lowCode = lowCode + mytemp + temp;//取出元素4编码内容(两位16进制) } } return lowCode; } /// <summary> /// 将Unicode转换为汉字 /// </summary> /// <param name="name">要转换的字符串</param> /// <returns></returns> public string UnicodeToGB(string text) { MatchCollection mc = Regex.Matches(text, "([\\w]+)|(\\\\u([\\w]{4}))"); if (mc != null && mc.Count > 0) { StringBuilder sb = new StringBuilder(); foreach (Match m2 in mc) { string v = m2.Value; if (v.StartsWith("http://www.cnblogs.com/xczt/admin/file://u/")) { string word = v.Substring(2); byte[] codes = new byte[2]; int code = Convert.ToInt32(word.Substring(0, 2), 16); int code2 = Convert.ToInt32(word.Substring(2), 16); codes[0] = (byte)code2; codes[1] = (byte)code; sb.Append(Encoding.Unicode.GetString(codes)); } else { sb.Append(v); } } return sb.ToString(); } else { return text; } } #region 发送短息 /// <summary> /// SendMessage函数用于发送短信.参数strMobileNumber设置手机号码,strMsgContent指 /// 定要发送的内容 /// </summary> /// <param name="strMobileNumber">手机号码</param> /// <param name="strMsgContent">要发送的内容</param> /// <returns> 返回指示发送是否成功</returns> public bool SendMessage(string strMobileNumber,string strMsgContent) { SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.WriteTimeout = 2000; try { serialPort.ReadBufferSize = 900000; if (serialPort.IsOpen) serialPort.Close(); serialPort.Open(); serialPort.WriteLine("ATZ\r"); Thread.Sleep(500); serialPort.ReadExisting(); serialPort.WriteLine("AT+CSMP=1,167,0,8" + "\r"); serialPort.Write("AT+CMGS=" + strMobileNumber + "\r"); Thread.Sleep(1000); string content = GBToUnicode(strMsgContent); serialPort.Write(content + Convert.ToChar(26).ToString()); Thread.Sleep(2000); string msg = serialPort.ReadExisting(); serialPort.Close(); return true; } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } finally { //保证操作完成以后关闭端口,避免占用 if (serialPort.IsOpen) serialPort.Close(); } } #endregion}
[解决办法]
调用上面的类代码
#region 利用短信猫发送短信 SMS sms = new SMS(); try { //正则表达式验证 string code = @"^(13[0-9]|15[0|3|6|7|8|9]|18[8|9])\d{8}$"; if (Regex.IsMatch(cSendPhoneNum, code)) { //对短信的长度进行控制 if (cSendContent.Length == 0 || cSendContent.Length > 200) { ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信内容过短或太长!')</script>"); return; } //手机号码格式正确 if (sms.SendMessage(cSendPhoneNum, cSendContent)) { //将信息保存到数据库中 DM dm = new DM(); string strSQL = "insert into 短信表 values('" + cSendPhoneNum + "','" + cSendContent + "','" + DateTime.Now.ToLongDateString() + ")"; // try // { // dm.execsql(strSQL); //短信发送成功,并成功插入数据库 ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信发送成功...'); </script>"); } catch (Exception) { } } else { //短信发送成功 ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信发送失败...'); </script>"); } } else { ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('手机号码格式错误,请检查...')</script>"); } } catch (Exception ex) { ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('" + ex.Message + "')</script>"); } #endregion
[解决办法]
有异常被捕获到吗?
[解决办法]
折腾权限