• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266, MQTT перезагрузка при попытке клиента подключиться

Kompromiss

New member
Всем здравствуйте. Проблема заключается в том, что плата с контроллером ESP8266 перезагружается при попытке клиента подключиться к брокеру.
Вот, собственно, сам код брокера:
Как видно, используется библиотека uMQTTBroker.h. Если можете посоветовать более подходящую библиотеку и описание к ней, буду премного благодарен.
#include "uMQTTBroker.h"
#include <ESP8266WiFi.h>

#define RAIL_L 0x04 //Левый рельс
#define RAIL_R 0x05 //Правый рельс

char wifi_ssid[] = "Train",
wifi_pass[] = "MoreThenEight";
bool switcher = true;

class myMQTTBroker: public uMQTTBroker
{
public:
// Клиент подключился
virtual bool onConnect(IPAddress addr, uint16_t client_count)
{
Serial.println(addr.toString() + " connected.");
Serial.println("Access is allowed. Start authentication.");
return true;
}
// Идентификация клиента
virtual bool onAuth(String username, String password, String client_id)
{
Serial.println("Client ID: " + client_id);
Serial.println("Username: " + username);
Serial.println("Password: " + password);
return true;
}
// Приём данных от клиента
virtual void onData(String topic, const char *data, uint32_t length)
{
char data_str[length + 1];
os_memcpy(data_str, data, length);
data_str[length] = '\0';
Serial.println("Received topic '" + topic + "' with data '" + (String)data_str + "'");
}
};

myMQTTBroker broker;
String data = "DataForSend";

void ICACHE_RAM_ATTR onTimerISR()
{
// Смена потенциалов
if (switcher)
{
GPOS = (1 << RAIL_L);
GPOC = (1 << RAIL_R);
}
else
{
GPOC = (1 << RAIL_L);
GPOS = (1 << RAIL_R);
}
switcher ^= 1;
}

void setup() {
Serial.begin(115200);

pinMode(RAIL_L, OUTPUT);
pinMode(RAIL_R, OUTPUT);

WiFi.mode(WIFI_AP);
WiFi.softAP(wifi_ssid, wifi_pass);
Serial.println("WiFi access point started");
// IP Adress: 192.168.4.1
Serial.println("IP Adress: " + WiFi.softAPIP().toString());

broker.init();
MQTT_server_start(1883, 30, 30);
Serial.println("MQTT broker started");
broker.subscribe("Topic/Broker");

// Настройка таймера
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP);
timer1_attachInterrupt(onTimerISR);
timer1_write(2800);
}

void loop() {

// virtual bool publish(String topic, String data, uint8_t qos=0, uint8_t retain=0);
broker.publish("Topic/Client", data);
delay(1000);
}

Код клиента:
#include <ESP8266WiFi.h>
#include "MQTT.h"

char clientID[] = "ClientID_1",
wifi_ssid[] = "Train",
wifi_pass[] = "MoreThenEight";

String topic_get = "Topic/Client",
topic_set = "Tpoic/Broker",
data = "Message for broker",
received = "Received";

void myDataCb(String &topic, String &data);
void myPublishedCb();
void myDisconnectedCb();
void myConnectedCb();

MQTT mqtt(clientID, "192.168.4.1", 1833);

void setup()
{
Serial.begin(115200);

WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_pass);

while (WiFi.status() != WL_CONNECTED)
{
delay(200);
yield();
Serial.print(">");
}

Serial.println("WiFi connected");
Serial.println("IP Adress: " + WiFi.localIP().toString());

Serial.println("Trying to connect with brocker");
mqtt.onConnected(myConnectedCb);
mqtt.onDisconnected(myDisconnectedCb);
mqtt.onPublished(myPublishedCb);
mqtt.onData(myDataCb);

// Попытка подключиться к брокеру
while (!mqtt.isConnected())
{
mqtt.connect();
Serial.print(".");
delay(300);
}
// mqtt.connect();
Serial.println("Connected");

Serial.println("Subscribe to " + topic_get);
mqtt.subscribe(topic_get);
}

void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(wifi_ssid, wifi_pass);
// Обработка важных событий
yield();
Serial.print("<");
}
}

void myConnectedCb()
{
Serial.println("Connected to MQTT server");
}

void myDisconnectedCb()
{
Serial.println("Disconnected. try to reconnect...");
delay(500);
mqtt.connect();
}

void myPublishedCb()
{
Serial.println("Published: " + data);
}

void myDataCb(String &topic, String &data)
{
if (topic == topic_get)
{
// Парсинг
// uint8_t message;
String message = data;
// Считываем данные в массив
// message = atoi(strtok((char *)data, " "));
Serial.println("Given data: " + message);
// bool publish(String& topic, String& data, int qos = 0, int retain = 0);
mqtt.publish(topic_set, received);
}

Serial.print(topic);
Serial.print(": ");
Serial.println(data);
}

Собственно, что происходит:
1637503048316.png
Брокер успешно запустился и работает.
Я подключался к нему через приложение IoTMQTTPanel
А вот, что происходит при попытке клиента подключиться
1637503131138.png1637503165876.png
К сожалению расшифровки кода ошибки не нашёл(
Такая проблема возникает когда я пытаюсь подключиться к брокеру в цикле (несколько раз). Здесь задержка небольшая, я её пробовал увеличивать - не помогает. Если просто сделать подключение (без цикла),
то клиент не подключается к брокеру.
 

VovanPiterskt

New member
Всем здравствуйте. Проблема заключается в том, что плата с контроллером ESP8266 перезагружается при попытке клиента подключиться к брокеру.
Вот, собственно, сам код брокера:
Как видно, используется библиотека uMQTTBroker.h. Если можете посоветовать более подходящую библиотеку и описание к ней, буду премного благодарен.
#include "uMQTTBroker.h"
#include <ESP8266WiFi.h>

#define RAIL_L 0x04 //Левый рельс
#define RAIL_R 0x05 //Правый рельс

char wifi_ssid[] = "Train",
wifi_pass[] = "MoreThenEight";
bool switcher = true;

class myMQTTBroker: public uMQTTBroker
{
public:
// Клиент подключился
virtual bool onConnect(IPAddress addr, uint16_t client_count)
{
Serial.println(addr.toString() + " connected.");
Serial.println("Access is allowed. Start authentication.");
return true;
}
// Идентификация клиента
virtual bool onAuth(String username, String password, String client_id)
{
Serial.println("Client ID: " + client_id);
Serial.println("Username: " + username);
Serial.println("Password: " + password);
return true;
}
// Приём данных от клиента
virtual void onData(String topic, const char *data, uint32_t length)
{
char data_str[length + 1];
os_memcpy(data_str, data, length);
data_str[length] = '\0';
Serial.println("Received topic '" + topic + "' with data '" + (String)data_str + "'");
}
};

myMQTTBroker broker;
String data = "DataForSend";

void ICACHE_RAM_ATTR onTimerISR()
{
// Смена потенциалов
if (switcher)
{
GPOS = (1 << RAIL_L);
GPOC = (1 << RAIL_R);
}
else
{
GPOC = (1 << RAIL_L);
GPOS = (1 << RAIL_R);
}
switcher ^= 1;
}

void setup() {
Serial.begin(115200);

pinMode(RAIL_L, OUTPUT);
pinMode(RAIL_R, OUTPUT);

WiFi.mode(WIFI_AP);
WiFi.softAP(wifi_ssid, wifi_pass);
Serial.println("WiFi access point started");
// IP Adress: 192.168.4.1
Serial.println("IP Adress: " + WiFi.softAPIP().toString());

broker.init();
MQTT_server_start(1883, 30, 30);
Serial.println("MQTT broker started");
broker.subscribe("Topic/Broker");

// Настройка таймера
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP);
timer1_attachInterrupt(onTimerISR);
timer1_write(2800);
}

void loop() {

// virtual bool publish(String topic, String data, uint8_t qos=0, uint8_t retain=0);
broker.publish("Topic/Client", data);
delay(1000);
}

Код клиента:
#include <ESP8266WiFi.h>
#include "MQTT.h"

char clientID[] = "ClientID_1",
wifi_ssid[] = "Train",
wifi_pass[] = "MoreThenEight";

String topic_get = "Topic/Client",
topic_set = "Tpoic/Broker",
data = "Message for broker",
received = "Received";

void myDataCb(String &topic, String &data);
void myPublishedCb();
void myDisconnectedCb();
void myConnectedCb();

MQTT mqtt(clientID, "192.168.4.1", 1833);

void setup()
{
Serial.begin(115200);

WiFi.mode(WIFI_STA);
WiFi.begin(wifi_ssid, wifi_pass);

while (WiFi.status() != WL_CONNECTED)
{
delay(200);
yield();
Serial.print(">");
}

Serial.println("WiFi connected");
Serial.println("IP Adress: " + WiFi.localIP().toString());

Serial.println("Trying to connect with brocker");
mqtt.onConnected(myConnectedCb);
mqtt.onDisconnected(myDisconnectedCb);
mqtt.onPublished(myPublishedCb);
mqtt.onData(myDataCb);

// Попытка подключиться к брокеру
while (!mqtt.isConnected())
{
mqtt.connect();
Serial.print(".");
delay(300);
}
// mqtt.connect();
Serial.println("Connected");

Serial.println("Subscribe to " + topic_get);
mqtt.subscribe(topic_get);
}

void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(wifi_ssid, wifi_pass);
// Обработка важных событий
yield();
Serial.print("<");
}
}

void myConnectedCb()
{
Serial.println("Connected to MQTT server");
}

void myDisconnectedCb()
{
Serial.println("Disconnected. try to reconnect...");
delay(500);
mqtt.connect();
}

void myPublishedCb()
{
Serial.println("Published: " + data);
}

void myDataCb(String &topic, String &data)
{
if (topic == topic_get)
{
// Парсинг
// uint8_t message;
String message = data;
// Считываем данные в массив
// message = atoi(strtok((char *)data, " "));
Serial.println("Given data: " + message);
// bool publish(String& topic, String& data, int qos = 0, int retain = 0);
mqtt.publish(topic_set, received);
}

Serial.print(topic);
Serial.print(": ");
Serial.println(data);
}

Собственно, что происходит:
Посмотреть вложение 11492
Брокер успешно запустился и работает.
Я подключался к нему через приложение IoTMQTTPanel
А вот, что происходит при попытке клиента подключиться
Посмотреть вложение 11493Посмотреть вложение 11494
К сожалению расшифровки кода ошибки не нашёл(
Такая проблема возникает когда я пытаюсь подключиться к брокеру в цикле (несколько раз). Здесь задержка небольшая, я её пробовал увеличивать - не помогает. Если просто сделать подключение (без цикла),
то клиент не подключается к брокеру.

победил?
 

vrd

Member
ПабСабКлиент от Имроя. Там их два, "клиента". Один умеет в длинные сообщения, другой нет.
 
Сверху Снизу