/*****************************************************************************************************
/
/ WINSMS.dll v1.5 短信接口动态库[正式版] 版权声明
/
/ 中国星幻科技有限公司 http://www.xhsms.com
/ 联系人:黄义清 Email:net22@163.com
/ 使用过程中发现BUG请及时给我们发EMail,简单描述错误的如何产生.
/ 及你所采用的什么操作系统和什么型号芯片.我们成功离不开您的支持!
/
/ ****未经许可,不等擅自修改或者反编译本程序.否则追究相关法律责任*****
/****************************************************************************************************/

本DLL可以实现以下功能
+---------------------------------------------------------------------------------------------------+
1.文本短信的发送.暂不支持彩信.以后会增加
2.文本短信的接收
3.单条短信删除或者清空所有短信
4.所有初始化的COM口都以异步方式与模块通信.采用标准比特率9600bps
+----------------------------------------------------------------------------------------------------+
本DLL提供终端发送短信接口函数.在西门子TC35/TC35I/WAVECOM 芯片测试通过
可以实现文本短信的发送/接收/删除功能.支持短信报告
以下是短信接口的详细说明
1.需要用到的结构
typedef struct _SM_PARAM
{
char SCA[16];//+8613552678753// 短消息服务中心号码(SMSC地址)
char TPA[16];// 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID;// 用户信息协议标识(TP-PID),00 GSM短信,[99短信状态报告,内部标识]
char TP_DCS;// 用户信息编码方式(TP-DCS)
char TP_SCTS[16];//030325122030// 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161];// 原始用户信息(编码前或解码后的TP-UD)
char index;// 短消息序号,在读取时用到
char original[350]; //接收到信息的原码
}SM_PARAM,*LPSM_PARAM;
2.接口函数

2.1 初始化COM口和模块 [成功返回COM口的句柄,失败返回NULL]
HANDLE _stdcall InitComm(int/*COM口的ID*/,BOOL bStatusReport=FALSE/*是否开通短信报告*/);
初始化COM,bStatusReport默认关闭状态,如果需要支持短信状态设置TRUE.建议关闭状态报告

2.2 带参数的初始化 [成功返回COM口的句柄,失败返回NULL]
HANDLE _stdcall InitCommParam(int/*COM口的ID*/,COMMTIMEOUTS/*串口超时结构*/,BOOL bStatusReport=FALSE/*是否开通短信报告*/);
如果需要自己设置COMMTIMEOUTS结构值,就要调此函数,bStatusReport作用同上

2.3 发送新短信 [成功返回TRUE,失败返回FALSE]
BOOL _stdcall SendSMS(HANDLE hComm/*操作COM口的句柄*/,char[16]/*对方手机号*/,char[150] /*发送内容*/,int nSMSType=2/*短信类别,1免提短信,2普通短信*/);

2.3.1 参数说明
hComm 调用InitComm或者InitCommParam返回的值.
char[16] /*对方手机号*/ 16字符 ,对持以下几种
1. 86+手机号 中国移动/中国联通 例如:8615966019901
2. 106+区号+电话号码 中国网通小灵通 例如:10601081015255
3. 直接就是号码. 特殊号码 例如:10086 10010

char[150] 向对方发送短信,发送内容最长140个字节.为70个汉字.超过后系统会自动截断.

nSMSType 短信类别,1免提短信,2普通短信 一种是免提短信,直接在屏幕显示内容,不存储.另一种就是普通的短信,需要手动打开.存储SIM卡

2.4 接收短信 [执行成功后返回共收到的短信条数]
int _stdcall ReceiveSMS(HANDLE/*操作COM口的句柄*/,SM_PARAM*/*返回所接收的全部短信*/);

参数说明
HANDLE 操作COM口的句柄,调用InitComm或者InitCommParam后返回的值.
SM_PARAM 存储短信的指针,调用前声明足够大的空间.例如:
//可以存放500条短信的空间,并初始化为空
SM_PARAM[500]={0};
HANDLE hComm = InitComm(1);
int nCount=ReceiveSMS(hComm,SM_PARAM);
接收到新短信后.要注意你初始化COM前是否开通状态报告,如果开通要注意以下信息
/*typedef struct _SM_PARAM
{
char SCA[16];//+8613552678753// 短消息服务中心号码(SMSC地址)
char TPA[16];// 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID;// 用户信息协议标识(TP-PID),00 GSM短信,[99短信状态报告,内部标识]
char TP_DCS;// 用户信息编码方式(TP-DCS)
char TP_SCTS[16];//030325122030// 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161];// 原始用户信息(编码前或解码后的TP-UD)
char index;// 短消息序号,在读取时用到
char original[350]; //接收到信息的原码
}SM_PARAM,*LPSM_PARAM;*/
for(int i=0;i<nCount;i++)
{
if(SM_PARAM[i].TP_PID=99)
{
//代表此条短信为状态报告,没有实际内容
//注意.如果是状态报告
//SM_PARAM[i].TP_UD 内容为// MO 到达SMSC时间 从本地到短消息中心服务器的时间
//SM_PARAM[i].TP_SCTS 内容为//SMSC 到达 MT时间 从短消息中心服务器下发到目标手机上的时间
char temp[25]={0};
sms_StrToDate(SM_PARAM[i].TP_UD,temp); //转日期格式
meset(temp,0,sizeof(temp));
sms_StrToDate(SM_PARAM[i].TP_SCTS,temp); //转日期格式
}
else
{
//代表真正收到的短信
}
}
//如果对方手机处于有信号或者非停机状态.发送成功后5秒会收到短信报告状态.否则什么时候开机什么时候才会收到报告状态

2.5 删除指定短信或者全部短信 [成功返回TRUE,失败返回FALSE]
BOOL _stdcall DeleteSMS(HANDLE/*COM口的句柄*/,int/*删除指定编号的ID,0代表删除全部短信*/);
参数说明
HANDLE 初始化成功后返回的句柄
int 要删除短信的编号,如果为0,代表清空所有短信.否则删除指定编号的短信

2.6 卸载模块,关闭COM口
void _stdcall UnInitComm(HANDLE/*卸载指定COM口,需要打开时的COM句柄*/);
参数说明
HANDLE 初始化COM口返回的句柄

2.7 附加函数 转换日期[030325122030]格式转成 [2003-3-25 12:20:30]
DLL_DEF int _stdcall sms_StrToDate(const char *pSrc/*短信中的日期串*/,char *pDst/*转换后的空间*/);
参数说明
const char *pSrc SM_PARAM结构中TP_SCTS值.接收到的日期格式
pDst 转换正式日期格式空间
示例
SM_PARAM sms={0};
char date[25]={0};
sms_StrToDate(sms.TP_SCTS,date);
printf("Date:%s",date);
*提示:调用接口时.传参时注意参数的大小.如果越界就是产生异常.char[150] 可以存放150个字节.超过后就会越界

调用DLL动态库2种方式
----------------------------------------------------------------------------------------------------
1.隐式链接 程序运行时DLL就被加载.使用简单,灵活性不强
#pragma comment(lib,"winsms.lib") //调用页面加入
在项目里添加sms_dll.h文件.只包含接口的声明.没有实现
然后就跟普通函数一样调用.比较简单

2.显式链接 使用复杂.灵活性强

需要声明每个需要调用的函数.声明为函数指针
例如:
2.1. HANDLE _stdcall InitComm(int/*COM口的ID*/,BOOL bStatusReport=FALSE/*是否开通短信报告*/);
2.2. void _stdcall UnInitComm(HANDLE/*卸载指定COM口,需要打开时的COM句柄*/);

typedef HANDLE(_stdcall *pft_InitComm)(int,BOOL);
typedef void(_stdcall *pft_UnInitComm)(HANDLE);

HINSTANCE hDLL;
hDLL=LoadLibrary("winsms.dll");
if(!hDLL)
{
//加载失败
}
pft_InitComm InitComm = (pft_InitComm)GetProcAddress(hDLL,"InitComm");
pft_UnInitComm UnInitComm = (vpft_UnInitComm)GetProcAddress(hDLL,"UnInitComm");
HANDLE hComm = DCom(6,FALSE); //初始化COM6,不开通短信状态报告
UnInitComm(hComm); //卸载COM
//手动释放内存
FreeLibrary(hDLL);

日志更新
----------------------------------------------------------------------------------------------------
无