如何在多个 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:8266
、http://xx.xx.xx.xx:8267
、http://xx.xx.xx.xx:8268
、http://xx.xx.xx.xx:8269
、...
由于您已经在使用动态 DNS 服务访问您的 ESP8266,而您的本地网络中没有其他 ESP,这意味着您只需添加 :8266
、:8267
、:8268
, :8269
, ... 到您已经在使用的 URL。换句话说,如果URL由你选择的内容 + 你的动态DNS服务生成的部分是http://myhome.something.com
那么您现在将使用 http://myhome.something.com:8266
、http://myhome.something.com:8267
等
我对物联网还很陌生,但我正在构建一个系统,我在家里有多个物联网设备使用 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:8266
、http://xx.xx.xx.xx:8267
、http://xx.xx.xx.xx:8268
、http://xx.xx.xx.xx:8269
、...
由于您已经在使用动态 DNS 服务访问您的 ESP8266,而您的本地网络中没有其他 ESP,这意味着您只需添加 :8266
、:8267
、:8268
, :8269
, ... 到您已经在使用的 URL。换句话说,如果URL由你选择的内容 + 你的动态DNS服务生成的部分是http://myhome.something.com
那么您现在将使用 http://myhome.something.com:8266
、http://myhome.something.com:8267
等