⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.cpp

📁 使用手机发送和接收短信时所使用的DLL,绝对可用的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -