From 26a97ec36c37b13ba8eea6e585d416ae6bc44b96 Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Thu, 23 Dec 2021 11:00:18 +0000 Subject: [PATCH] Fix #1434 - set will QoS in CONNECT message correctly, and rename qos -> will_qos in struct mg_mqtt_opts --- examples/mqtt-client-aws-iot/main.c | 2 +- examples/mqtt-client/main.c | 3 ++- examples/mqtt-over-ws-client/main.c | 2 +- mongoose.c | 2 +- mongoose.h | 2 +- src/mqtt.c | 2 +- src/mqtt.h | 2 +- test/unit_test.c | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/mqtt-client-aws-iot/main.c b/examples/mqtt-client-aws-iot/main.c index 9310d569..d10b751c 100644 --- a/examples/mqtt-client-aws-iot/main.c +++ b/examples/mqtt-client-aws-iot/main.c @@ -80,7 +80,7 @@ static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { int main(void) { struct mg_mgr mgr; - struct mg_mqtt_opts opts = {.qos = s_qos}; + struct mg_mqtt_opts opts = {.clean = true}; bool done = false; mg_mgr_init(&mgr); // Initialise event manager LOG(LL_INFO, ("Connecting to %s", s_url)); // Inform that we're starting diff --git a/examples/mqtt-client/main.c b/examples/mqtt-client/main.c index 1f9e3e45..a21468d0 100644 --- a/examples/mqtt-client/main.c +++ b/examples/mqtt-client/main.c @@ -65,7 +65,8 @@ static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { // Timer function - recreate client connection if it is closed static void timer_fn(void *arg) { struct mg_mgr *mgr = (struct mg_mgr *) arg; - struct mg_mqtt_opts opts = {.qos = s_qos, + struct mg_mqtt_opts opts = {.clean = true, + .will_qos = s_qos, .will_topic = mg_str(s_pub_topic), .will_message = mg_str("goodbye")}; if (s_conn == NULL) s_conn = mg_mqtt_connect(mgr, s_url, &opts, fn, NULL); diff --git a/examples/mqtt-over-ws-client/main.c b/examples/mqtt-over-ws-client/main.c index 032f285f..419f29e2 100644 --- a/examples/mqtt-over-ws-client/main.c +++ b/examples/mqtt-over-ws-client/main.c @@ -28,7 +28,7 @@ static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { } else if (ev == MG_EV_WS_OPEN) { // WS connection established. Perform MQTT login LOG(LL_INFO, ("Connected to WS. Logging in to MQTT...")); - struct mg_mqtt_opts opts = {.qos = 1, + struct mg_mqtt_opts opts = {.will_qos = 1, .will_topic = mg_str(s_topic), .will_message = mg_str("goodbye")}; size_t len = c->send.len; diff --git a/mongoose.c b/mongoose.c index 15c2ca6e..126e58d0 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2108,7 +2108,7 @@ void mg_mqtt_login(struct mg_connection *c, struct mg_mqtt_opts *opts) { char rnd[9], client_id[16]; struct mg_str cid = opts->client_id; uint32_t total_len = 7 + 1 + 2 + 2; - uint8_t connflag = (uint8_t) ((opts->qos & 3) << 1); + uint8_t connflag = (uint8_t) ((opts->will_qos & 3) << 3); if (cid.len == 0) { mg_random(rnd, sizeof(rnd)); diff --git a/mongoose.h b/mongoose.h index 221298d9..a25b3d7d 100644 --- a/mongoose.h +++ b/mongoose.h @@ -1053,7 +1053,7 @@ struct mg_mqtt_opts { struct mg_str client_id; // Client ID struct mg_str will_topic; // Will topic struct mg_str will_message; // Will message - uint8_t qos; // Quality of service + uint8_t will_qos; // Will message quality of service bool will_retain; // Retain last will bool clean; // Use clean session, 0 or 1 uint16_t keepalive; // Keep-alive timer in seconds diff --git a/src/mqtt.c b/src/mqtt.c index 8f99b8ed..a79c4948 100644 --- a/src/mqtt.c +++ b/src/mqtt.c @@ -35,7 +35,7 @@ void mg_mqtt_login(struct mg_connection *c, struct mg_mqtt_opts *opts) { char rnd[9], client_id[16]; struct mg_str cid = opts->client_id; uint32_t total_len = 7 + 1 + 2 + 2; - uint8_t connflag = (uint8_t) ((opts->qos & 3) << 1); + uint8_t connflag = (uint8_t) ((opts->will_qos & 3) << 3); if (cid.len == 0) { mg_random(rnd, sizeof(rnd)); diff --git a/src/mqtt.h b/src/mqtt.h index 5fb98c14..c78079ed 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -24,7 +24,7 @@ struct mg_mqtt_opts { struct mg_str client_id; // Client ID struct mg_str will_topic; // Will topic struct mg_str will_message; // Will message - uint8_t qos; // Quality of service + uint8_t will_qos; // Will message quality of service bool will_retain; // Retain last will bool clean; // Use clean session, 0 or 1 uint16_t keepalive; // Keep-alive timer in seconds diff --git a/test/unit_test.c b/test/unit_test.c index 54da75f8..7fa4564a 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -333,8 +333,8 @@ static void test_mqtt(void) { // Set params memset(buf, 0, sizeof(buf)); memset(&opts, 0, sizeof(opts)); - opts.qos = 1; opts.clean = true; + opts.will_qos = 1; opts.will_retain = true; opts.keepalive = 20; opts.client_id = mg_str("mg_client");