根据前几个博客,也是能实现远程关闭电脑的,但ESP8266模块的命名需要手动下载,其实为了实现方便,我们需要自动下载AT命令,这样我们就更方面了,就能够实现真正的远程控制。
现在需要实现的功能是:
1.通过VC实现数据下发给USB串口,通过串口下发的数据来配置AT命令。
2.实现手机和模块的直接通信
下一个博文将讲一下通过路由器进行控制(局域网控制)。代码如下:
// 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)
{
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]);
}
strcpy(sendData,"AT+CIPSTART=\"TCP\",\"192.168.4.2\",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.4.2\",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 文件
这样就实现了AT的命令的自动下载,然后自动连接。
然后,打开有人网络助手激活端口(端口号要和代码中一致),若连接成功,则如下图效果:
电脑端:
手机端:
程序中实现是输入W 就可以实现电脑自动关机。