From f89e52c0f2d0dc6f460b207e9c1ed9c3bf6f8e6a Mon Sep 17 00:00:00 2001 From: Steve Waterworth Date: Tue, 23 Aug 2016 15:07:36 +0100 Subject: [PATCH] Added support for retain on publish --- Adafruit_MQTT.cpp | 25 +++++++++++++------------ Adafruit_MQTT.h | 9 +++++---- 2 files changed, 18 insertions(+), 16 deletions(-) mode change 100644 => 100755 Adafruit_MQTT.cpp mode change 100644 => 100755 Adafruit_MQTT.h diff --git a/Adafruit_MQTT.cpp b/Adafruit_MQTT.cpp old mode 100644 new mode 100755 index f08ec05..9076d31 --- a/Adafruit_MQTT.cpp +++ b/Adafruit_MQTT.cpp @@ -293,13 +293,13 @@ bool Adafruit_MQTT::disconnect() { } -bool Adafruit_MQTT::publish(const char *topic, const char *data, uint8_t qos) { - return publish(topic, (uint8_t*)(data), strlen(data), qos); +bool Adafruit_MQTT::publish(const char *topic, const char *data, uint8_t qos, uint8_t retain) { + return publish(topic, (uint8_t*)(data), strlen(data), qos, retain); } -bool Adafruit_MQTT::publish(const char *topic, uint8_t *data, uint16_t bLen, uint8_t qos) { +bool Adafruit_MQTT::publish(const char *topic, uint8_t *data, uint16_t bLen, uint8_t qos, uint8_t retain) { // Construct and send publish packet. - uint16_t len = publishPacket(buffer, topic, data, bLen, qos); + uint16_t len = publishPacket(buffer, topic, data, bLen, qos, retain); if (!sendPacket(buffer, len)) return false; @@ -634,7 +634,7 @@ uint8_t Adafruit_MQTT::connectPacket(uint8_t *packet) { // as per http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718040 uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, - uint8_t *data, uint16_t bLen, uint8_t qos) { + uint8_t *data, uint16_t bLen, uint8_t qos, uint8_t retain) { uint8_t *p = packet; uint16_t len=0; @@ -647,7 +647,7 @@ uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, len += bLen; // payload length // Now you can start generating the packet! - p[0] = MQTT_CTRL_PUBLISH << 4 | qos << 1; + p[0] = MQTT_CTRL_PUBLISH << 4 | qos << 1 | retain << 0; p++; // fill in packet[1] last @@ -770,37 +770,38 @@ uint8_t Adafruit_MQTT::disconnectPacket(uint8_t *packet) { // Adafruit_MQTT_Publish Definition //////////////////////////////////////////// Adafruit_MQTT_Publish::Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, - const char *feed, uint8_t q) { + const char *feed, uint8_t q, uint8_t r) { mqtt = mqttserver; topic = feed; qos = q; + retain = r; } bool Adafruit_MQTT_Publish::publish(int32_t i) { char payload[12]; ltoa(i, payload, 10); - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, qos, retain); } bool Adafruit_MQTT_Publish::publish(uint32_t i) { char payload[11]; ultoa(i, payload, 10); - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, qos, retain); } bool Adafruit_MQTT_Publish::publish(double f, uint8_t precision) { char payload[41]; // Need to technically hold float max, 39 digits and minus sign. dtostrf(f, 0, precision, payload); - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, qos, retain); } bool Adafruit_MQTT_Publish::publish(const char *payload) { - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, qos, retain); } //publish buffer of arbitrary length bool Adafruit_MQTT_Publish::publish(uint8_t *payload, uint16_t bLen) { - return mqtt->publish(topic, payload, bLen, qos); + return mqtt->publish(topic, payload, bLen, qos, retain); } diff --git a/Adafruit_MQTT.h b/Adafruit_MQTT.h old mode 100644 new mode 100755 index f4733ac..657171a --- a/Adafruit_MQTT.h +++ b/Adafruit_MQTT.h @@ -174,8 +174,8 @@ class Adafruit_MQTT { // Publish a message to a topic using the specified QoS level. Returns true // if the message was published, false otherwise. - bool publish(const char *topic, const char *payload, uint8_t qos = 0); - bool publish(const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos = 0); + bool publish(const char *topic, const char *payload, uint8_t qos = 0, uint8_t retain = 0); + bool publish(const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos = 0, uint8_t retain = 0); // Add a subscription to receive messages for a topic. Returns true if the // subscription could be added or was already present, false otherwise. @@ -240,7 +240,7 @@ class Adafruit_MQTT { // Functions to generate MQTT packets. uint8_t connectPacket(uint8_t *packet); uint8_t disconnectPacket(uint8_t *packet); - uint16_t publishPacket(uint8_t *packet, const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos); + uint16_t publishPacket(uint8_t *packet, const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos, uint8_t retain); uint8_t subscribePacket(uint8_t *packet, const char *topic, uint8_t qos); uint8_t unsubscribePacket(uint8_t *packet, const char *topic); uint8_t pingPacket(uint8_t *packet); @@ -250,7 +250,7 @@ class Adafruit_MQTT { class Adafruit_MQTT_Publish { public: - Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, const char *feed, uint8_t qos = 0); + Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, const char *feed, uint8_t qos = 0, uint8_t retain = 0); bool publish(const char *s); bool publish(double f, uint8_t precision=2); // Precision controls the minimum number of digits after decimal. @@ -264,6 +264,7 @@ class Adafruit_MQTT_Publish { Adafruit_MQTT *mqtt; const char *topic; uint8_t qos; + uint8_t retain; }; class Adafruit_MQTT_Subscribe {