ESP8266 - Один сервер, отправляющий данные нескольким клиентам
У меня есть несколько arduino с ESP, один из которых настроен для измерения температуры, и я хотел бы, чтобы он отправлял команды другим подключенным arduino для выполнения различных функций (открывать/закрывать клапаны и т.д.).
Другими словами, единственное, что мне нужно, - это чтобы один сервер, надеюсь, транслировался нескольким клиентам. Мне на самом деле не нужно различать, какой клиент какой.
Я изо всех сил пытаюсь разобраться в некоторых документах, и это для меня ново.
Для начала, я просто пытаюсь наладить какое-либо функциональное общение, прежде чем приступлю к следующим частям.
Мое серверное устройство настроено как программная точка доступа и WiFiServer.
Мой код ESP сервера выглядит примерно так.
#include <ESP8266WiFi.h>
const byte ON = 2;
const byte OFF = 1;
int message;
WiFiServer server(80);
void setup()
{
Serial.begin(9600);
WiFi.softAP("access", "point");
server.begin();
}
void loop()
{
server.write(ON);
delay(1000);
server.write(OFF);
delay(1000);
}
}
Мой клиентский код выглядит примерно так:
#include <ESP8266WiFi.h>
const byte ON = 2;
const byte OFF = 1;
byte ip[] = {192, 168, 4, 1};
WiFiClient client;
int message;
void setup() {
Serial.begin(9600);
// connect to wifi.
WiFi.mode(WIFI_STA);
WiFi.begin("access", "point");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
//Now connect to server object
if (client.connect(ip, 80) == 1) {
Serial.println("Connected");
} else {
Serial.println("Not Connected");
}
delay(10000);
}
void loop() {
if (client.connected()) {
Serial.println("Waiting for Data");
while(!client.available()){}
String message = client.read();
Serial.println(message);
}
}
Клиентский код подключается к серверу и застревает в строке "Ожидание данных", никогда не выходя из цикла while (!клиент.доступен), поэтому он явно ничего не получает.
Я уверен, что здесь я должен выглядеть супер тупым, может кто-нибудь помочь мне понять, как правильно делать то, что я хочу? То, что я видел в Интернете, - это в основном связь между клиентом и сервером, нужно ли мне что-то пинговать с сервером, чтобы получить что-то обратно?
Любая помощь будет признательна. Это для большого проекта, и я надеюсь, что у меня все получится. Большое вам всем спасибо!
@Mark Pizzutillo, 👍3
2 ответа
Ваш сервер не обрабатывает клиентов. Это всего лишь прослушивающий TCP-сокет. Вы должны обрабатывать входящие TCP-соединения, проверяя, есть ли на сервере доступный клиент.
Это из примера ChatServer. Сервер telnet для подключения с помощью терминала telnet.
void loop() {
// wait for a new client:
WiFiClient client = server.available();
// when the client sends the first byte, say hello:
if (client) {
if (client.connected()) {
if (!alreadyConnected) {
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
if (client.available() > 0) {
// read the byte incoming from the client:
char c = client.read();
// echo the byte back to the client:
client.write(c);
// echo the byte to the server as well:
Serial.write(c);
}
} else {
alreadyConnected = false;
client.disconnect();
}
}
}
В esp8266 Arduino до версии 3 write
не был реализован в WiFiServer.
В версии 3 WiFiServer нет функции write
, но класс ArduinoWiFiServer реализует функцию печати всем клиентам.
Ссылка на документацию: https://arduino-esp8266.readthedocs.io/ en/3.1.2/esp8266wifi/server-class.html
Я автор класса ArduinoWiFiServer
.
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Как подключить ESP8266 с помощью адаптера ESP-01 к Arduino Uno?
- Как установить связь между веб-камерой и Arduino UNO и получать прямую трансляцию на мобильном телефоне с помощью ESP8266?
- Могу ли я использовать выход 3,3 В Arduino напрямую к esp8266?
- Чтение данных из Google Таблиц с помощью Nodemcu
- Ошибка TIMEOUT при подключении ESP8266 к Arduino Uno
- Сервер Esp8266 недоступен. Порт не открывается
- Использование ESP8266-01 с Arduino uno R3