无法将 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 是 Fl​​ask 应用程序 运行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.

中看到函数原型