无法将 ESP8266 连接到 Flask 服务器
Failing to connect an ESP8266 to a Flask Server
我有一个烧瓶应用程序,我需要与我的 ESP8266 进行通信,但我很遗憾地未能实现这一目标。这不应该很难,但我显然遗漏了一些东西,而且我不会感到惊讶,因为这是我第一次使用 Flask。让我试着解释一下我到目前为止所做的事情。
这是我的烧瓶代码:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/postjson', methods=['GET', 'POST'])
def postJsonHandler():
content = request.get_json()
print (content)
return 'JSON posted'
如您所见,没什么特别的。
它在默认的本地 http://127.0.0.1:5000/. Using Postman, I can send a JSON with data to http://127.0.0.1:5000/postjson 上运行并且运行起来非常棒,JSON 按我的意愿打印在终端上。
当我将 ESP 加入混音时,问题就开始了。这是我来自 ESP 的代码,同样,这里没有什么特别的,所有你在谷歌上找到的东西:
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200); //Serial connection
WiFi.begin("MyInternet", "MyPassword"); //WiFi connection
while (WiFi.status() != WL_CONNECTED) { //Wait for the WiFI connection completion
delay(500);
Serial.println("Waiting for connection");
}
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
DynamicJsonDocument doc(2048);
doc["hello"] = "world";
// Serialize JSON document
String json;
serializeJson(doc, json);
WiFiClient client;
HTTPClient http; //Declare object of class HTTPClient
http.begin(client, "http://10.104.2.114:5000/postjson"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
int httpCode = http.POST(json); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println(httpCode); //Print HTTP return code
Serial.println(payload); //Print request response payload
http.end(); //Close connection
} else {
Serial.println("Error in WiFi connection");
}
delay(10000); //Send a request every 10 seconds
}
这行不通。我的 Flask 终端没有任何反应,打印的 httpCode 是 -1,表明连接不正常。我使用 client.connect(host, port):
尝试了不同的代码
if (client.connect(127.0.0.1,5000)) {
Serial.println("Client Connected");
}
else {
Serial.println("No Connection");
}
同样失败。我一直收到“无连接”。所以我做了一些研究,我在这个漂亮的网站上发现,为了让你的烧瓶应用程序在外部可见,你必须使用命令:
flask run -h 0.0.0.0
我试过了,现在我的 Flask 应用程序在我的 IP http://10.XXX.XX.XXX:5000/ 上运行,这是有道理的。但即使这样做,我也无法使上面的任何代码正常工作。我一直没有得到任何回应,而且 http return 要么是 0 要么是 -1,这是一个很大的禁忌。
有人知道可能是什么问题吗?值得一提的是,我在不同的主机上尝试了 ESP 代码并且代码有效,所以它必须是某种我不知道的 IP 配置恶作剧。
还值得一提的是,我 运行 烧瓶在计算机上使用 phone(USB 网络共享)的便携式热点,因为我的家庭互联网无法正常工作,并且我的 ESP 已连接到同一个网络(便携式热点 wifi),不确定这会如何影响任何事情,但这是设置。
很可能是您使用的 IP 地址以及您当前的网络设置。如果您 运行 Flask 在本地,默认情况下它将使用 127.0.0.1(本地主机)并且只能从您自己的计算机访问该应用程序。网络上的其他主机不能。所以你的直觉是正确的,你需要在 0.0.0.0 上 运行 它,这样应用程序就可以在任何 接口 上访问,不仅仅是本地主机,还有 LAN IP 地址和 WAN IP 地址(前提是您有)。
现在剩下的问题是,10.104.2.114 是 Flask 应用程序 运行ning 所在 PC 的正确地址吗?假设您使用 DHCP,IP 地址可能会发生变化。根据您的说法,您的 ESP8266 在同一网络上,但我认为连接共享在来宾之间应用了某种形式的 隔离 (可能通过 VLAN)。因此,出于这个原因,该网络上的来宾可能无法看到对方,这是设计使然。 wifi 热点为每个客户端隔离流量是正常的。
将您的所有设备放在同一个 router/switch 上可能会奏效。请注意,即使无法访问互联网,您仍然可以使用家中 router/switch 连接设备。这是你可以尝试的,只要你的硬件状况良好。
当您使用 http.begin(client, url)
时,ESP8266HTTPClient 库假设您拥有端口 80 或端口 443 的标准端口。
使用非标准端口时,http.begin()
的 API 不同。尝试:
http.begin(client, "10.104.2.114", 5000, "/postjson");
这不是很好的记录,至少不是从库附带的所有示例中,但可以从 source code.
中看到函数原型
我有一个烧瓶应用程序,我需要与我的 ESP8266 进行通信,但我很遗憾地未能实现这一目标。这不应该很难,但我显然遗漏了一些东西,而且我不会感到惊讶,因为这是我第一次使用 Flask。让我试着解释一下我到目前为止所做的事情。
这是我的烧瓶代码:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/postjson', methods=['GET', 'POST'])
def postJsonHandler():
content = request.get_json()
print (content)
return 'JSON posted'
如您所见,没什么特别的。
它在默认的本地 http://127.0.0.1:5000/. Using Postman, I can send a JSON with data to http://127.0.0.1:5000/postjson 上运行并且运行起来非常棒,JSON 按我的意愿打印在终端上。
当我将 ESP 加入混音时,问题就开始了。这是我来自 ESP 的代码,同样,这里没有什么特别的,所有你在谷歌上找到的东西:
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200); //Serial connection
WiFi.begin("MyInternet", "MyPassword"); //WiFi connection
while (WiFi.status() != WL_CONNECTED) { //Wait for the WiFI connection completion
delay(500);
Serial.println("Waiting for connection");
}
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
DynamicJsonDocument doc(2048);
doc["hello"] = "world";
// Serialize JSON document
String json;
serializeJson(doc, json);
WiFiClient client;
HTTPClient http; //Declare object of class HTTPClient
http.begin(client, "http://10.104.2.114:5000/postjson"); //Specify request destination
http.addHeader("Content-Type", "application/json"); //Specify content-type header
int httpCode = http.POST(json); //Send the request
String payload = http.getString(); //Get the response payload
Serial.println(httpCode); //Print HTTP return code
Serial.println(payload); //Print request response payload
http.end(); //Close connection
} else {
Serial.println("Error in WiFi connection");
}
delay(10000); //Send a request every 10 seconds
}
这行不通。我的 Flask 终端没有任何反应,打印的 httpCode 是 -1,表明连接不正常。我使用 client.connect(host, port):
尝试了不同的代码if (client.connect(127.0.0.1,5000)) {
Serial.println("Client Connected");
}
else {
Serial.println("No Connection");
}
同样失败。我一直收到“无连接”。所以我做了一些研究,我在这个漂亮的网站上发现,为了让你的烧瓶应用程序在外部可见,你必须使用命令:
flask run -h 0.0.0.0
我试过了,现在我的 Flask 应用程序在我的 IP http://10.XXX.XX.XXX:5000/ 上运行,这是有道理的。但即使这样做,我也无法使上面的任何代码正常工作。我一直没有得到任何回应,而且 http return 要么是 0 要么是 -1,这是一个很大的禁忌。
有人知道可能是什么问题吗?值得一提的是,我在不同的主机上尝试了 ESP 代码并且代码有效,所以它必须是某种我不知道的 IP 配置恶作剧。
还值得一提的是,我 运行 烧瓶在计算机上使用 phone(USB 网络共享)的便携式热点,因为我的家庭互联网无法正常工作,并且我的 ESP 已连接到同一个网络(便携式热点 wifi),不确定这会如何影响任何事情,但这是设置。
很可能是您使用的 IP 地址以及您当前的网络设置。如果您 运行 Flask 在本地,默认情况下它将使用 127.0.0.1(本地主机)并且只能从您自己的计算机访问该应用程序。网络上的其他主机不能。所以你的直觉是正确的,你需要在 0.0.0.0 上 运行 它,这样应用程序就可以在任何 接口 上访问,不仅仅是本地主机,还有 LAN IP 地址和 WAN IP 地址(前提是您有)。
现在剩下的问题是,10.104.2.114 是 Flask 应用程序 运行ning 所在 PC 的正确地址吗?假设您使用 DHCP,IP 地址可能会发生变化。根据您的说法,您的 ESP8266 在同一网络上,但我认为连接共享在来宾之间应用了某种形式的 隔离 (可能通过 VLAN)。因此,出于这个原因,该网络上的来宾可能无法看到对方,这是设计使然。 wifi 热点为每个客户端隔离流量是正常的。
将您的所有设备放在同一个 router/switch 上可能会奏效。请注意,即使无法访问互联网,您仍然可以使用家中 router/switch 连接设备。这是你可以尝试的,只要你的硬件状况良好。
当您使用 http.begin(client, url)
时,ESP8266HTTPClient 库假设您拥有端口 80 或端口 443 的标准端口。
使用非标准端口时,http.begin()
的 API 不同。尝试:
http.begin(client, "10.104.2.114", 5000, "/postjson");
这不是很好的记录,至少不是从库附带的所有示例中,但可以从 source code.
中看到函数原型