ESP8266 WIFI模块学习之路(12)——AT命令自动配置,实现远程关闭电脑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiaoCaiDaYong/article/details/89305533

这个博文和上一个博文【ESP8266 WIFI模块学习之路(12)】基本相似,有一点不同的是,这个是:模块和手机通过路由器(局域网)通信,从而关闭电脑。这样的好处是,手机不需要每次连接ESP8266模块产生的WIFI(模块作为客户端,路由器作为服务器),这样比较方便,手机直接连接路由器(不影响上网,也不影响控制电脑)。

用到的AT命令有:

AT+CWMODE=1    //设置为STA
AT+RST        //重启
AT+CWJAP="miwalk_office","cqmyg14dss.miwalk"    //搜索并连接路由器,x为路由器名,*为密码

//再打开手机有人网络助手,TCP server——端口号8080,记住本地IP,下面要用。
AT+CIPMODE=1    //透传
AT+CIPMUX=0    //单路模式
AT+CIPSTART="TCP","192.168.0.100",1234    //刚才记下的IP和端口号
AT+CIPSEND    //进入透传

上面有些命令是不需要重复配置的,下电重启,命令依然保留。所以代码中不需要配置上述所以命令,只需要配置上电重启会丢失的命令。

具体命令所对应的意思,及哪些命令会保留,或掉电会失效,可以参考帮助文档:

代码如下:

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//



#include "pch.h"


#define _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include "tchar.h"

char flag = 0;	//	wt
int main()
{
	HANDLE hCom;
	hCom = CreateFile(_T("COM4"),//COM4口
		GENERIC_READ | GENERIC_WRITE,//允许读和写
		0,//独占方式
		NULL,
		OPEN_EXISTING,//打开而不是创建
		0,//同步方式
		NULL);
	if(hCom == (HANDLE)-1)
	{
		printf("打开COM失败!\n");
		return FALSE;
	}
	else
	{
		printf("COM打开成功!\n");
	}
	SetupComm(hCom, 20480, 20480);//输入缓冲区和输出缓冲区的大小都是1024
	
	COMMTIMEOUTS TimeOuts;//设定读超时	
	TimeOuts.ReadIntervalTimeout = 100;
	TimeOuts.ReadTotalTimeoutMultiplier = 500;
	TimeOuts.ReadTotalTimeoutConstant = 5000;	
	TimeOuts.WriteTotalTimeoutMultiplier = 500;//设定写超时
	TimeOuts.WriteTotalTimeoutConstant = 2000;
	SetCommTimeouts(hCom, &TimeOuts);//设置超时

	DCB dcb1;
	GetCommState(hCom, &dcb1);
	dcb1.BaudRate = 115200;//波特率为115200
	dcb1.ByteSize = 8;//每个字节有8位
	dcb1.Parity = NOPARITY;//无奇偶校验位
	dcb1.StopBits = TWOSTOPBITS;//两个停止位
	dcb1.fParity = FALSE;
	dcb1.fNull = FALSE;
	SetCommState(hCom, &dcb1);
	DWORD wCount = 256;//读取的字节数
	DWORD wCount1;
	PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);//清空缓冲区
	while(1)
	{
		int i = 0;
		FILE *fp1;
		unsigned char str[256];
		char sendData[256]={0};	//	写入串口缓存区的数组	王艇
		if(0 == flag)
		{
			/****** 配置AT+CIPMODE=1 ******/
			strcpy(sendData,"AT+CIPMODE=1\r\n");	//	AT+CIPMODE=1
			DWORD dwWritelen = 0;		//	wt
			if(!WriteFile(hCom,sendData,14,&dwWritelen,NULL))		//	wt
			{
				//printf("串口发送数据失败!\n");
			}
			printf("AT+CIPMODE=1串口发送数据成功!\n");	//	wt

			if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
			{
				printf("读串口失败!");
				return FALSE;
			}		
			fp1 = fopen("串口发送的数.txt", "a+");	
			printf("读串口成功!\n");
			printf("读取长度为:%d\n", wCount1);
			printf("读取数据为:\n");
			for(i=0; i< wCount1; i++)
			{
				printf("%c", str[i]);
				fprintf(fp1, "%c", str[i]);
			}
			/****** 配置AT+CIPMUX=0 ******/
			strcpy(sendData,"AT+CIPMUX=0\r\n");	//	AT+CIPMODE=1
			dwWritelen = 0;		//	wt
			if(!WriteFile(hCom,sendData,13,&dwWritelen,NULL))		//	wt
			{
				//printf("串口发送数据失败!\n");
			}
			printf("AT+CIPMUX=0串口发送数据成功!\n");	//	wt

			if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
			{
				printf("读串口失败!");
				return FALSE;
			}		
			fp1 = fopen("串口发送的数.txt", "a+");	
			printf("读串口成功!\n");
			printf("读取长度为:%d\n", wCount1);
			printf("读取数据为:\n");
			for(i=0; i< wCount1; i++)
			{
				printf("%c", str[i]);
				fprintf(fp1, "%c", str[i]);
			}


			/****** AT+CIPSTART="TCP","192.168.1.191",8080 ******/
			strcpy(sendData,"AT+CIPSTART=\"TCP\",\"192.168.1.191\",8080\r\n\r\n");	//	AT+CIPSTART=\"TCP\",\"192.168.4.2\",8080		
			dwWritelen = 0;		//	wt
			if(!WriteFile(hCom,sendData,40,&dwWritelen,NULL))		//	wt
			{
				printf("串口发送数据失败!\n");
			}
			for(i=0;i<60000;i++);
			printf("AT+CIPSTART=\"TCP\",\"192.168.1.191\",8080串口发送数据成功!\n");	

			if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
			{
				printf("读串口失败!");
				return FALSE;
			}		
			fp1 = fopen("串口发送的数.txt", "a+");	
			printf("读串口成功!\n");
			printf("读取长度为:%d\n", wCount1);
			printf("读取数据为:\n");
			for(i=0; i< wCount1; i++)
			{
				printf("%c", str[i]);
				fprintf(fp1, "%c", str[i]);
			}



			flag = 1;
		}


		if(!ReadFile(hCom, str, wCount, &wCount1, NULL))
		{
			printf("读串口失败!");
			return FALSE;
		}		
		fp1 = fopen("串口发送的数.txt", "a+");	
		printf("读串口成功!\n");
		

		printf("读取长度为:%d\n", wCount1);
		printf("读取数据为:\n");
		for(i=0; i< wCount1; i++)
		{
			printf("%c", str[i]);
			fprintf(fp1, "%c", str[i]);
		}
		if('W' == str[0])		//	wt
		{
			system("shutdown -p");
		}
		printf("\n");
		fclose(fp1);
	}

	CloseHandle(hCom);

    std::cout << "Hello World!\n";

	return 0;
}







// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

这样就可以实现,连接统一路由,手机远程控制电脑关机,只需要输入W 就可实现关机。

猜你喜欢

转载自blog.csdn.net/XiaoCaiDaYong/article/details/89305533