当前位置: 首页 > article >正文

esp8266根据httpserver状态,调用网络唤醒,实现一键开机

esp8266根据httpserver状态,调用网络唤醒,实现一键开机

        • 一.开发板程序
        • 二. 服务端
        • 三.服务端状态变更

在这里插入图片描述

一.开发板程序
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>

// 替换为你的WiFi信息
const char* ssid = "wifiname";
const char* password = "password";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("WiFi not connected");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  //ticker.attach(10, checkFlag);
  // ticker.attach(10, test);
}
void loop() {
  checkFlag();
  delay(10000); //每10秒调用一次
}

void test() {
  Serial.println("fx call successd");
}

void wakeUpComputer() {
    WiFiUDP udp;
    udp.begin(9); // WOL通常使用端口9
    byte mac[6] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 }; // 你的计算机的MAC地址
    byte packet[102];
    memset(packet, 0xFF, 6); // 填充前6个字节为0xFF
    for (int i = 6; i < 102; i += 6) {
        memcpy(packet + i, mac, 6); // 复制MAC地址到packet
    }
    udp.beginPacket("255.255.255.255", 9); // 广播地址和端口号
    udp.write(packet, 102);
    udp.endPacket();
    Serial.println("Magic Packet Sent!");
}

void checkFlag() {
  Serial.println("start checkflag");
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    WiFiClient client;
    http.begin(client, "http://192.168.1.1:4050/api/endpoint"); //服务端api
    int httpCode = http.GET();
    Serial.println(httpCode);
    if (httpCode > 0) {
      Serial.println("HTTP GET OK");
      String payload = http.getString();
      DynamicJsonDocument doc(1024);
      deserializeJson(doc, payload);
      String flag = doc["flag"];
      String additionalInfo = doc["additional_info"];
      if (flag == "wake") {
        Serial.println("start wakeup");
        wakeUpComputer();
      } else {
        Serial.println("HTTP GET not wakeup");
      }
    } else {
      Serial.println("HTTP GET failed");
    }
  http.end();
  }
}

二. 服务端
#!/usr/bin/python
from flask import Flask, jsonify, request
app = Flask(__name__)
# 默认flag值
flag_data = {
    "flag": "idle",
    "additional_info": ""
}
@app.route('/api/endpoint', methods=['GET'])
def get_flag():
    """返回当前flag值和附加信息"""
    return jsonify(flag_data)
@app.route('/api/update_flag', methods=['POST'])
def update_flag():
    """更新flag值和附加信息"""
    global flag_data
    data = request.json
    if 'flag' in data:
        flag_data['flag'] = data['flag']
    if 'additional_info' in data:
        flag_data['additional_info'] = data['additional_info']
    return jsonify(flag_data), 200
if __name__ == '__main__':
    # 运行Flask应用,绑定到所有IP地址,端口4050
    app.run(host='0.0.0.0', port=4050)
三.服务端状态变更
curl http://192.168.1.1:4050/api/endpoint
curl -X POST http://192.168.1.1:4050/api/update_flag -H "Content-Type: application/json" -d '{"flag": "wake", "additional_info": "some info"}'
curl -X POST http://192.168.1.1:4050/api/update_flag -H "Content-Type: application/json" -d '{"flag": "idle", "additional_info": "some info"}'

http://www.kler.cn/a/285918.html

相关文章:

  • 深入学习电路基础:从理论到实践
  • 《外国教育研究》
  • (每日一问)计算机网络:HTTP 与 HTTPS 的区别
  • MySQL系列—6.权限管理
  • Nginx跨域问题解决
  • 5G NR 辅同步信号SSS介绍 MATLAB实现
  • Git 使用指南 --- 版本管理
  • 【conda】导出和重建 Conda 环境
  • 动作损失 ​ 的定义
  • 恭喜各位天命人!2024年国自然基金放榜了!优青654项、杰青433项,附个人查询攻略
  • 如何将开发工具设置成滚动鼠标改变字体大小
  • 可能是支持属性最多的类似验证码的输入控件了。一个超好用的验证码,卡号,车牌号,IP地址-输入控件 - 掘金
  • 计算机毕设选题推荐-基于python的豆瓣电子图书数据可视化分析
  • 博弈论(Nim游戏的扩展)
  • 【Linux】Ubuntu 安装 NFS 步骤详解
  • IPv6配置实验(OSPFv3)
  • 2024年8月文章一览
  • 项目实战-多子集循环嵌套 更新时的处理逻辑
  • 2D 智慧水务厂:引领水资源数字化管理
  • 【Linux修行路】进程通信——消息队列、信号量