去年公司项目要用到短信猫,这个任务落到我的头上,于是开始研究了下短信猫的开发。我们公司使用的是北京华阳佳讯提供的短信猫。并且有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
上一篇 欧美大片观影
下一篇 陌陌上市前夕遭网易炮轰