Остановился я на tcp сервере. связал несколько устройств по сети. Использовал ардуино нано+lan, так же esp32 и esp8266. С эти проблем не возникло благодаря примеру из интернета
// Подключаем библиотеки
#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, подключать необходимые библиотеки через дефины