Fix crash on MqttClient timeout when not linked to a broker

This commit is contained in:
hsaturn
2021-03-22 01:59:17 +01:00
parent 18b5f0c27b
commit bd2e7cc5f6
2 changed files with 9 additions and 5 deletions

View File

@@ -28,10 +28,11 @@ MqttBroker::~MqttBroker()
} }
} }
// private constructor used by broker only
MqttClient::MqttClient(MqttBroker* parent, WiFiClient& new_client) MqttClient::MqttClient(MqttBroker* parent, WiFiClient& new_client)
: parent(parent) : 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 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(0x4); // Mqtt protocol version 3.1.1
message.add(0x0); // Connect flags TODO user / name message.add(0x0); // Connect flags TODO user / name
keep_alive = 1; keep_alive = 1; // TODO not configurable
message.add(0x00); // keep_alive message.add(0x00); // keep_alive
message.add((char)keep_alive); message.add((char)keep_alive);
message.add(clientId); message.add(clientId);
@@ -209,8 +210,9 @@ void MqttClient::loop()
{ {
debug("timeout client"); debug("timeout client");
close(); close();
debug("closed");
} }
else else if (client && client->connected())
{ {
uint16_t pingreq = MqttMessage::Type::PingReq; uint16_t pingreq = MqttMessage::Type::PingReq;
client->write((uint8_t*)(&pingreq), 2); client->write((uint8_t*)(&pingreq), 2);

View File

@@ -114,7 +114,9 @@ class MqttClient
void connect(MqttBroker* parent); void connect(MqttBroker* parent);
void connect(std::string broker, uint16_t port); 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) void write(const char* buf, size_t length)
{ if (client) client->write(buf, length); } { if (client) client->write(buf, length); }