QOS2 doesn't work
Closed this issue · 1 comments
kenvernaillenvub commented
When sending with QOS2, I don't receive the messages in other clients. I use a mosquitto broker.
QOS0 and QOS1 work fine.
mqtt.publish("testTopic",(uint8_t*)"test",4, false, MQTT::QOS2, NULL);
Weirdly enough, the only difference is MQTTQOS2_HEADER_MASK...
hirotakaster commented
Hi @kenvernaillenvub
You can check QoS2 with the following source code. QoS2 need a "publishRelease" function.
#include <MQTT.h>
void callback(char* topic, byte* payload, unsigned int length);
MQTT client("www.hirotakaster.com", 1883, callback);
uint16_t qos2messageid = 0;
bool qos2message = false;
// recieve message
void callback(char* topic, byte* payload, unsigned int length) {
delay(1000);
}
// QOS ack callback.
// if application use QOS1 or QOS2, MQTT server sendback ack message id.
void qoscallback(unsigned int messageid) {
Serial.print("Ack Message Id:");
Serial.println(messageid);
if (messageid == qos2messageid) {
Serial.println("Release QoS2 Message");
client.publishRelease(qos2messageid);
qos2message = true;
}
}
void setup() {
Serial.begin(9600);
RGB.control(true);
client.connect("sparkclient");
// add qos callback. If don't add qoscallback, ACK message from MQTT server is ignored.
client.addQosCallback(qoscallback);
if (client.isConnected()) {
uint16_t messageid;
qos2message = true;
}
}
void loop() {
if (client.isConnected()) {
uint16_t messageid;
client.loop();
if (qos2message) {
// QOS=2
client.publish("outTopic/message", "hello world QOS2", MQTT::QOS2, &messageid);
Serial.println(messageid);
// save QoS2 message id as global parameter.
qos2messageid = messageid;
qos2message = false;
}
}
}