• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
ПабСабКлиент от Имроя. Там их два, "клиента". Один умеет в длинные сообщения, другой нет.
 
Сверху Снизу