From 1fd50dd2cbbe9a7847d8e99d2d802c17122a0be9 Mon Sep 17 00:00:00 2001 From: Euripedes Rocha Date: Thu, 14 Oct 2021 11:00:45 -0300 Subject: [PATCH 1/3] Adds a config flag to allow an empty client id This commit covers a use case where the user can select to send an empty user id. --- include/mqtt_client.h | 6 +++++- lib/mqtt_msg.c | 11 ++++++----- mqtt_client.c | 17 +++++++++++------ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/mqtt_client.h b/include/mqtt_client.h index 64cfb77..07feed3 100644 --- a/include/mqtt_client.h +++ b/include/mqtt_client.h @@ -176,7 +176,11 @@ typedef struct { const char *host; /*!< MQTT server domain (ipv4 as string) */ const char *uri; /*!< Complete MQTT broker URI */ uint32_t port; /*!< MQTT server port */ - const char *client_id; /*!< default client id is ``ESP32_%CHIPID%`` where %CHIPID% are last 3 bytes of MAC address in hex format */ + bool set_null_client_id; /*!< Selects a NULL client id */ + const char *client_id; /*!< Set client id. + Ignored if set_null_client_id == true + If NULL set the default client id. + Default client id is ``ESP32_%CHIPID%`` where %CHIPID% are last 3 bytes of MAC address in hex format */ const char *username; /*!< MQTT username */ const char *password; /*!< MQTT password */ const char *lwt_topic; /*!< LWT (Last Will and Testament) message topic (NULL by default) */ diff --git a/lib/mqtt_msg.c b/lib/mqtt_msg.c index e7fb1ab..3a8554c 100644 --- a/lib/mqtt_msg.c +++ b/lib/mqtt_msg.c @@ -361,7 +361,7 @@ mqtt_message_t *mqtt_msg_connect(mqtt_connection_t *connection, mqtt_connect_inf if (connection->message.length + header_len > connection->buffer_length) { return fail_message(connection); } - char* variable_header = (void *)(connection->buffer + connection->message.length); + char *variable_header = (char *)(connection->buffer + connection->message.length); connection->message.length += header_len; int header_idx = 0; @@ -394,7 +394,9 @@ mqtt_message_t *mqtt_msg_connect(mqtt_connection_t *connection, mqtt_connect_inf return fail_message(connection); } } else { - return fail_message(connection); + if (append_string(connection, "", 0) < 0) { + return fail_message(connection); + } } if (info->will_topic != NULL && info->will_topic[0] != '\0') { @@ -456,7 +458,7 @@ mqtt_message_t *mqtt_msg_publish(mqtt_connection_t *connection, const char *topi } if (data == NULL && data_length > 0) { - return fail_message(connection); + return fail_message(connection); } if (qos > 0) { @@ -474,8 +476,7 @@ mqtt_message_t *mqtt_msg_publish(mqtt_connection_t *connection, const char *topi connection->message.length = connection->buffer_length; connection->message.fragmented_msg_total_length = data_length + connection->message.fragmented_msg_data_offset; } else { - if (data != NULL) - { + if (data != NULL) { memcpy(connection->buffer + connection->message.length, data, data_length); connection->message.length += data_length; } diff --git a/mqtt_client.c b/mqtt_client.c index 6f8a4ef..3d44241 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -395,13 +395,15 @@ esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_cl ESP_MEM_CHECK(TAG, set_if_config(config->username, &client->connect_info.username), goto _mqtt_set_config_failed); ESP_MEM_CHECK(TAG, set_if_config(config->password, &client->connect_info.password), goto _mqtt_set_config_failed); - if (config->client_id) { - ESP_MEM_CHECK(TAG, set_if_config(config->client_id, &client->connect_info.client_id), goto _mqtt_set_config_failed); - } else if (client->connect_info.client_id == NULL) { - client->connect_info.client_id = platform_create_id_string(); + if (!config->set_null_client_id) { + if (config->client_id) { + ESP_MEM_CHECK(TAG, set_if_config(config->client_id, &client->connect_info.client_id), goto _mqtt_set_config_failed); + } else if (client->connect_info.client_id == NULL) { + client->connect_info.client_id = platform_create_id_string(); + } + ESP_MEM_CHECK(TAG, client->connect_info.client_id, goto _mqtt_set_config_failed); + ESP_LOGD(TAG, "MQTT client_id=%s", client->connect_info.client_id); } - ESP_MEM_CHECK(TAG, client->connect_info.client_id, goto _mqtt_set_config_failed); - ESP_LOGD(TAG, "MQTT client_id=%s", client->connect_info.client_id); ESP_MEM_CHECK(TAG, set_if_config(config->uri, &client->config->uri), goto _mqtt_set_config_failed); ESP_MEM_CHECK(TAG, set_if_config(config->lwt_topic, &client->connect_info.will_topic), goto _mqtt_set_config_failed); @@ -427,6 +429,9 @@ esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_cl if (config->disable_clean_session == client->connect_info.clean_session) { client->connect_info.clean_session = !config->disable_clean_session; + if (!client->connect_info.clean_session && config->set_null_client_id) { + ESP_LOGE(TAG, "Clean Session flag must be true if client has a null id"); + } } if (config->keepalive) { client->connect_info.keepalive = config->keepalive; From 09287a11565fdd26f5c0deb2960566dff676509b Mon Sep 17 00:00:00 2001 From: Euripedes Rocha Date: Wed, 27 Oct 2021 14:40:49 -0300 Subject: [PATCH 2/3] Removes redundant field on mqtt state Client connection_info was unnecessarilly repeated. Removed from mqtt_state and kept on mqtt_client. --- mqtt_client.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mqtt_client.c b/mqtt_client.c index 3d44241..66ea6ce 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -43,7 +43,6 @@ ESP_EVENT_DEFINE_BASE(MQTT_EVENTS); #endif typedef struct mqtt_state { - mqtt_connect_info_t *connect_info; uint8_t *in_buffer; uint8_t *out_buffer; int in_buffer_length; @@ -372,7 +371,7 @@ esp_err_t esp_mqtt_set_config(esp_mqtt_client_handle_t client, const esp_mqtt_cl client->config->message_retransmit_timeout = config->message_retransmit_timeout; if (config->message_retransmit_timeout <= 0) { - client->config->message_retransmit_timeout = 1000; + client->config->message_retransmit_timeout = 1000; } client->config->task_prio = config->task_prio; @@ -628,7 +627,7 @@ static esp_err_t esp_mqtt_connect(esp_mqtt_client_handle_t client, int timeout_m int read_len, connect_rsp_code; client->wait_for_ping_resp = false; client->mqtt_state.outbound_message = mqtt_msg_connect(&client->mqtt_state.mqtt_connection, - client->mqtt_state.connect_info); + &client->connect_info); if (client->mqtt_state.outbound_message->length == 0) { ESP_LOGE(TAG, "Connect message cannot be created"); return ESP_FAIL; @@ -796,7 +795,6 @@ esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *co ESP_MEM_CHECK(TAG, client->mqtt_state.out_buffer, goto _mqtt_init_failed); client->mqtt_state.out_buffer_length = out_buffer_size; - client->mqtt_state.connect_info = &client->connect_info; client->outbox = outbox_init(); ESP_MEM_CHECK(TAG, client->outbox, goto _mqtt_init_failed); client->status_bits = xEventGroupCreate(); From 08c4d62bf4aff11402726e5665efa1647e67e80e Mon Sep 17 00:00:00 2001 From: David Cermak Date: Wed, 3 Nov 2021 09:30:08 +0100 Subject: [PATCH 3/3] CI: Fix standard gitlab key --- .gitlab-ci.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 51a6f9d..bc5f6e3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,13 @@ before_script: # Use CI Tools - curl -sSL ${CIT_LOADER_URL} | sh - source citools/import_functions + # Add gitlab ssh key + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + - echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64 + - base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa + - chmod 600 ~/.ssh/id_rsa + - echo -e "Host gitlab.espressif.cn\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config - PATH=$CI_PROJECT_DIR/esp-idf/tools:$PATH - export IDF_PATH=$CI_PROJECT_DIR/esp-idf - export MQTT_PATH=$CI_PROJECT_DIR @@ -28,7 +35,6 @@ build_with_idf_v3: - build dependencies: [] script: - - cit_add_ssh_key "${GITLAB_KEY}" - git clone "${IDF_REPO}" # build with IDFv3.2 - $MQTT_PATH/ci/set_idf.sh release/v3.2 @@ -53,7 +59,6 @@ build_with_idf_v4: variables: PYTHON_VER: 3.6.13 script: - - cit_add_ssh_key "${GITLAB_KEY}" - git clone "${IDF_REPO}" - source /opt/pyenv/activate && pyenv global $PYTHON_VER - $MQTT_PATH/ci/set_idf.sh master @@ -105,7 +110,6 @@ build_and_test_qemu: variables: PYTHON_VER: 3.6.13 script: - - cit_add_ssh_key "${GITLAB_KEY}" - git clone "${IDF_REPO}" - source /opt/pyenv/activate && pyenv global $PYTHON_VER # switch to IDF and setup the tools