From bd2e7cc5f61a04b832e59789e9d72587e0e46e53 Mon Sep 17 00:00:00 2001 From: hsaturn Date: Mon, 22 Mar 2021 01:59:17 +0100 Subject: [PATCH] Fix crash on MqttClient timeout when not linked to a broker --- src/TinyMqtt.cpp | 10 ++++++---- src/TinyMqtt.h | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/TinyMqtt.cpp b/src/TinyMqtt.cpp index 089190f..0fb2028 100644 --- a/src/TinyMqtt.cpp +++ b/src/TinyMqtt.cpp @@ -28,10 +28,11 @@ MqttBroker::~MqttBroker() } } +// private constructor used by broker only MqttClient::MqttClient(MqttBroker* parent, WiFiClient& new_client) : parent(parent) { - client = new_client ? new WiFiClient(new_client) : nullptr; + client = new WiFiClient(new_client); alive = millis()+5000; // client expires after 5s if no CONNECT msg } @@ -80,7 +81,7 @@ void MqttClient::connect(std::string broker, uint16_t port) message.add(0x4); // Mqtt protocol version 3.1.1 message.add(0x0); // Connect flags TODO user / name - keep_alive = 1; + keep_alive = 1; // TODO not configurable message.add(0x00); // keep_alive message.add((char)keep_alive); message.add(clientId); @@ -127,7 +128,7 @@ void MqttBroker::loop() for(int i=0; iconnected()) + if (client->connected()) { client->loop(); } @@ -209,8 +210,9 @@ void MqttClient::loop() { debug("timeout client"); close(); + debug("closed"); } - else + else if (client && client->connected()) { uint16_t pingreq = MqttMessage::Type::PingReq; client->write((uint8_t*)(&pingreq), 2); diff --git a/src/TinyMqtt.h b/src/TinyMqtt.h index 9d941a7..8d0fa54 100644 --- a/src/TinyMqtt.h +++ b/src/TinyMqtt.h @@ -114,7 +114,9 @@ class MqttClient void connect(MqttBroker* parent); void connect(std::string broker, uint16_t port); - bool connected() { return client==nullptr || client->connected(); } + bool connected() { return + (parent!=nullptr and client==nullptr) or + (client and client->connected()); } void write(const char* buf, size_t length) { if (client) client->write(buf, length); }