📄 sms.cpp
字号:
// Sms.cpp : implementation file
//
#include "stdafx.h"
#include "JindiSMS.h"
#include "Sms.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSms
CSms::CSms()
{
}
CSms::~CSms()
{
}
BEGIN_MESSAGE_MAP(CSms, CWnd)
//{{AFX_MSG_MAP(CSms)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSms message handlers
//返回值 :1-成功,0-失败;
//打开串口
int CSms::Open_Com(int port, int baud_rate){
if(com.Open(port,baud_rate)==true)
return 1;
else
return 0;
}
void CSms::Set_Wnd(HWND hWnd){
com.SetWnd(hWnd);
}
//关闭串口
void CSms::Close_Com(){
com.Close();
}
LRESULT CSms::On_Receive(WPARAM wp, LPARAM lp)
{
int len;
char str[100];
len = com.Read(str, 100);
AfxMessageBox(" com Read!in dll");
if(len > 0)
{
char com_str[10];
strcpy(com_str, "COM");
ltoa((long)wp, com_str + 3, 10); // WPARAM 保存端口号
strResult+=str;
AfxMessageBox(" com Read!in dll");
}
return 0;
}
//发送AT指令
int CSms::Send_ATCmd(char* ATCmd,char* result){
int i,len=0;
char str[300];
CString beginstring;
char beginstr[2];
char endokstr[4]={' ',' ',' ',' '};
char enderrorstr[7]={' ',' ',' ',' ',' ',' ',' '};
int count=0;
if(!com.IsOpen()) return 0;
beginstring=ATCmd;
strcpy(beginstr,beginstring.Left(2));
if((strncmp(beginstr,"at", 2) == 0) || (strncmp(beginstr,"AT", 2) == 0)) {
strResult="";
i=com.Write(ATCmd);
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) break;
}
strcpy(result,strResult);
return 1;
}else{
return 0;
}
}
//获取短信中心号码
int CSms::Get_Smsc(char* smsc){
int i,len=0;
char str[300];
if(!com.IsOpen()) return 0;
i=com.Write("AT+CSCA?\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) break;
}
strcpy(smsc,(strResult.Right(24)).Mid(0,11));
return 1;
}
//设置短信中心号码
int CSms::Set_Smsc(char* smsc){
int i,len=0;
char str[300];
char cmd[20];
strcpy(cmd,"AT+CSCA=");
strcat(cmd,smsc);
strcat(cmd,"\r");
if(!com.IsOpen()) return 0;
i=com.Write(cmd);
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) return 1;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
}
}
//发送短信
int CSms::Send_Msg(char* PhoneID,char* SmsContent){
SM_PARAM SmParam;
int len,i;
char str[300];
char smsc[11];
CString strSmsc;
CString strNumber;
CString strContent;
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
char cmd[16]; // 命令串
char pdu[512]; // PDU串
if(!com.IsOpen()) return 0;
//设置AT+CMEE=0
com.Write("AT+CMEE=0\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
}
//设置AT+CMGF=0
com.Write("AT+CMGF=0\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
}
//获取短信中心号码
i=Get_Smsc(smsc);
if(i==0) return 0;
strSmsc=smsc;
strNumber=PhoneID;
//试用版控制
strContent="春笛公司欢迎您!";
strContent+=SmsContent;
// 去掉号码前的"+"
if(strSmsc[0] == '+') strSmsc = strSmsc.Mid(1);
if(strNumber[0] == '+') strNumber = strNumber.Mid(1);
// 在号码前加"86"
if(strSmsc.Left(2) != "86") strSmsc = "86" + strSmsc;
//if(strNumber.Left(2) != "86") strNumber = "86" + strNumber;
// 填充短消息结构
strcpy(SmParam.SCA, strSmsc);
strcpy(SmParam.TPA, strNumber);
strcpy(SmParam.TP_UD, strContent);
SmParam.TP_PID = 0;
SmParam.TP_DCS = GSM_UCS2;
nPduLength = gsmEncodePdu(&SmParam, pdu); // 根据PDU参数,编码PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令
//发送发短信指令
i=com.Write(cmd);
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(2),"> ", 2) == 0) {
//发送pdu串内容
com.Write(pdu);
break;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) {
return 1;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
}
//按序号删除短信
int CSms::Delete_Msg(int index){
int len;
char str[300];
char cmd[16]; // 命令串
if(!com.IsOpen()) return 0;
sprintf(cmd, "AT+CMGD=%d\r", index); // 生成命令
// 输出命令串
com.Write(cmd);
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) {
return 1;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
}
//按序号读短信
int CSms::Read_Msg(int index,char* PhoneID,char* SmsContent,char* Date){
int len;
char str[300];
char cmd[16]; // 命令串
char sptr[512];
char* ptr;
SM_PARAM pMsg;
if(!com.IsOpen()) return 0;
strResult="";
sprintf(cmd, "AT+CMGR=%d\r", index); // 生成命令
// 输出命令串
com.Write(cmd);
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) {
strcpy(sptr,strResult);
ptr=sptr;
// 读取一条短消息, 以"+CMGR:"开头
if((ptr = strstr(ptr, "+CMGR:")) != NULL){
ptr = strstr(ptr, "\r\n"); // 找下一行
if (ptr != NULL){
ptr += 2; // 跳过"\r\n", 定位到PDU
gsmDecodePdu(ptr, &pMsg); // PDU串解码
}
strcpy(PhoneID,pMsg.TPA);
strcpy(SmsContent,pMsg.TP_UD);
strcpy(Date,pMsg.TP_SCTS);
}
return 1;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
}
//按类型读所有短信
//type 0 - 所有未读短信
// 1 - 所有已读短信
// 2 - 所有短信
// 3 - 所有已读短信
// 4 - 所有已读短信
int CSms::Read_AllMsg(int type,char* PhoneID,char* SmsContent,char* Date,char* Index){
int len;
char str[300];
char cmd[16]; // 命令串
char sptr[8192];
char* ptr;
SM_PARAM pMsg;
int nMsg=0;
if(!com.IsOpen()) return 0;
strResult="";
sprintf(cmd, "AT+CMGL=%d\r", type); // 生成命令
// 输出命令串
com.Write(cmd);
while(true){
len = com.Read(str, 300);
strResult+=str;
//AfxMessageBox(strResult);
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) {
strcpy(sptr,strResult);
ptr=sptr;
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMGL:")) != NULL)
{
ptr += 7; // 跳过"+CMGL:", 定位到序号
//取序号
CString strindex=ptr;
char cindex[2];
int j=0;
//AfxMessageBox(strindex);
while(strindex.Mid(j,1)!=","){
j++;
}
strcpy(cindex,strindex.Mid(0,j));
ptr = strstr(ptr, "\r\n"); // 找下一行
if (ptr != NULL)
{
ptr += 2; // 跳过"\r\n", 定位到PDU
gsmDecodePdu(ptr, &pMsg); // PDU串解码
strcpy(PhoneID+nMsg*20,pMsg.TPA);
strcpy(SmsContent+nMsg*512,pMsg.TP_UD);
strcpy(Date+nMsg*20,pMsg.TP_SCTS);
strcpy(Index+nMsg*3,cindex);
nMsg++; // 短消息计数加1
}
}
return nMsg;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
}
//初始化
int CSms::SMS_Init(){
int i,len=0;
int count=0;
char str[100];
if(!com.IsOpen()) return 0;
i=com.Write("AT\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
if(count>10) return 0;
//AfxMessageBox(count);
Sleep(100);
count++;
}
i=com.Write("AT+CMEE=0\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
}
i=com.Write("AT+CMGF=0\r");
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) break;
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) return 0;
}
return 1;
}
//设置短信发送模式
int CSms::Set_SendModle(int modle)
{
int len;
char str[300];
char cmd[16]; // 命令串
if(!com.IsOpen()) return 0;
sprintf(cmd, "AT+CMGF=%d\r", modle); // 生成命令
AfxMessageBox(cmd);
com.Write(cmd);
strResult="";
while(true){
len = com.Read(str, 300);
strResult+=str;
AfxMessageBox(strResult);
if(strncmp(strResult.Right(4),"OK\r\n", 4) == 0) {
return 1;
}
if(strncmp(strResult.Right(7),"ERROR\r\n", 7) == 0) {
return 0;
}
}
}
/////////////////////////////////////////////////////////////////////////////////
//private method
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 输入: pSrc - 源字符串指针
// nSrcLength - 源字符串长度
// 输出: pDst - 目标数据指针
// 返回: 目标数据长度
int CSms::gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
for (int i = 0; i < nSrcLength; i += 2)
{
// 输出高4位
if ((*pSrc >= '0') && (*pSrc <= '9'))
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -