ESP32对接Flask服务器:实时可视化遇连接拒绝问题求助
ESP32连接Flask应用出现「connection refused」的排查方案
我正尝试将ESP32的数据发送至PC端的Flask应用,实现数据实时可视化。已参照教程并检查代码,但ESP32始终提示「connection refused」(连接被拒绝)错误。我已反复核对IP地址与端口,确认二者匹配,恳请分析该问题的可能原因。
Flask应用代码(app.py)
from flask import Flask, render_template, request, jsonify import json app = Flask(__name__, template_folder='template') # 存储从ESP32接收的数据 data = {'gasto': [], 'presion': [], 'vibracion': []} @app.route('/') def index(): return render_template('index.html') @app.route('/data', methods=['POST']) def receive_data(): try: content = request.get_json() gasto = content['gasto'] presion = content['presion'] vibracion = content['vibracion'] data['gasto'].append(gasto) data['presion'].append(presion) data['vibracion'].append(vibracion) print(f"Received data: gasto={gasto}, presion={presion}, vibracion={vibracion}") return jsonify({'success': True}) except Exception as e: print(f"Error receiving data: {str(e)}") return jsonify({'success': False, 'error': str(e)}) @app.route('/get_data') def get_data(): return jsonify(data) if __name__ == '__main__': app.run(debug=True)
ESP32代码
#include <WiFi.h> #include <HTTPClient.h> #include <ArduinoJson.h> const char* ssid = "ASUS_F4"; // 你的Wi-Fi名称 const char* password = "banana_6424"; // Wi-Fi密码 const char* serverAddress = "http://192.168.50.177:5000/data"; // 替换为你的PC IP地址 void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { float gasto = 123.45; // 模拟流量数据 float presion = 67.89; // 模拟压力数据 float vibracion = 0.12; // 模拟振动数据 // 创建JSON对象 DynamicJsonDocument jsonDoc(200); jsonDoc["gasto"] = gasto; jsonDoc["presion"] = presion; jsonDoc["vibracion"] = vibracion; // 将JSON序列化为字符串 String payload; serializeJson(jsonDoc, payload); // 创建HTTPClient实例 HTTPClient http; Serial.println("Server Address: " + String(serverAddress)); // 发送POST请求到服务器 http.begin(serverAddress); http.addHeader("Content-Type", "application/json"); int httpResponseCode = http.POST(payload); if (httpResponseCode > 0) { Serial.printf("HTTP Response code: %d\n", httpResponseCode); String response = http.getString(); Serial.println(response); } else { Serial.printf("HTTP Request failed: %s\n", http.errorToString(httpResponseCode).c_str()); } http.end(); delay(5000); // 等待5秒后发送下一组数据 }
可能的原因及解决方法
- Flask服务绑定地址限制:默认
app.run(debug=True)仅绑定本地回环地址127.0.0.1,局域网内的ESP32无法访问。修改启动代码为app.run(debug=True, host='0.0.0.0'),让服务监听所有网卡接口。 - PC防火墙拦截:Windows防火墙或第三方安全软件可能阻止了5000端口的入站连接。可以临时关闭防火墙测试,或者给Flask应用添加允许入站连接的规则。
- 网络隔离问题:ESP32和PC可能不在同一局域网网段,或者路由器开启了无线/有线隔离、不同频段隔离(比如PC连2.4G,ESP32连5G)。先确认两者IP在同一网段,再用PC ping ESP32的IP(可在ESP32的Serial输出中查看
WiFi.localIP()),检查连通性。 - 端口被占用:5000端口可能被其他程序占用,导致Flask无法正常启动。用
netstat -ano | findstr :5000(Windows)或lsof -i :5000(Linux/macOS)检查端口占用情况,更换为未被占用的端口(比如5001)并同步修改ESP32中的serverAddress。 - ESP32网络连接异常:虽然代码显示已连接WiFi,但可能存在隐性连接问题。在
setup函数中添加Serial.println(WiFi.localIP());,确认ESP32获取到的IP有效,且能正常访问局域网内其他设备。
内容的提问来源于stack exchange,提问作者Kevin Olvera
相关产品推荐
相关产品推荐

