diff --git a/Adafruit_MQTT.cpp b/Adafruit_MQTT.cpp index 752e252..e8336db 100644 --- a/Adafruit_MQTT.cpp +++ b/Adafruit_MQTT.cpp @@ -366,14 +366,24 @@ 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); + return publish(topic, (uint8_t*)(data), strlen(data), false, qos); } bool Adafruit_MQTT::publish(const char *topic, uint8_t *data, uint16_t bLen, uint8_t qos) { + return publish(topic, data, bLen, false, qos); +} + +bool Adafruit_MQTT::publish(const char *topic, const char *data, + bool retain, uint8_t qos) { + return publish(topic, (uint8_t*)(data), strlen(data), retain, qos); +} + +bool Adafruit_MQTT::publish(const char *topic, uint8_t *data, uint16_t bLen, + bool retain, uint8_t qos) { // Construct and send publish packet. - uint16_t len = - publishPacket(buffer, topic, data, bLen, qos, (uint16_t)sizeof(buffer)); + uint16_t len = publishPacket(buffer, topic, data, bLen, retain, qos, (uint16_t)sizeof(buffer)); + if (!sendPacket(buffer, len)) return false; @@ -753,6 +763,12 @@ uint8_t Adafruit_MQTT::connectPacket(uint8_t *packet) { uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, uint8_t *data, uint16_t bLen, uint8_t qos, uint16_t maxPacketLen) { + return publishPacket(packet, topic, data, bLen, false, qos, maxPacketLen); +} + +uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic, + uint8_t *data, uint16_t bLen, bool retain, + uint8_t qos, uint16_t maxPacketLen) { uint8_t *p = packet; uint16_t len = 0; @@ -907,33 +923,54 @@ Adafruit_MQTT_Publish::Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, topic = feed; qos = q; } + bool Adafruit_MQTT_Publish::publish(int32_t i) { + return publish(i, false); +} + +bool Adafruit_MQTT_Publish::publish(int32_t i, bool retain) { char payload[12]; ltoa(i, payload, 10); - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, retain, qos); } bool Adafruit_MQTT_Publish::publish(uint32_t i) { + return publish(i, false); +} + +bool Adafruit_MQTT_Publish::publish(uint32_t i, bool retain) { char payload[11]; ultoa(i, payload, 10); - return mqtt->publish(topic, payload, qos); + return mqtt->publish(topic, payload, retain, qos); } bool Adafruit_MQTT_Publish::publish(double f, uint8_t precision) { - char payload[41]; // Need to technically hold float max, 39 digits and minus - // sign. + return publish(f, false, precision); +} + +bool Adafruit_MQTT_Publish::publish(double f, bool retain, 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, retain, qos); } bool Adafruit_MQTT_Publish::publish(const char *payload) { - return mqtt->publish(topic, payload, qos); + return publish(payload, false); +} + +bool Adafruit_MQTT_Publish::publish(const char *payload, bool retain) { + return mqtt->publish(topic, payload, retain, qos); } // publish buffer of arbitrary length bool Adafruit_MQTT_Publish::publish(uint8_t *payload, uint16_t bLen) { + return publish(payload, bLen, false); +} - return mqtt->publish(topic, payload, bLen, qos); +bool Adafruit_MQTT_Publish::publish(uint8_t *payload, uint16_t bLen, bool retain) { + + return mqtt->publish(topic, payload, bLen, retain, qos); } // Adafruit_MQTT_Subscribe Definition ////////////////////////////////////////// diff --git a/Adafruit_MQTT.h b/Adafruit_MQTT.h index 76c4eb0..7ab48d7 100644 --- a/Adafruit_MQTT.h +++ b/Adafruit_MQTT.h @@ -192,6 +192,8 @@ public: 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, bool retain, uint8_t qos = 0); + bool publish(const char *topic, uint8_t *payload, uint16_t bLen, bool retain, uint8_t qos = 0); // Add a subscription to receive messages for a topic. Returns true if the // subscription could be added or was already present, false otherwise. @@ -268,8 +270,10 @@ private: 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 maxPacketLen = 0, - bool retain = false); + uint16_t bLen, uint8_t qos, uint16_t maxPacketLen = 0); + uint16_t publishPacket(uint8_t *packet, const char *topic, uint8_t *payload, + uint16_t bLen, bool retain, uint8_t qos, uint16_t maxPacketLen = 0); + 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); @@ -282,14 +286,19 @@ public: uint8_t qos = 0); bool publish(const char *s); + bool publish(const char *s, bool retain); bool publish( double f, uint8_t precision = 2); // Precision controls the minimum number of digits after decimal. // This might be ignored and a higher precision value sent. + bool publish(double f, bool retain, uint8_t precision = 2); bool publish(int32_t i); + bool publish(int32_t i, bool retain); bool publish(uint32_t i); + bool publish(uint32_t i, bool retain); bool publish(uint8_t *b, uint16_t bLen); + bool publish(uint8_t *b, uint16_t bLen, bool retain); private: Adafruit_MQTT *mqtt;