ESP32项目(二、笔记本和ESP32点到点通讯)
目录
一、环境配置
1.安装vscode
2.安装python
二、ESP32代码编写
1.esp32代码编写
2.powershell命令行测试
三、PC机python代码编写
现在的业务内容是,工控机向ESP32发送任务,之后ESP32执行任务,执行完毕之后反馈给工控机。所以比较容易想到路由和POST请求,但是经过我的测试,如果将ESP32和笔记本直接套在同一个局域网下,由于需要路由器做周转,那么传输延迟比较大。
幸运的是,ESP32可以做AP使用,我们让ESP32作为AP发出一个无线网,之后使用笔记本连接,这样可以大大的解决了延迟的问题。
一、环境配置
1.安装vscode
网址:https://code.visualstudio.com/Download
一路next就可以安装了
2.安装python
网址:https://www.python.org/downloads/windows/
随便下载一个
之后安装就可以,注意将python的路径加到环境变量里面。
之后打开一个中断,输入python
二、ESP32代码编写
1.esp32代码编写
主要是三个功能,第一是作为AP,第二是作为一个路由接受指令,第三是向某个路由发送结果。
我这里是发送json类型指令控制esp32的灯亮或者灭。
#include <WiFi.h>
#include <WebServer.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>// ===== AP 配置 =====
const char* ap_ssid = "ESP32_AP";
const char* ap_password = "12345678";// ===== 笔记本 HTTP 接口 =====
String pc_server_url = "http://192.168.4.2:5000/done"; // PC 在 AP 下分配的 IP// ===== 内置 LED 引脚 =====
const int ledPin = 2;// ===== WebServer 对象 =====
WebServer server(80);// ===== 任务队列标志 =====
String pendingCallback = "";// ===== POST 请求处理 =====
void handlePost() {if (!server.hasArg("plain")) {server.send(400, "application/json", "{\"status\":\"error\",\"msg\":\"no body\"}");return;}String body = server.arg("plain");Serial.println("收到POST内容: " + body);// 解析 JSONStaticJsonDocument<200> doc;DeserializationError error = deserializeJson(doc, body);if (error) {server.send(400, "application/json", "{\"status\":\"error\",\"msg\":\"invalid json\"}");return;}String command = doc["led"];if (command == "ON") {digitalWrite(ledPin, HIGH);server.send(200, "application/json", "{\"status\":\"ok\",\"led\":\"on\"}");} else if (command == "OFF") {digitalWrite(ledPin, LOW);server.send(200, "application/json", "{\"status\":\"ok\",\"led\":\"off\"}");} else {server.send(400, "application/json", "{\"status\":\"error\",\"msg\":\"invalid command\"}");return;}// 异步标记,loop 中执行回调pendingCallback = "{\"task\":\"done\"}";
}void setup() {Serial.begin(115200);pinMode(ledPin, OUTPUT);// 启动 ESP32 APWiFi.softAP(ap_ssid, ap_password);Serial.println("AP模式启动,等待设备连接...");Serial.print("AP IP地址: ");Serial.println(WiFi.softAPIP());// 注册 POST 路由server.on("/led", HTTP_POST, handlePost);server.begin();Serial.println("HTTP服务器已启动");
}void loop() {server.handleClient();// 如果有任务回调 PCif (pendingCallback != "") {HTTPClient http;http.begin(pc_server_url);http.addHeader("Content-Type", "application/json");int code = http.POST(pendingCallback);Serial.printf("向PC反馈任务完成, 返回码: %d\n", code);http.end();pendingCallback = "";}
}
2.powershell命令行测试
Invoke-WebRequest -Uri "http://192.168.4.1/led" -Method POST -Body '{"led":"OFF"}' -ContentType "application/json"
Invoke-WebRequest -Uri "http://192.168.4.1/led" -Method POST -Body '{"led":"OFF"}' -ContentType "application/json"
三、PC机python代码编写
# 文件名: esp32_test.py
# 安装依赖: pip install requests flaskimport requests
from flask import Flask, request, jsonify
import threading
import time# =====================
# 1️⃣ Flask 接收 ESP32 回调
# =====================
app = Flask(__name__)@app.route('/done', methods=['POST'])
def handle_done():data = request.get_json()print("ESP32 回调收到任务完成:", data)return jsonify({"status":"ok"}), 200def run_flask():# 监听 5000 端口,所有 IP 可访问app.run(host='0.0.0.0', port=5000)# =====================
# 2️⃣ 控制 ESP32 LED
# =====================
def control_led():esp32_url = "http://192.168.4.1/led" # ESP32 AP IP# 点亮 LEDresp = requests.post(esp32_url, json={"led":"ON"})print("点亮 LED 返回:", resp.text)# 熄灭 LEDresp = requests.post(esp32_url, json={"led":"OFF"})print("熄灭 LED 返回:", resp.text)# =====================
# 主程序
# =====================
if __name__ == "__main__":# 1️⃣ 启动 Flask 服务,接收 ESP32 回调flask_thread = threading.Thread(target=run_flask)flask_thread.daemon = Trueflask_thread.start()print("Flask 回调服务已启动,监听 http://<PC_IP>:5000/done")# 2️⃣ 等几秒确保 ESP32 已连接 APtime.sleep(2)# 3️⃣ 控制 ESP32 LEDcontrol_led()# 4️⃣ 保持主线程运行,等待回调print("等待 ESP32 回调任务完成...")while True:time.sleep(1)
实验结果