esp8266远程关机-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4603|回复: 6

[分享] esp8266远程关机

[复制链接]
发表于 2020-11-16 11:23 | 显示全部楼层 |阅读模式
本帖最后由 吹向陆地的风 于 2020-11-18 10:02 编辑

之前写过远程开机的例子,然后有人说他写关机代码,然后就等了好久。。。。。
下面是关机代码,Visual Studio 2019的C++环境
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _WINSOCK_DEPRECATED_NO_WARNINGS
  3. #include<WINSOCK2.H>
  4. #include<iostream>
  5. #pragma comment(lib,"WS2_32.lib")
  6. char dwon[] = "shutdown";//关机指令
  7. char num[8];//中转用
  8. using namespace std;
  9. int main()
  10. {

  11.         WSADATA wsaData;//初始化
  12.         SOCKET RecvSocket;
  13.         sockaddr_in RecvAddr;//服务器地址
  14.         int Port = 2333;//服务器监听端口
  15.         char buf[8];//发送缓冲
  16.         int buflen = 8;//缓冲区大小
  17.         sockaddr_in SenderAddr;
  18.         int SenderAddrSize = sizeof(SenderAddr);
  19.         //初始化Socket
  20.         WSAStartup(MAKEWORD(2, 2), &wsaData);
  21.         //创建接收数据报的socket
  22.         RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  23.         //将socket与制定端口和0.0.0.0绑定
  24.         RecvAddr.sin_family = AF_INET;
  25.         RecvAddr.sin_port = htons(Port);
  26.         RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  27.         bind(RecvSocket, (SOCKADDR*)&RecvAddr, sizeof(RecvAddr));
  28.         //调用Recvfrom函数在绑定的socket上接收数据
  29.         printf("监听中......\n");
  30.         
  31.         while (1)
  32.         {
  33.                 recvfrom(RecvSocket, buf, buflen, 0, (SOCKADDR*)&SenderAddr, &SenderAddrSize);//检测接收数据
  34.                 printf("收到指令:  ");
  35.                 for (int i=0;i< buflen;i++)
  36.                 {
  37.                         printf("%c", buf[i]);
  38.                         num[i] = buf[i];
  39.                 }
  40.                 //printf("%s\n", RecvBuf);
  41.                 printf("\n");
  42.                 if (strcmpi(dwon, num) == 0)//对比udp包数据是否一致
  43.                 {
  44.                         printf("120秒后关机\n");
  45.                         system("shutdown -s -t 120");//win的关机指令,120为秒数
  46.                         printf("\n");
  47.                 }
  48.         }
  49. }
复制代码
该代码实现监听udp2333端口,收到数据为“shutdown”的指令后执行120S后关机的动作,适用于win系统。

下面是Arduino代码,使用esp8266,实现wol与关机代码,esp8266向设备发送关机指令,设备执行。
  1. #define BLINKER_WIFI
  2. #include <Blinker.h>
  3. #include <ESP8266WiFi.h>
  4. #include <WiFiUdp.h>
  5. //引用各类库

  6. char auth[] = "auth";
  7. char ssid[] = "ssid";
  8. char pswd[] = "password";
  9. //Blinker常规操作
  10. #define BUTTON_1 "WOL"//定义开机按键
  11. #define BUTTON_2 "DOWN"//定义关机按键
  12. BlinkerButton Button1(BUTTON_1);
  13. BlinkerButton Button2(BUTTON_2);
  14. void button1_callback(const String & state)//回调函数
  15. {
  16.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  17.   BLINKER_LOG("get button state: ", state);

  18.   if (state == BLINKER_CMD_ON) {
  19.     BLINKER_LOG("Toggle on!");
  20.     wol();
  21.     Button1.print("on");
  22.     Blinker.delay(2000);
  23.     Button1.print("off");//返回关闭状态,方便下一次使用。
  24.   }

  25. }

  26. void button2_callback(const String & state)//回调函数
  27. {
  28.   digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  29.   BLINKER_LOG("get button state: ", state);

  30.   if (state == BLINKER_CMD_ON) {
  31.     BLINKER_LOG("Toggle on!");
  32.     down();
  33.     Button2.print("on");
  34.     Blinker.delay(2000);
  35.     Button2.print("off");//返回关闭状态,方便下一次使用。
  36.   }

  37. }
  38. void dataRead(const String & data)
  39. {
  40.   BLINKER_LOG("Blinker readString: ", data);

  41.   Blinker.vibrate();

  42.   uint32_t BlinkerTime = millis();

  43.   Blinker.print("millis", BlinkerTime);
  44. }

  45. const char * udpAddress = "192.168.1.255";//udp接收地址,我这里是使用的广播,注意网段
  46. const int udpPort = 2333;//udp端口
  47. byte MAC[6] = {0x00, 0x10, 0x12, 0xD0, 0x9C, 0x6D};//MAC号
  48. byte package[102];

  49. //The udp library class
  50. WiFiUDP udp;

  51. void setup() {
  52.   Serial.begin(9600);
  53.   BLINKER_DEBUG.stream(Serial);
  54.   //WiFi.begin(ssid,pswd);
  55.   Blinker.begin(auth, ssid, pswd);
  56. Blinker.notify("上号!!!");
  57.   Blinker.attachData(dataRead);
  58.   Button1.attach(button1_callback);//注册回调函数
  59.   Button2.attach(button2_callback);
  60. }
  61. void loop() {
  62.   Blinker.run();
  63. }

  64. void wol()//开机代码部分
  65. {
  66.   int i, k, j = 0;
  67.   udp.beginPacket(udpAddress, udpPort);//准备发送,设置地址和端口
  68.   //下面构建magic packet
  69.   for (i = 0; i < 6; i++, j++)
  70.   {
  71.     package[j] = 0xFF;
  72.   }
  73.   for (i = 0; i < 16; i++) {
  74.     for ( k = 0; k < 6; k++, j++)
  75.       package[j] = MAC[k];
  76.   }
  77.   udp.write((byte*)package, 102);//将数组package放入缓冲区,准备发送
  78.   udp.endPacket();//发送

  79.   Blinker.delay(1000);
  80. }

  81. void down()//关机
  82. {
  83.   char sd[] = "shutdown";//与电脑相对应的指令
  84.   udp.beginPacket(udpAddress, udpPort);//准备发送,设置地址和端口
  85.   udp.write((char*)sd, 8);
  86.   udp.endPacket();
  87. }
复制代码

在app中添加开机按钮WOL,关机按钮DOWN,按键类型选择开关按键。wol部分其他帖子有,不再详述,下面是已编译好的win程序,也可以修改代码自己编译。

shutdown.rar

10.48 KB, 下载次数: 9

关机程序

 楼主| 发表于 2021-7-6 11:15 | 显示全部楼层

测试可用
 楼主| 发表于 2020-11-18 10:01 | 显示全部楼层
本帖最后由 吹向陆地的风 于 2020-11-18 10:04 编辑

setup中注册回调函数打字的时候出错,已更正
原为
  1. Button1.attach(button1_callback);//注册回调函数
  2.   Button1.attach(button2_callback);
复制代码

应为
  1. Button1.attach(button1_callback);//注册回调函数
  2.   Button2.attach(button2_callback);
复制代码
发表于 2021-4-4 15:24 | 显示全部楼层
关机程序无法下载显示    抱歉,该附件无法读取
发表于 2021-4-6 15:08 | 显示全部楼层
吹向陆地的风 发表于 2020-11-18 10:01
setup中注册回调函数打字的时候出错,已更正
原为
应为

关机程序无法下载,显示 :   抱歉,该附件无法读取
 楼主| 发表于 2021-4-7 15:33 | 显示全部楼层
p12345f 发表于 2021-4-6 15:08
关机程序无法下载,显示 :   抱歉,该附件无法读取

上面有源码,可以自己编译一下,vs2019 C++,社区版免费的,文件不能下载是网站的锅
发表于 2021-7-5 16:07 | 显示全部楼层
这个可以用吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 12:56 , Processed in 0.090937 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表