📄 smsoper.cpp
字号:
// SmsOper.cpp: implementation of the CSmsOper class.
//
//////////////////////////////////////////////////////////////////////
//write by lyq,2/5/2005
#include "stdafx.h"
#include "SmsOper.h"
#include "windows.h"
#include <iostream>
#include <stdio.h>
#include "direct.h"
#include "PublicBase.h"
/*
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
*/
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int g_iSendPudDataTime;
//CRITICAL_SECTION m_ComOperCritical;
CSmsOper::CSmsOper()
{
}
CSmsOper::~CSmsOper()
{
}
/*
// 从列表中解析出全部短消息
// 输入: pMsg - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 大于0则为短消息条数
int CSmsOper::OnRecvSms(int hCom,SM_PARAM* pMsg)
{
//do with what the program received from serial device.
char chBack[5000]={0};
int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
if (nLength==0)
{
return -1;
}
char *pchFirst=strstr(chBack,"+CMTI:");
if (pchFirst==NULL)
{
return -3;
}
char *token = strtok(chBack, ",");
while( token != NULL )
{
token = strtok( NULL, "," );
if (token==NULL)
{
break;
}
}
char chCmd[20]={0};
sprintf(chCmd,"AT+CMGR=%s",token);
DoAtCmd(hCom,chCmd);
memset(chBack,0x00,sizeof(chBack));
nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
sscanf(token, "%d", &pMsg->index); // 读取序号
char *pdest = strstr(chBack, "\r\n"); // 找下一行
if (pdest==NULL) return -1;
int nSartPdu = pdest - chBack + 1;
char chPdu[5000]={0};
strcpy(chPdu,&chBack[nSartPdu]);
m_cSmsCode.gsmDecodePdu(chPdu, pMsg); // PDU串解码
return 0;
}
*/
// 从列表中解析出全部短消息
// 输入: pMsg - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 大于0则为短消息条数
int CSmsOper::OnRecvSms(int hCom,SM_PARAM* pMsg)
{
//use in testing,读写所有的消息
// DoAtCmd(hCom,"AT+CMGL=4");
//读出新的消息
DoAtCmd(hCom,"AT+CMGL=0");
//do with what the program received from serial device.
char chBack[5000]={0};
int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
if (nLength==0)
{
return -1;
}
char *pchFirst=strstr(chBack,"+CMGL:");
if (pchFirst==NULL)
{
pchFirst=strstr(chBack,"CMT");
if (pchFirst!=NULL)
{
return OnParseAllSmsCMT(pMsg,chBack);
}
return -3;
}
//解析所有的短信
return OnParseAllSms(pMsg,chBack);
}
//执行at命令的函数
//输入参数:at命令
void CSmsOper::DoAtCmd(int hCom,char *pchAtCmd)
{
int nCmdLen=strlen(pchAtCmd)+3;
char *pchCmd;
pchCmd=new char[nCmdLen];
memset(pchCmd,'\0',nCmdLen);
strcpy(pchCmd, pchAtCmd);
strcat(pchCmd, "\r\n");
OnWriteComm(hCom,pchCmd,nCmdLen);
if (pchCmd!=NULL)
{
delete[] pchCmd;
pchCmd=NULL;
}
}
// 从列表中删除指定的短消息
// 输入: hCom表示从哪个com接口接收的数据,nIndex哪条指定的消息
// 返回: 0表示成功,-1表示失败
int CSmsOper::OnDeleteAppointed(int hCom,int nIndex)
{
char chCmd[16] = {0};
sprintf(chCmd,"AT+CMGD=%d", nIndex);
DoAtCmd(hCom,chCmd);
//do with what the program received from serial device.
char chBack[1000]={0};
int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
if (nLength==0)
{
return -1;
}
// 根据能否找到"\r\n> "决定成功与否
if(strstr(chBack, "OK") !=NULL)
{
return 0;
}
else
{
return -1;
}
}
// All READ, SENT and UNSENT messages are deleted
// 输入: hCom表示从哪个com接口删除的数据
// 返回: 0表示成功,-1表示失败
int CSmsOper::OnDeleteReadAndSend(int hCom)
{
DoAtCmd(hCom,"AT+CMGD=1,3");
//do with what the program received from serial device.
char chBack[200]={0};
int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
if (nLength==0)
{
return -1;
}
// 根据能否找到"\r\n> "决定成功与否
if(strstr(chBack, "OK") !=NULL)
{
return 0;
}
else
{
return -1;
}
}
// 从列表中解析出全部短消息
// 输入: ptr - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int CSmsOper::OnParseAllSms(SM_PARAM* pMsg, char *ptr)
{
int nMsg=0; // 短消息计数值
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMGL:")) != NULL)
{
ptr += 6; // 跳过"+CMGL:", 定位到序号
sscanf(ptr, "%d", &pMsg->index); // 读取序号
// TRACE(" index=%d\n",pMsg->index);
ptr = strstr(ptr, "\r\n"); // 找下一行
if (ptr != NULL)
{
ptr += 2; // 跳过"\r\n", 定位到PDU
m_cSmsCode.gsmDecodePdu(ptr, pMsg); // PDU串解码
pMsg++; // 准备读下一条短消息
nMsg++; // 短消息计数加1
}
}
return nMsg;
}
// 从列表中CMT消息解析出全部短消息
// 输入: ptr - 短消息列表缓冲区
// 输出: pMsg - 短消息缓冲区
// 返回: 短消息条数
int CSmsOper::OnParseAllSmsCMT(SM_PARAM* pMsg, char *ptr)
{
int nMsg=0; // 短消息计数值
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMT:")) != NULL)
{
ptr = strstr(ptr, "\r\n"); // 找下一行
if (ptr != NULL)
{
ptr += 2; // 跳过"\r\n", 定位到PDU
m_cSmsCode.gsmDecodePdu(ptr, pMsg); // PDU串解码
pMsg++; // 准备读下一条短消息
nMsg++; // 短消息计数加1
}
}
return nMsg;
}
//得到短信中心号码
int CSmsOper::OnGetSmsCenterNum(int hCom,char *pchOut)
{
DoAtCmd(hCom,"AT+CSCA?");
//do with what the program received from serial device.
char chBack[1000]={0};
int nLength=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
if (nLength==0) return -1;
//没有成功的响应
// if (strstr(chBack, "OK") ==NULL) return -1;
char chCenterMobileNumm[20]={0};
char *pdest;
int result=0;
pdest = strstr( chBack, "+86" );
if (pdest==NULL) return -1;
result = pdest - chBack + 1;
memset(chCenterMobileNumm,'\0',sizeof(chCenterMobileNumm));
memcpy(chCenterMobileNumm,chBack+result,13);
memcpy(pchOut,chCenterMobileNumm,15);
return 0;
}
//初始化短信at命令
int CSmsOper::OnSetInit(int hCom)
{
char chBack[128]={0};// 应答串
// 测试GSM-MODEM的存在性
//DoAtCmd(hCom,"AT");
OnWriteComm(hCom,"at\r",3);
// if (OnReadBack(hCom,chBack,sizeof(chBack),"OK","ERROR",3)<0) return -1;
OnReadComm(hCom,chBack,sizeof(chBack));
if (strstr(chBack, "OK") == NULL) return -1;
// ECHO OFF
DoAtCmd(hCom,"ATE0");
OnReadComm(hCom,chBack,sizeof(chBack));
// PDU模式
DoAtCmd(hCom,"AT+CMGF=0");
OnReadComm(hCom,chBack,sizeof(chBack));
DoAtCmd(hCom,"AT+CMEE=1");
OnReadComm(hCom,chBack,sizeof(chBack));
// DoAtCmd(hCom,"AT+CNMI=2,2,0,0,0");
// OnReadComm(hCom,chBack,sizeof(chBack));
return 0;
}
// 发送短消息,仅发送命令,不读取应答
// 输入: pSrc - 源PDU参数指针
int CSmsOper::OnSendSms(int hCom,SM_PARAM* pSrc,int nType)
{
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
char pdu[512]; // PDU串
nPduLength = m_cSmsCode.gsmEncodePdu(pSrc, pdu,nType); // 根据PDU参数,编码PDU串
//test
//CPublicBase cPub;
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
//cPub.OnWriteLog(pdu);
m_cSmsCode.gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
//cPub.OnWriteLog(pdu);
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令
//cPub.OnWriteLog(cmd);
// 得到肯定回答,继续输出PDU串
OnWriteComm(hCom,cmd, strlen(cmd));
//DoAtCmd(hCom,cmd); // 先输出命令串
char chBack[128]={0};// 应答串
nLength=OnReadComm(hCom,chBack,sizeof(chBack));
if (strstr(chBack, "ERROR")!=NULL) return -1;
if(nLength != 4) return -1;
// 得到肯定回答,继续输出PDU串
OnWriteComm(hCom,pdu, strlen(pdu));
//cPub.OnWriteLog(pdu);
memset(chBack,0x00,sizeof(chBack));
Sleep(g_iSendPudDataTime);
int iLen=OnReadCommOkErr(hCom,chBack,sizeof(chBack));
//没有成功的响应
if (strstr(chBack, "ERROR")!=NULL) return -1;
/*
//update
long LastSaveBillTime=time(NULL);
//循环接受通讯终端的数据
while(1)
{
int iLen=OnReadComm(hCom,chBack,sizeof(chBack));
if (strstr(chBack, "OK")!=NULL)
{
break;
}
if (strstr(chBack, "ERROR")!=NULL &&(strstr(chBack, "304")!=NULL) )
{
return -1;
break;
}
if(time(NULL) - LastSaveBillTime >= 10)
{
return -1;
break;
}
}
*/
return 1;
}
//获得产品序列号
// 输入参数: pchSerial - 获取产品序列号
const char* CSmsOper::OnGetSerialNo(int hCom)
{
const char* pchSerial;
DoAtCmd(hCom,"AT+CGSN");
//do with what the program received from serial device.
char chBack[100]={0};
int nLength=OnReadComm(hCom,chBack,sizeof(chBack));
if (nLength==0) return NULL;
//没有成功的响应
if (strstr(chBack, "OK") ==NULL) return NULL;
char chSerialNo[50];
memset(chSerialNo,'\0',sizeof(chSerialNo));
memcpy(chSerialNo,chBack+2,13);
pchSerial=chSerialNo;
return pchSerial;
}
//得到生产厂家的信息
// 输入参数: pchManufacturer - 获取厂家信息
const char* CSmsOper::OnGetManufacturer(int hCom)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -