去年公司项目要用到短信猫,这个任务落到我的头上,于是开始研究了下短信猫的开发。我们公司使用的是北京华阳佳讯提供的短信猫。并且有C ,Delphi和C#的开发包,现在分享下我整理过的C#的短信猫源代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace SMSend { public class IMessage { #region<Fields> const int SMS_FORMAT_TEXT = 0; //Text模式(拉丁语系短信模式) const int SMS_BUF_TOTAL = 50; const int SMS_FORMAT_PDU = 0; bool bRet = false, bSndSucc = false; int iErrCode = -255, iTmp = 0; public bool comState = false; public StringBuilder strVerInfo = new StringBuilder(1024); //版本信息 public StringBuilder strErrInfo = new StringBuilder(1024); //错误信息 public StringBuilder strSCA = new StringBuilder(30); //短信中心 public StringBuilder strNeedSndMsg = new StringBuilder(512); //待发短信 public StringBuilder strNextMsg = new StringBuilder(512); //剩余短信 public string RecMsg = "没有短信接收记录"; //public StringBuilder strSndPhNbr = new StringBuilder(16); //目标号码 public string sendResult = ""; string strTmp; int iSMSFormat = 0; //PDU 方式收发短信(中国大陆使用) IntPtr hComm; //串口句柄 STRUCommInfo CommInfo = new STRUCommInfo(); //串口设备信息 private const UInt32 INVALID_HANDLE_VALUE = 0xffffffff; #endregion #region <struct> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SM_PARAM { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public char[] SCA; // 短消息服务中心号码(SMSC地址) [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public char[] TPA; // 目标号码或回复号码(TP-DA或TP-RA) public char TP_PID; // 用户信息协议标识(TP-PID) public char TP_DCS; // 用户信息编码方式(TP-DCS) [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public char[] TP_SCTS; // 服务时间戳字符串(TP_SCTS), 接收时用到 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 161)] public char[] TP_UD; // 原始用户信息(编码前或解码后的TP-UD) public char index; // 短消息序号,在读取时用到 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SM_RCV_STRU { public int iSmsTotal; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public SM_PARAM[] SMS; }; public struct STRUCommInfo { public int iBaudRate; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public char[] szSCA; }; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SM_CPLUS_DETAIL { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public char[] A; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public char[] B; }; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct SM_CPLUS_STRU { public int iSmsTotal; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] public byte[] szTest; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public SM_CPLUS_DETAIL[] Detail; }; #endregion #region<DLLImport> [DllImport("SMSCom.dll")] public static extern int iTest(ref SM_CPLUS_STRU SMS, StringBuilder szErrInfo); /// <summary> /// 获取版本信息 /// </summary> /// <param name="szRetver"></param> [DllImport("SMSCom.dll", CallingConvention = CallingConvention.Cdecl)] private extern static void GetVerInfo(StringBuilder szRetver); /// <summary> /// 获取序列号授权函数 /// </summary> /// <param name="szCorp">公司标识</param> /// <param name="szInputSN">授权的序列号</param> /// <returns>1:序列号校验正确 -100:序列号校验错误</returns> [DllImport("SMSCom.dll", CallingConvention = CallingConvention.Cdecl)] private extern static int iSetSerialNo(string szCorp, string szInputSN); /// <summary> /// 打开串口 /// </summary> /// <param name="szPort"></param> /// <returns></returns> [DllImport("SMSCom.dll", CallingConvention = CallingConvention.Cdecl)] private extern static IntPtr hOpenComm(string port); /// <summary> /// 关闭串口 /// </summary> /// <param name="hComm">串口句柄</param> /// <returns></returns> [DllImport("SMSCom.dll", CallingConvention = CallingConvention.Cdecl)] private extern static bool bCloseComm(IntPtr hComm); /// <summary> /// 自动初始化函数 /// </summary> /// <param name="szRetver"></param> //[DllImport("SMSCom.dll", CallingConvention = CallingConvention.Cdecl)] //private extern static bool bAutoInit(IntPtr hComm, ref STRUCommInfo CommInfo, int iSMSFormat,ref StringBuilder szErrInfo); [DllImport("SMSCom.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] static extern bool bAutoInit(IntPtr hComm, ref STRUCommInfo CommInfo, int iSMSFormat, [MarshalAs(UnmanagedType.LPStr)] StringBuilder sOut); /// <summary> /// 短信发送 /// </summary> /// <param name="hComm">串口句柄</param> /// <param name="szMsg">待发的短信内容</param> /// <param name="szPhNbr">目的手机号</param> /// <param name="szSCA">短信中心号码</param> /// <param name="iSMSFormat">短信编码模式</param> /// <param name="szNextMsg">超长部分的待发内容</param> /// <param name="szErrInfo">出错信息</param> /// <returns></returns> [DllImport("SMSCom.dll")] static extern bool bSendMsg(IntPtr hComm, StringBuilder szMsg, StringBuilder szPhNbr, StringBuilder szSCA, StringBuilder szNextMsg, int iSMSFormat, StringBuilder szErrInfo); /// <summary> /// 短信接收 /// </summary> /// <param name="hCommm">串口句柄</param> /// <param name="RcvSMS">接收到的短信内容</param> /// <param name="iSMSFormat">短信编码格式</param> /// <param name="szErrInfo">出错信息</param> /// <returns>接收到的短信数量</returns> [DllImport("SMSCom.dll")] static extern int iRecvMsg(IntPtr hCommm, ref SM_RCV_STRU RcvSMS, int iSMSFormat, StringBuilder szErrInfo); /// <summary> /// WAP Push短信发送函数 /// </summary> /// <param name="hComm">串口句柄</param> /// <param name="szPhNbr">目的手机号</param> /// <param name="szWapTitle">短信你标题</param> /// <param name="szWapUrl">短信连接URL</param> /// <param name="szErrInfo">出错信息</param> /// <returns>ture-成功 false-失败</returns> [DllImport("SMSCom.dll")] static extern bool bSendWapPush(IntPtr hComm, StringBuilder szPhNbr, StringBuilder szWapTitle, StringBuilder szWapUrl, StringBuilder szErrInfo); /// <summary> /// 清楚SIM卡信息 /// </summary> /// <param name="hComm">串口句柄</param> /// <param name="szErrInfo">出错信息</param> /// <returns>ture-成功 false-失败</returns> [DllImport("SMSCom.dll")] static extern bool bClrSIM(IntPtr hComm, StringBuilder szErrInfo); #endregion #region<Method> //获取版本信息 public void GetInformation(StringBuilder szRetver) { try { GetVerInfo(szRetver); } catch (Exception ex) { throw ex; } } //获取序列号授权 public int Get() { return iSetSerialNo("", "SN"); } /// <summary> /// 打开串口 /// </summary> /// <param name="szProt"></param> /// <returns></returns> public string OpenComm(string szProts, string msgCenter) { string s = ""; iErrCode = iSetSerialNo("www.etoneinfo.com", "SN"); strTmp = szProts; hComm = hOpenComm(strTmp); //打开串口 if (!hComm.Equals(null) && (hComm.ToInt32() != 0) && ((UInt32)hComm != INVALID_HANDLE_VALUE)) { bRet = bAutoInit(hComm, ref CommInfo, iSMSFormat, strErrInfo); //自动初始 strTmp = new String(CommInfo.szSCA); iTmp = strTmp.IndexOf(' '); strSCA = new StringBuilder(strTmp, iTmp); msgCenter = strSCA.ToString(); s = "打开成功!" System.DateTime.Now.ToLongTimeString(); comState = true; } else { s = "打开失败!" System.DateTime.Now.ToLongTimeString(); comState = false; } return s; } /// <summary> /// 关闭串口 /// </summary> /// <returns></returns> public bool CloseComm(string szProts) { return bCloseComm(hComm); } /// <summary> /// 自动初始化函数 /// </summary> /// <param name="szErrInfo"></param> /// <returns></returns> public bool Initialization(StringBuilder szErrInfo) { try { return bAutoInit(hComm, ref CommInfo, iSMSFormat, szErrInfo); } catch (Exception ex) { throw ex; } } /// <summary> /// 发送短信 /// </summary> /// <param name="getData">获取版本信息参数</param> /// <param name="strNeedSndMsg">带发送的短信</param> /// <param name="trSndPhNbr">目的手机号</param> /// <param name="port">端口</param> /// <param name="ss"></param> public void SendMessages(StringBuilder getData, StringBuilder strNeedSndMsg, StringBuilder strSndPhNbr, string port) { string msgCenter = ""; //获取版本信息 GetInformation(getData); //打开串口 OpenComm(port, msgCenter); iTmp = strNextMsg.Length; strNextMsg = new StringBuilder(512); if (hComm.Equals(null) || (hComm.ToInt32() == 0) || ((UInt32)hComm == INVALID_HANDLE_VALUE)) { // textBoxComState.Text = "请先打开串口!" System.DateTime.Now.ToLongTimeString(); return; } while (strNeedSndMsg.Length > 0) { bSndSucc = false; bRet = bSendMsg(hComm, strNeedSndMsg, strSndPhNbr, strSCA, strNextMsg, SMS_FORMAT_PDU, strErrInfo); if (bRet == false) //发送失败 { bSndSucc = false; sendResult = "发送失败!" System.DateTime.Now.ToLongTimeString(); break; } else { if (strNextMsg.Length <= 0) //超长部分的待发内容 { bSndSucc = true; //发送成功 } strNeedSndMsg = strNextMsg; strNextMsg = new StringBuilder(512); } if (bSndSucc) { sendResult = "发送成功!" System.DateTime.Now.ToLongTimeString(); } else { sendResult = "发送失败!" System.DateTime.Now.ToLongTimeString(); } } //关闭串口 CloseComm(port); } /// <summary> /// 接收短信 /// </summary> /// <param name="getData"></param> /// <param name="port"></param> public void ReceiveMsg(string port) { StringBuilder getData = new StringBuilder(255); int i, iTmpRcvSmsTotal = 0, iFind; string strTmpRcvSMS = "", strTmpTPA = ""; string msgCenter = ""; //获取版本信息 GetInformation(getData); //打开串口 OpenComm(port, msgCenter); SM_RCV_STRU RcvSms = new SM_RCV_STRU(); //接收到的短信 StringBuilder strErrInfo = new StringBuilder(512);//错误信息 if (hComm.Equals(null) || (hComm.ToInt32() == 0) || ((UInt32)hComm == INVALID_HANDLE_VALUE)) { return; } //接收短信 iTmpRcvSmsTotal = iRecvMsg(hComm, ref RcvSms, SMS_FORMAT_PDU, strErrInfo); for (i = 0; i < iTmpRcvSmsTotal; i ) { strTmp = new String(RcvSms.SMS[i].TP_SCTS); iFind = strTmp.IndexOf(" "); if (iFind > 0) { strTmp = strTmp.Remove(iFind); } strTmpRcvSMS = "时间:" strTmp; strTmp = new String(RcvSms.SMS[i].TPA); iFind = strTmp.IndexOf(" "); if (iFind > 0) { strTmp = strTmp.Remove(iFind); } strTmpRcvSMS = strTmpRcvSMS " 手机号:" strTmp; strTmp = new String(RcvSms.SMS[i].TP_UD); iFind = strTmp.IndexOf(" "); if (iFind > 0) { strTmp = strTmp.Remove(iFind); } strTmpRcvSMS = strTmpRcvSMS " 内容:" strTmp " "; RecMsg = strTmpRcvSMS; } //关闭串口 CloseComm(port); } #endregion } }
彭亚欧个人博客原创文章,转载请注明出处
文章关键词:C#短信猫源代码
文章固定链接:https://www.pengyaou.com/homeart/NjY=.html
上一篇 欧美大片观影
下一篇 陌陌上市前夕遭网易炮轰