From e71a4d5e87ac046dfa9fe65dff01157bd690ae2f Mon Sep 17 00:00:00 2001 From: hsaturn Date: Mon, 22 Mar 2021 01:19:26 +0100 Subject: [PATCH] MqttClient was unable to publish in some cases --- src/TinyMqtt.cpp | 29 ++++++++++++++++++----------- src/TinyMqtt.h | 15 ++++++++++----- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/TinyMqtt.cpp b/src/TinyMqtt.cpp index c20b794..089190f 100644 --- a/src/TinyMqtt.cpp +++ b/src/TinyMqtt.cpp @@ -141,8 +141,10 @@ void MqttBroker::loop() } } -void MqttBroker::publish(const MqttClient* source, const Topic& topic, MqttMessage& msg) +MqttError MqttBroker::publish(const MqttClient* source, const Topic& topic, MqttMessage& msg) { + MqttError retval = MqttOk; + debug("publish "); int i=0; for(auto client: clients) @@ -158,7 +160,7 @@ void MqttBroker::publish(const MqttClient* source, const Topic& topic, MqttMessa if (source == broker) // broker -> clients doit = true; else // clients -> broker - broker->publish(topic, msg); + retval=broker->publish(topic, msg); } else // Disconnected: R7 { @@ -170,6 +172,7 @@ void MqttBroker::publish(const MqttClient* source, const Topic& topic, MqttMessa if (doit) client->publish(topic, msg); debug(""); } + return retval; } bool MqttBroker::compareString( @@ -390,22 +393,25 @@ bool Topic::matches(const Topic& topic) const } // publish from local client -void MqttClient::publish(const Topic& topic, const char* payload, size_t pay_length) +MqttError MqttClient::publish(const Topic& topic, const char* payload, size_t pay_length) { - message.create(MqttMessage::Publish); - message.add(topic); - message.add(payload, pay_length); + MqttMessage msg; + msg.create(MqttMessage::Publish); + msg.add(topic); + msg.add(payload, pay_length); if (parent) - parent->publish(this, topic, message); + return parent->publish(this, topic, msg); else if (client) - publish(topic, message); + msg.sendTo(this); else - Serial << " Should not happen" << endl; + return MqttNowhereToSend; } // republish a received publish if it matches any in subscriptions -void MqttClient::publish(const Topic& topic, MqttMessage& msg) +MqttError MqttClient::publish(const Topic& topic, MqttMessage& msg) { + MqttError retval=MqttOk; + debug("mqttclient publish " << subscriptions.size()); for(const auto& subscription: subscriptions) { @@ -419,11 +425,12 @@ void MqttClient::publish(const Topic& topic, MqttMessage& msg) } else if (callback) { - callback(this, topic, nullptr, 0); // TODO + callback(this, topic, nullptr, 0); // TODO Payload } } Serial << endl; } + return retval; } void MqttMessage::reset() diff --git a/src/TinyMqtt.h b/src/TinyMqtt.h index 33195e7..9d941a7 100644 --- a/src/TinyMqtt.h +++ b/src/TinyMqtt.h @@ -4,6 +4,11 @@ #include #include "StringIndexer.h" +enum MqttError +{ + MqttOk = 0, + MqttNowhereToSend=1, +}; class Topic : public IndexedString { @@ -121,9 +126,9 @@ class MqttClient void setCallback(CallBack fun) {callback=fun; }; // Publish from client to the world - void publish(const Topic&, const char* payload, size_t pay_length); - void publish(const Topic& t, const std::string& s) { publish(t,s.c_str(),s.length());} - void publish(const Topic& t) { publish(t, nullptr, 0);}; + MqttError publish(const Topic&, const char* payload, size_t pay_length); + MqttError publish(const Topic& t, const std::string& s) { return publish(t,s.c_str(),s.length());} + MqttError publish(const Topic& t) { return publish(t, nullptr, 0);}; void subscribe(Topic topic) { subscriptions.insert(topic); } void unsubscribe(Topic& topic); @@ -151,7 +156,7 @@ class MqttClient friend class MqttBroker; MqttClient(MqttBroker* parent, WiFiClient& client); // republish a received publish if topic matches any in subscriptions - void publish(const Topic& topic, MqttMessage& msg); + MqttError publish(const Topic& topic, MqttMessage& msg); void clientAlive(uint32_t more_seconds); void processMessage(); @@ -214,7 +219,7 @@ class MqttBroker { return compareString(auth_password, password, len); } - void publish(const MqttClient* source, const Topic& topic, MqttMessage& msg); + MqttError publish(const MqttClient* source, const Topic& topic, MqttMessage& msg); // For clients that are added not by the broker itself void addClient(MqttClient* client);