Общение ардуинок по lan

FreeDoom2023

✩✩✩✩✩✩✩
14 Фев 2023
3
0
Здравствуйте, уважаемые форумчане!!! Необходимо объединить некоторое количество устройств по локальной сети. В качестве сервера выбор пал на ESP32 mini. К роутеру устройства будут подключаться как по LAN проводу, так и по WiFi. Обмениваться устройства будут небольшими пакетами.

Собственно вопрос!! Какой лучше протокол использовать, что бы его можно было использовать на ESPшках и на простых ардуино по типу нано, подключенных к роутеру по LAN проводу???

UDP клиент/сервер на ардуино нано испытал, вроде норм все. А вот esp с ардуино не получилось подружить. Может быть еще какие идеи будут или на какие-то библиотеки наведете.

Почему именно lan и wifi?! Да просто по тому, что LAN провода по дому уже проложены везде и просто почему бы этим не воспользоваться!
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,277
1,303
Москва
Странно что есп не подружилось по сети с ардуино. По UDP дружит все, пробовал esp32, esp8266, arduino , PC, со стороны PC были и на питоне и на делфи программы.
Посмотрите протокол OSC, это что то типа json поверх UDP. Он есть для всего выше перечисленного
 

FreeDoom2023

✩✩✩✩✩✩✩
14 Фев 2023
3
0
В моем случае приоритет имеет проводное соединение.
Мэш-сеть это интересно! В будущем есть куда использовать! Спасибо за идею!
 

FreeDoom2023

✩✩✩✩✩✩✩
14 Фев 2023
3
0
Остановился я на tcp сервере. связал несколько устройств по сети. Использовал ардуино нано+lan, так же esp32 и esp8266. С эти проблем не возникло благодаря примеру из интернета

tcp multi server:
 // Подключаем библиотеки
 #include <WiFi.h>

 // Определяем название и пароль точки доступа
 const char* ssid = "RT-GPON-36B8";
 const char* password = "ZmkhdvneR4";

 #define MAX_CLIENT 4


 int port = 8888;  //Port number
 WiFiServer server(port);
 WiFiClient clients[MAX_CLIENT];
 //Server connect to WiFi Network

 int count=0;

 //=======================================================================
 //                    Power on setup
 //=======================================================================
 void setup() {

  Serial.begin(115200);
  pinMode(SendKey,INPUT_PULLUP);  //Btn to send data
  Serial.println();
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password); //Connect to wifi
 
  // Wait for connection 
  Serial.println("Connecting to Wifi");
  while (WiFi.status() != WL_CONNECTED) {   
    delay(500);
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);

  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();
  Serial.print("Open Telnet and connect to IP:");
  Serial.print(WiFi.localIP());
  Serial.print(" on port ");
  Serial.println(port);
 }
 //=======================================================================
 //                    Loop
 //=======================================================================

 uint8_t flag_client_connect[4] = {0};

 void loop() {

  // wait for a new client:

  WiFiClient client = server.available();

  if (client) {

    //проверьте, ссылается ли этот клиент на тот же сокет, что и один из существующих экземпляров:
    bool newClient = true;
    uint8_t i=0;
    while ((i<4) && (clients[i]!=client))
      {i++;}
    if (i<4) {newClient = false;}

    if (newClient) {

      //Поиск неиспользуемого клиента:
      uint8_t j=0;
      while ((j<4) && (clients[j]))
        {j++;}
      if (j>=4) {

        client.stop();
        }
      else {
          clients[j] = client;
          // clead out the input buffer:
          client.flush();
          flag_client_connect[j] = 1;
          Serial.print("Новый клиент [ ");
          Serial.print(j);
          Serial.print(" ] подключен. IP: ");
          Serial.println(clients[j].remoteIP());
        }
      }
  }


  // *****************************************************
  for(uint8_t i = 0; i < MAX_CLIENT; i++){
    if (clients[i] && clients[i].connected()){
      if(clients[i].available()){
         Serial.print("Клиент [ ");
         Serial.print(i);   
         Serial.print(" ]: ");

         // **************************************
         //читаем пришедший пакет
        
        
         // **************************************
      }
    }
  }
  // *****************************************************


  for (uint8_t i=0;i<4;i++) {
    if (!(clients[i].connected())) {
      // client.stop() invalidates the internal socket-descriptor, so next use of == will allways return false;
      if(flag_client_connect[i]) {
        flag_client_connect[i] = 0;
        Serial.print("Клиент [ ");
        Serial.print(i);
        Serial.println(" ] отключен");
      }
      clients[i].stop();
    }
  }
 } // loop
по верх tcp решил решил использовать MQTT протокол. Если с клиентом проблем никаких. В интернете полно готовых библиотек, есть самописная библиотека для stm-ов, атмег. То с брокером оказалось все похуже. Нашел минимум 2 библиотеки брокеров. У одной проблемы начинаются после нескольких повторных подключениях клиента, со второй долго не сидел. Хотел написать свой брокер. Но возникли проблемы практически сразу при создании класса. на си много программ написал, а вот с++ не очень давно изучаю.

Вот собственно в примере написано:

участок из примера выше:
 int port = 8888;  //Port number
 WiFiServer server(port);
 WiFiClient clients[MAX_CLIENT];
 

  WiFiClient client = server.available();
у меня не получается передать указатель на server в мой класс
мой класс:
#include "WiFi.h"
#include "Client.h"
#include "Server.h"

WiFiServer server(1883);
WiFiClient clients[5];

class myBroker {
    private:
   Client* _clients;
   Server* _server;
    
    public:
  mBroker(Server& server,Client& client,int port) {
    _server = &server;
    _clients = &client;
    //_server.begin(port);
    _server->begin(port);
  }

 ~mBroker() {

 }
    void loop(){
        // выскакивает ошибка, об отсутствии available()
        WiFiClient client = _server.available(); //
    }
};
подскжите что делаю не так при передаче указателя на server?

я уже посмотрел, что в библиотеке "Server.h" нет функции available()
Может я что то делаю неправильно или недопонимаю.
По факту задача проста на первый взгляд, создать сервер с возможностью подключения нескольких клиентов и запустить mqtt broker с самым минимальным функционалом

Еще как предположение, в зависимости от типа используемой платы, вместо Server.h, подключать необходимые библиотеки через дефины
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
По факту задача проста на первый взгляд
это только на 1й взгляд, поверьте ) написать сервер, обслуживающий одновременно несколько соединений параллельно, весьма непростая задача.
Пример можете посмотреть сами.

на си много программ написал, а вот с++ не очень давно изучаю
Плохо писали. У вас Server* _server; это указатель. А в конструкторе класса mBroker(Server& server,Client& client,int port) вы получаете объект по ссылке. Используйте что-то одно, но одинаковое.

// выскакивает ошибка, об отсутствии available()
WiFiClient client = _server.available();
ну так вы в заголовок загляните, available() там есть. Но лучше вместо него использовать accept().
Кроме того, _serer у вас указатель, значит надо использовать -> вместо точки.

А вообще надо трезво оценивать свои силы и не пытаться изобрести велосипед, а решать задачу максимально эффективным способом - купите на авито какой-нибудь говнороутер за 700 р., перешейте под OpenWrt и поставьте туда нормальный mqtt сервер. А время потратте на программирование чего-то менее велосипедного.