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

时间:2016-09-08 13:02:31

标签: arduino network-programming iot esp8266

我是物联网的新手,但我正在构建一个系统,我在家中使用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。任何领导都将受到高度赞赏。

2 个答案:

答案 0 :(得分: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服务器并定义它​​。

答案 1 :(得分:1)

解决方案是为您的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和端口80的IP地址,端口8267将被转发到您的第二个ESP和端口80等的IP地址。

之后,您可以使用类似http://xx.xx.xx.xx:8266http://xx.xx.xx.xx:8267http://xx.xx.xx.xx:8268http://xx.xx.xx.xx:8269,...的网址从互联网访问您的ESP。

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