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 (!клиент.доступен), поэтому он явно ничего не получает.

Я уверен, что здесь я должен выглядеть супер тупым, может кто-нибудь помочь мне понять, как правильно делать то, что я хочу? То, что я видел в Интернете, - это в основном связь между клиентом и сервером, нужно ли мне что-то пинговать с сервером, чтобы получить что-то обратно?

Любая помощь будет признательна. Это для большого проекта, и я надеюсь, что у меня все получится. Большое вам всем спасибо!

, 👍3


2 ответа


0

Ваш сервер не обрабатывает клиентов. Это всего лишь прослушивающий 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();
    }
  }
}
,

1

В esp8266 Arduino до версии 3 write не был реализован в WiFiServer.

В версии 3 WiFiServer нет функции write, но класс ArduinoWiFiServer реализует функцию печати всем клиентам.

Ссылка на документацию: https://arduino-esp8266.readthedocs.io/ en/3.1.2/esp8266wifi/server-class.html

Я автор класса ArduinoWiFiServer.

,