esp8266根据httpserver状态,调用网络唤醒,实现一键开机
 
  
  
 
 
 
 
一.开发板程序
 
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
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());
  
  
}
void loop() {
  checkFlag();
  delay(10000); 
}
void test() {
  Serial.println("fx call successd");
}
void wakeUpComputer() {
    WiFiUDP udp;
    udp.begin(9); 
    byte mac[6] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 }; 
    byte packet[102];
    memset(packet, 0xFF, 6); 
    for (int i = 6; i < 102; i += 6) {
        memcpy(packet + i, mac, 6); 
    }
    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"); 
    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();
  }
}
 
二. 服务端
 
from flask import Flask, jsonify, request
app = Flask(__name__)
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__':
    
    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"}'