【问题标题】: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 的网络中与一个特定的 ESP8266 通信,其中每个模块都在运行一个服务器实例,侦听端口 80
【发布时间】:2016-12-03 12:12:14
【问题描述】:

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

我的 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。任何线索将不胜感激。

【问题讨论】:

    标签: arduino network-programming iot esp8266


    【解决方案1】:

    来自 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);
    

    所以你会得到 node1 的 http 服务描述。在不同的端口上运行第二个节点的 Web 服务器并定义它​​。

    【讨论】:

      【解决方案2】:

      解决方案是为您的 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 的端口,然后在 路由器设置中设置 端口转发,这样端口 8266 就会转发到您的第一个 ESP 的 IP 地址和端口 80,端口 8267 将转发到您的第二个 ESP 的 IP 地址和端口 80 等。

      之后,您可以使用类似http://xx.xx.xx.xx:8266http://xx.xx.xx.xx:8267http://xx.xx.xx.xx:8268http://xx.xx.xx.xx:8269、...的 URL 从 Internet 访问您的 ESP。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        相关资源
        最近更新 更多