📄 smm.cpp
字号:
// SMM.cpp: implementation of the CSMM class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SMM4COM.h"
#include "SMM.h"
#include "winsock2.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSMM::CSMM()
{
m_szInBuffer[0] = '\0';
m_szOutBuffer[0] = '\0';
m_szTempBuffer[0] = '\0';
}
CSMM::~CSMM()
{
}
//////////////////////////////////////////////////////////////////////////
//功能描述:
// 把ANSI字符集转换成 UNICODE字符集;
//参数描述:
// szConvertString:输入,待转换的字符串指针;
// szConvertedString:输出,接收转换后的十六进制码;
//返回值描述:
// 0:成功
// 1:失败
//////////////////////////////////////////////////////////////////////////
BOOL CSMM::ANSI2UCS2(char * szConvertString,char * szConvertedString)
{
char szTemp[5];
int i;
int nConvertResult;
WCHAR wszConveredString[BUFFER_SIZE_OUT];
//开始转换:
nConvertResult = MultiByteToWideChar(936,0,szConvertString,-1,wszConveredString,sizeof(wszConveredString)/sizeof(wszConveredString[0])) - 1;
//以下是取出UNICODE字符的十六进制码放入szConvertedString
if(nConvertResult)
{
for(i = 0; i < nConvertResult; i++)
{
sprintf(szTemp,"%04x",(unsigned short)wszConveredString[i]);
strcat(szConvertedString, szTemp);
}
return 0;
}
else
{
return 1;
}
}
////////////////////////////////////////////////////////////////////////
//功能描述:
// 把UNICODE字符集转换成 ANSI字符集;
//参数描述:
// wszConvertString:输入,待转换的字符串指针;
// szConvertedString:输出,接收转换后字符串指针;
//返回值描述:
// 0:成功
// 1:失败
//////////////////////////////////////////////////////////////////////////
BOOL CSMM::UCS22ANSI(char * wszConvertString,char * szConvertedString)
{
int nANSILen = 0;
int nUNICODELen = 0;
int nLen;
nUNICODELen = wcslen((unsigned short *)wszConvertString);
nANSILen = WideCharToMultiByte(936, WC_COMPOSITECHECK,(LPWSTR)wszConvertString, nUNICODELen, NULL, 0, NULL, NULL);
nLen = WideCharToMultiByte(936, WC_COMPOSITECHECK,(const unsigned short *)wszConvertString, nUNICODELen, szConvertedString, nANSILen, NULL, NULL);
szConvertedString[nLen] = 0;
if(!nLen)
return 1;
else
return 0;
}
//////////////////////////////////////////////////////////////////////////
//功能描述:
// 设置短消息初始化命令;
//参数描述:
// szInitCommand:输入,初始化AT指令;
//
//返回值描述:
// 0:成功
// 1:失败
//////////////////////////////////////////////////////////////////////////
BOOL CSMM::SetATCmd(char * szInitCommand)
{
int nErr;
m_szTempBuffer[0] = '\0';
m_szInBuffer[0] = '\0';
sprintf(m_szTempBuffer,"%s",szInitCommand);//拼AT命令;
strcat(m_szTempBuffer,"\r");
nErr = SendCmd(m_szTempBuffer,m_szInBuffer,BUFFER_SIZE_IN);//发送命令;
if(!nErr)
{
if(strstr(m_szInBuffer,"OK") == NULL)
{
return 1;
}
else
{
return 0;
}
}
else
return 1;
}
//////////////////////////////////////////////////////////////////////////
//功能描述:
// 发送短信;
//参数描述:
// szMobileID:输入,手机号码;
// szContent :输入,待发内容;
//返回值描述:
// 0:成功
// 1: 失败;
//注意:此函数要调用ANSI2UCS2函数,把手机号码&待发内容转换成UNICODE型;
//////////////////////////////////////////////////////////////////////////
BOOL CSMM::SMSSend(char * szMobileID,char * szContent)
{
//AT命令&发送手机号&内容
int nErr;
m_szOutBuffer[0] = '\0';
m_szTempBuffer[0] = '\0';
sprintf(m_szOutBuffer,"%s",COMMAND_SMS_SEND);
strcat(m_szOutBuffer,"\"");
//把手机号转换成UNICODE型,如果成功;
if(!ANSI2UCS2(szMobileID,m_szTempBuffer))
{
//组拼命令&手机号;
strcat(m_szOutBuffer,m_szTempBuffer);
strcat(m_szOutBuffer,"\"");
strcat(m_szOutBuffer,"\r");
//发送AT命令&手机号;
m_szInBuffer[0] = '\0';
nErr = SendCmd(m_szOutBuffer,m_szInBuffer,BUFFER_SIZE_IN );
if(!nErr)
{
//组拼待发内容;
//把待发内容转换成UNICODE型,如果成功
m_szTempBuffer[0] = '\0';
if(!ANSI2UCS2(szContent,m_szTempBuffer))
{
m_szOutBuffer[0] = '\0';
strcat(m_szOutBuffer,m_szTempBuffer);
strcat(m_szOutBuffer,"\x1a");
m_szInBuffer[0] = '\0';
nErr = SendCmd(m_szOutBuffer,m_szInBuffer,BUFFER_SIZE_IN);//发送内容;
if(!nErr)
{
//如果成功,返回值必有”OK“;
if(strstr(m_szInBuffer,"OK") != NULL)
{
return 0;
}
else
{
return 1;
}
}
else
{
return 1;
}
}
else
{
return 1;
}
}
else
{
return 1;
}
}
else
return 1;
}
//////////////////////////////////////////////////////////////////////////
//功能描述:
// 接收短消息的记录号;
//参数描述:
// 无;
//返回值描述:
// >0:成功(返回没有阅读的最近的短消息的记录号)
// 0 : 失败
//////////////////////////////////////////////////////////////////////////
int CSMM::SMSRecv()
{
char * pDestination;
char cTempNO[4];
int nCharIndex,nCharNum;
int nErr;
int nFindChar = ',';
m_szInBuffer[0] = '\0';
cTempNO[0] = '\0';
//发送命令;
nErr = ReadCmd(m_szInBuffer,BUFFER_SIZE_IN);
if(!nErr)
{
//成功表示有短消息;
if(strstr(m_szInBuffer,"+CMTI:") != NULL)
{
nCharNum = strlen(m_szInBuffer);
//返回状态一定有一个“,”,而后面就是记录号;
pDestination = strrchr(m_szInBuffer,nFindChar);
nCharIndex = pDestination - m_szInBuffer;
if(pDestination != NULL)
{
nCharNum -= (nCharIndex + 1);
strncpy(cTempNO,m_szInBuffer + (nCharIndex + 1),nCharNum);
cTempNO[nCharNum] = 0;
int nIndex = atoi(cTempNO);
return nIndex;
}
else
return 0;
}
else
return 0;
}
else
return 0;
}
//////////////////////////////////////////////////////////////////////////
//功能描述:
// 根据短消息的记录号,接收短消息;
//参数描述:
// szSMSContent:输出,阅读的最近的短消息内容;
// nIndex:输入,没有阅读的最近的短消息的记录号;
//返回值描述:
// 0:成功
// 1:失败
//////////////////////////////////////////////////////////////////////////
BOOL CSMM::SMSRead(char * szSMSContent,int nIndex)
{
int nFindChar;
int nCharIndexStart,nCharIndexEnd,nContentLength;
int i,nErr;
char * pDestination;
char cTemp[5];
wchar_t szRecvAddress[BUFFER_SIZE_TEMP];
m_szOutBuffer[0] = '\0';
cTemp[0] = '\0';
//拼阅读命令"AT+CMGR="
sprintf(m_szOutBuffer,"%s%d",COMMAND_SMS_READ,nIndex);
strcat(m_szOutBuffer,"\r");
m_szInBuffer[0] = '\0';
//发送阅读命令;
nErr = SendCmd(m_szOutBuffer,m_szInBuffer,DEFAULT_BUFFER_SIZE * 2);
if(!nErr)
{//成功一定返回“OK”
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -