From 85b37ee92b701b6971f69f68baf98963612a24b0 Mon Sep 17 00:00:00 2001 From: Tijn Kooijmans Date: Fri, 21 Jul 2017 21:23:41 +0200 Subject: [PATCH 1/4] fixed compiler errors for SSL mode --- include/mqtt.h | 3 +++ mqtt.c | 5 +---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mqtt.h b/include/mqtt.h index a54e147..53bff02 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -6,6 +6,9 @@ #include "mqtt_msg.h" #include "ringbuf.h" +#if defined(CONFIG_MQTT_SECURITY_ON) +#include "openssl/ssl.h" +#endif typedef struct mqtt_client mqtt_client; typedef struct mqtt_event_data_t mqtt_event_data_t; diff --git a/mqtt.c b/mqtt.c index de3180d..80c12ee 100644 --- a/mqtt.c +++ b/mqtt.c @@ -13,9 +13,6 @@ #include "lwip/sockets.h" #include "lwip/dns.h" #include "lwip/netdb.h" -#if defined(CONFIG_MQTT_SECURITY_ON) -#include "openssl/ssl.h" -#endif #include "ringbuf.h" #include "mqtt.h" @@ -222,7 +219,7 @@ int mqtt_write(mqtt_client *client, const void *buffer, int len, int timeout_ms) } #if defined(CONFIG_MQTT_SECURITY_ON) - result = SSL_write(client->ssl, buffer, len) + result = SSL_write(client->ssl, buffer, len); #else result = write(client->socket, buffer, len); #endif From be91ed4a2c2fe0b277aed2705ec2a7ef6ef29528 Mon Sep 17 00:00:00 2001 From: Tijn Kooijmans Date: Fri, 21 Jul 2017 21:31:04 +0200 Subject: [PATCH 2/4] added mqtt unsubscribe function --- include/mqtt.h | 1 + mqtt.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/mqtt.h b/include/mqtt.h index 53bff02..44d2428 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -113,6 +113,7 @@ mqtt_client *mqtt_start(mqtt_settings *mqtt_info); void mqtt_stop(); void mqtt_task(void *pvParameters); void mqtt_subscribe(mqtt_client *client, const char *topic, uint8_t qos); +void mqtt_unsubscribe(mqtt_client *client, const char *topic); void mqtt_publish(mqtt_client* client, const char *topic, const char *data, int len, int qos, int retain); void mqtt_destroy(); #endif diff --git a/mqtt.c b/mqtt.c index 80c12ee..75bc4b5 100644 --- a/mqtt.c +++ b/mqtt.c @@ -595,6 +595,16 @@ void mqtt_subscribe(mqtt_client *client, const char *topic, uint8_t qos) mqtt_queue(client); } + +void mqtt_unsubscribe(mqtt_client *client, const char *topic) +{ + client->mqtt_state.outbound_message = mqtt_msg_unsubscribe(&client->mqtt_state.mqtt_connection, + topic, + &client->mqtt_state.pending_msg_id); + mqtt_info("Queue unsubscribe, topic\"%s\", id: %d", topic, client->mqtt_state.pending_msg_id); + mqtt_queue(client); +} + void mqtt_publish(mqtt_client* client, const char *topic, const char *data, int len, int qos, int retain) { From fa087cb2fe0aa9e15dd6037a8c32f5e95c5e1aa1 Mon Sep 17 00:00:00 2001 From: Tijn Kooijmans Date: Fri, 21 Jul 2017 21:39:24 +0200 Subject: [PATCH 3/4] implemented support for non-string type last will messages --- include/mqtt.h | 1 + include/mqtt_msg.h | 1 + mqtt.c | 6 +++++- mqtt_msg.c | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/mqtt.h b/include/mqtt.h index 44d2428..d4bc2da 100644 --- a/include/mqtt.h +++ b/include/mqtt.h @@ -58,6 +58,7 @@ typedef struct mqtt_settings { char password[CONFIG_MQTT_MAX_PASSWORD_LEN]; char lwt_topic[CONFIG_MQTT_MAX_LWT_TOPIC]; char lwt_msg[CONFIG_MQTT_MAX_LWT_MSG]; + uint32_t lwt_msg_len; uint32_t lwt_qos; uint32_t lwt_retain; uint32_t clean_session; diff --git a/include/mqtt_msg.h b/include/mqtt_msg.h index 44da0cc..758aa51 100644 --- a/include/mqtt_msg.h +++ b/include/mqtt_msg.h @@ -93,6 +93,7 @@ typedef struct mqtt_connect_info char* will_topic; char* will_message; int keepalive; + int will_length; int will_qos; int will_retain; int clean_session; diff --git a/mqtt.c b/mqtt.c index 75bc4b5..ab85ce2 100644 --- a/mqtt.c +++ b/mqtt.c @@ -529,6 +529,10 @@ mqtt_client *mqtt_start(mqtt_settings *settings) } memset(client, 0, sizeof(mqtt_client)); + if (settings->lwt_msg_len > CONFIG_MQTT_MAX_LWT_MSG) { + mqtt_error("Last will message longer than CONFIG_MQTT_MAX_LWT_MSG!"); + } + client->settings = settings; client->connect_info.client_id = settings->client_id; client->connect_info.username = settings->username; @@ -537,7 +541,7 @@ mqtt_client *mqtt_start(mqtt_settings *settings) client->connect_info.will_message = settings->lwt_msg; client->connect_info.will_qos = settings->lwt_qos; client->connect_info.will_retain = settings->lwt_retain; - + client->connect_info.will_length = settings->lwt_msg_len; client->keepalive_tick = settings->keepalive / 2; diff --git a/mqtt_msg.c b/mqtt_msg.c index b88ca4e..5be6fa3 100644 --- a/mqtt_msg.c +++ b/mqtt_msg.c @@ -328,7 +328,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf if (append_string(connection, info->will_topic, strlen(info->will_topic)) < 0) return fail_message(connection); - if (append_string(connection, info->will_message, strlen(info->will_message)) < 0) + if (append_string(connection, info->will_message, info->will_length) < 0) return fail_message(connection); variable_header->flags |= MQTT_CONNECT_FLAG_WILL; From f4fd2864eeca8669a6efb0360abb9dc5063d3d8d Mon Sep 17 00:00:00 2001 From: Tijn Kooijmans Date: Sat, 22 Jul 2017 14:43:50 +0200 Subject: [PATCH 4/4] added more logging on connection failures --- mqtt.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mqtt.c b/mqtt.c index ab85ce2..9523a88 100644 --- a/mqtt.c +++ b/mqtt.c @@ -281,13 +281,19 @@ static bool mqtt_connect(mqtt_client *client) mqtt_info("Connected"); return true; case CONNECTION_REFUSE_PROTOCOL: + mqtt_warn("Connection refused, bad protocol"); + return false; case CONNECTION_REFUSE_SERVER_UNAVAILABLE: + mqtt_warn("Connection refused, server unavailable"); + return false; case CONNECTION_REFUSE_BAD_USERNAME: + mqtt_warn("Connection refused, bad username"); + return false; case CONNECTION_REFUSE_NOT_AUTHORIZED: - mqtt_warn("Connection refuse, reason code: %d", connect_rsp_code); + mqtt_warn("Connection refused, not authorized"); return false; default: - mqtt_warn("Connection refuse, Unknow reason"); + mqtt_warn("Connection refused, Unknow reason"); return false; } return false;