如何在多个 ESP8266 的网络中与一个特定的 ESP8266 通信,其中每个模块都是 运行 监听端口 80 的服务器实例

How to communicate to one particular ESP8266 in a network of multiple ESP8266, where every module is running a server instance listening on port 80

我对物联网还很陌生,但我正在构建一个系统,我在家里有多个物联网设备使用 ESP8266 模块连接到互联网。但是我在任何家里都没有特定的网关。我依靠WiFi路由器。要从互联网向设备传达任何消息,我需要识别特定设备。 我正在为家庭路由器的 IP 使用 DDNS。但是我怎样才能将来自服务器的请求发送到所有连接的设备。

我的 ESP8266 模块中有这段代码。

ESP 1:

#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;
ESP8266WebServer server(80);

void setup(){
server.on("/esp_unique_01/", [](){
    server.send(200, "text/html", webPage);
  });
  server.on("/esp_unique_01/socket1On", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio0_pin, HIGH);
    delay(1000);
  });
  server.on("/esp_unique_01/socket1Off", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio0_pin, LOW);
    delay(1000); 
  });
}

ESP 2:

#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;
ESP8266WebServer server(80);

void setup(){
server.on("/esp_unique_01/", [](){
    server.send(200, "text/html", webPage);
  });
  server.on("/esp_unique_02/socket1On", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio0_pin, HIGH);
    delay(1000);
  });
  server.on("/esp_unique_02/socket1Off", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio0_pin, LOW);
    delay(1000); 
  });
}

这两个 ESP 模块都有动态 IP。任何线索将不胜感激。

来自 MDNS 示例的混合:

  char hostString[16] = {0};
  sprintf(hostString, "ESP_%06X", ESP.getChipId());
  if (!MDNS.begin(hostString)) {
    Serial.println("Error setting up MDNS responder!");
  }
  Serial.println("mDNS responder started");

  // Start TCP (HTTP) server
  server.begin();
  Serial.println("TCP server started");

  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);

所以您将获得节点 1 的 http 服务描述。 运行 第二个节点的 Web 服务器在不同的端口上并定义它。

解决方案是为您的 ESP8266 模块分配 静态 IP 地址,并使用不同的端口从互联网访问它们。下面是为 ESP8266 分配静态地址的代码:

IPAddress ip(192,168,1,xx);               // desired static IP address
IPAddress gateway(192,168,1,yy);          // IP address of the router
IPAddress subnet(255,255,255,0);

WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);

while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}

现在您知道了 ESP8266 设备的本地 IP 地址,您可以选择要转发到 ESP 的端口。例如,您可以选择端口 8266、8267、8268、8269...或任何其他高于 1024 的端口,然后在 路由器设置 [=35] 中设置 端口转发 =] 因此端口 8266 将转发到您的第一个 ESP 的 IP 地址和端口 80,端口 8267 将转发到您的第二个 ESP 的 IP 地址和端口 80 等

之后,您可以使用 URLs 从互联网访问您的 ESP,看起来像 http://xx.xx.xx.xx:8266http://xx.xx.xx.xx:8267http://xx.xx.xx.xx:8268http://xx.xx.xx.xx:8269、...

由于您已经在使用动态 DNS 服务访问您的 ESP8266,而您的本地网络中没有其他 ESP,这意味着您只需添加 :8266:8267:8268, :8269, ... 到您已经在使用的 URL。换句话说,如果URL由你选择的内容 + 你的动态DNS服务生成的部分是http://myhome.something.com 那么您现在将使用 http://myhome.something.com:8266http://myhome.something.com:8267