这个博文和上一个博文【ESP8266 WIFI模块学习之路(11)】基本相似,有一点不同的是,这个是:模块和手机通过路由器(局域网)通信,从而关闭电脑。这样的好处是,手机不需要每次连接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 //进入透传
上面有些命令是不需要重复配置的,下电重启,命令依然保留。所以代码中不需要配置上述所以命令,只需要配置上电重启会丢失的命令。
具体命令所对应的意思,及哪些命令会保留,或掉电会失效,可以参考帮助文档:
ATK-ESP8266 WIFI用户手册及ESP8266系列入门教程文档
代码如下:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#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 就可实现关机。