mirror of
https://github.com/espressif/esp-mqtt.git
synced 2025-07-31 11:18:01 +02:00
Merge branch 'bugfix/send_diconnect_msg' into 'master'
Client: Disconnect/Reconnect improvements See merge request espressif/esp-mqtt!113
This commit is contained in:
@ -1,7 +1,5 @@
|
|||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
- static_analysis
|
|
||||||
- deploy_report
|
|
||||||
- deploy
|
- deploy
|
||||||
|
|
||||||
|
|
||||||
@ -36,10 +34,6 @@ build_with_idf_v3:
|
|||||||
- $MQTT_PATH/ci/set_idf.sh release/v3.2
|
- $MQTT_PATH/ci/set_idf.sh release/v3.2
|
||||||
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
||||||
- $MQTT_PATH/ci/build_examples.sh make
|
- $MQTT_PATH/ci/build_examples.sh make
|
||||||
# build with IDFv3.3
|
|
||||||
- $MQTT_PATH/ci/set_idf.sh release/v3.3
|
|
||||||
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
|
||||||
- $MQTT_PATH/ci/build_examples.sh make
|
|
||||||
# simple build with IDFv3.1 (buiding directly in mqtt repo)
|
# simple build with IDFv3.1 (buiding directly in mqtt repo)
|
||||||
- $MQTT_PATH/ci/set_idf.sh release/v3.1
|
- $MQTT_PATH/ci/set_idf.sh release/v3.1
|
||||||
- cd $MQTT_PATH && ./ci/modify_for_legacy_idf.sh ${RECENT_IDF} || true
|
- cd $MQTT_PATH && ./ci/modify_for_legacy_idf.sh ${RECENT_IDF} || true
|
||||||
@ -95,6 +89,11 @@ build_with_idf_v4:
|
|||||||
- cd $IDF_PATH && tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)"
|
- cd $IDF_PATH && tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)"
|
||||||
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
||||||
- $MQTT_PATH/ci/build_examples.sh
|
- $MQTT_PATH/ci/build_examples.sh
|
||||||
|
# build with IDFv3.3
|
||||||
|
- $MQTT_PATH/ci/set_idf.sh release/v3.3
|
||||||
|
- cd $IDF_PATH && tools/idf_tools.py --non-interactive install && eval "$(tools/idf_tools.py --non-interactive export)"
|
||||||
|
- $MQTT_PATH/ci/set_mqtt.sh $CI_COMMIT_SHA
|
||||||
|
- $MQTT_PATH/ci/build_examples.sh make
|
||||||
|
|
||||||
build_and_test_qemu:
|
build_and_test_qemu:
|
||||||
stage: build
|
stage: build
|
||||||
@ -121,57 +120,6 @@ build_and_test_qemu:
|
|||||||
- cd $IDF_PATH/tools/ci/python_packages/tiny_test_fw/bin
|
- cd $IDF_PATH/tools/ci/python_packages/tiny_test_fw/bin
|
||||||
- python Runner.py $TEST_PATH -c $TEST_PATH/publish_connect_mqtt_qemu.yml -e $TEST_PATH/env.yml
|
- python Runner.py $TEST_PATH -c $TEST_PATH/publish_connect_mqtt_qemu.yml -e $TEST_PATH/env.yml
|
||||||
|
|
||||||
clang_tidy_check:
|
|
||||||
stage: static_analysis
|
|
||||||
image: ${CI_DOCKER_REGISTRY}/clang-static-analysis
|
|
||||||
tags:
|
|
||||||
- host_test
|
|
||||||
dependencies:
|
|
||||||
- build_with_idf_v4
|
|
||||||
artifacts:
|
|
||||||
reports:
|
|
||||||
junit: esp-idf/examples/protocols/mqtt/tcp/tidybuild/output.xml
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- esp-idf/examples/protocols/mqtt/tcp/tidybuild/report/*
|
|
||||||
expire_in: 1 day
|
|
||||||
script:
|
|
||||||
- cit_add_ssh_key "${GITLAB_KEY}"
|
|
||||||
- git clone "${IDF_REPO}"
|
|
||||||
- cd esp-idf
|
|
||||||
- ./tools/ci/mirror-submodule-update.sh
|
|
||||||
- export IDF_PATH=$(pwd)
|
|
||||||
- cd $IDF_PATH/components/mqtt/esp-mqtt
|
|
||||||
- rm -rf .git
|
|
||||||
- cp -r $CI_PROJECT_DIR/.git .
|
|
||||||
- git reset --hard $CI_COMMIT_SHA
|
|
||||||
- mv $CI_PROJECT_DIR/tidybuild $IDF_PATH/examples/protocols/mqtt/tcp/tidybuild
|
|
||||||
- cd $IDF_PATH/examples/protocols/mqtt/tcp/tidybuild
|
|
||||||
- git clone $IDF_ANALYSIS_UTILS static_analysis_utils && cd static_analysis_utils
|
|
||||||
- ./generate_report.sh $CI_PROJECT_DIR/static-analysis-rules.yml $IDF_PATH/examples/protocols/mqtt/tcp/tidybuild/report $IDF_PATH/examples/protocols/mqtt/tcp/tidybuild/output.xml
|
|
||||||
|
|
||||||
deploy_report:
|
|
||||||
stage: deploy_report
|
|
||||||
image: $CI_DOCKER_REGISTRY/esp32-ci-env
|
|
||||||
tags:
|
|
||||||
- deploy
|
|
||||||
- shiny
|
|
||||||
dependencies:
|
|
||||||
- clang_tidy_check
|
|
||||||
script:
|
|
||||||
- cit_add_ssh_key "${DOCS_DEPLOY_KEY}"
|
|
||||||
- echo -e "Host $DOCS_SERVER\n\tStrictHostKeyChecking no\n\tUser $DOCS_SERVER_USER\n" >> ~/.ssh/config
|
|
||||||
- export GIT_VER=$(git describe --always)
|
|
||||||
- cd esp-idf/examples/protocols/mqtt/tcp/tidybuild
|
|
||||||
- mv report $GIT_VER
|
|
||||||
- tar czvf $GIT_VER.tar.gz $GIT_VER
|
|
||||||
- ssh $DOCS_SERVER -x "mkdir -p $DOCS_PATH/clang-tidy"
|
|
||||||
- scp $GIT_VER.tar.gz $DOCS_SERVER:$DOCS_PATH/clang-tidy
|
|
||||||
- ssh $DOCS_SERVER -x "cd $DOCS_PATH/clang-tidy && tar xzvf $GIT_VER.tar.gz && rm -f latest && ln -s $GIT_VER latest"
|
|
||||||
# add link to view the report
|
|
||||||
- echo "[static analysis][clang tidy] $CI_DOCKER_REGISTRY/static_analysis/esp-idf/clang-tidy/${GIT_VER}/index.html"
|
|
||||||
- test ! -e ${GIT_VER}/FAILED_RULES || { echo 'Failed static analysis rules!'; cat ${GIT_VER}/FAILED_RULES; exit 1; }
|
|
||||||
|
|
||||||
push_master_to_github:
|
push_master_to_github:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
image: ${CI_DOCKER_REGISTRY}/esp32-ci-env
|
image: ${CI_DOCKER_REGISTRY}/esp32-ci-env
|
||||||
|
@ -133,7 +133,7 @@ static esp_err_t esp_mqtt_client_ping(esp_mqtt_client_handle_t client);
|
|||||||
static char *create_string(const char *ptr, int len);
|
static char *create_string(const char *ptr, int len);
|
||||||
static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_timeout_ms);
|
static int mqtt_message_receive(esp_mqtt_client_handle_t client, int read_poll_timeout_ms);
|
||||||
static void esp_mqtt_client_dispatch_transport_error(esp_mqtt_client_handle_t client);
|
static void esp_mqtt_client_dispatch_transport_error(esp_mqtt_client_handle_t client);
|
||||||
|
static esp_err_t send_disconnect_msg(esp_mqtt_client_handle_t client);
|
||||||
|
|
||||||
#if MQTT_ENABLE_SSL
|
#if MQTT_ENABLE_SSL
|
||||||
enum esp_mqtt_ssl_cert_key_api {
|
enum esp_mqtt_ssl_cert_key_api {
|
||||||
@ -1451,6 +1451,7 @@ static void esp_mqtt_task(void *pv)
|
|||||||
case MQTT_STATE_CONNECTED:
|
case MQTT_STATE_CONNECTED:
|
||||||
// check for disconnection request
|
// check for disconnection request
|
||||||
if (xEventGroupWaitBits(client->status_bits, DISCONNECT_BIT, true, true, 0) & DISCONNECT_BIT) {
|
if (xEventGroupWaitBits(client->status_bits, DISCONNECT_BIT, true, true, 0) & DISCONNECT_BIT) {
|
||||||
|
send_disconnect_msg(client); // ignore error, if clean disconnect fails, just abort the connection
|
||||||
esp_mqtt_abort_connection(client);
|
esp_mqtt_abort_connection(client);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1507,13 +1508,14 @@ static void esp_mqtt_task(void *pv)
|
|||||||
break;
|
break;
|
||||||
case MQTT_STATE_WAIT_RECONNECT:
|
case MQTT_STATE_WAIT_RECONNECT:
|
||||||
|
|
||||||
if (!client->config->auto_reconnect) {
|
if (!client->config->auto_reconnect && xEventGroupGetBits(client->status_bits)&RECONNECT_BIT) {
|
||||||
client->run = false;
|
xEventGroupClearBits(client->status_bits, RECONNECT_BIT);
|
||||||
client->state = MQTT_STATE_DISCONNECTED;
|
client->state = MQTT_STATE_INIT;
|
||||||
ESP_LOGD(TAG, "MQTT client disconnected.");
|
client->wait_timeout_ms = MQTT_RECON_DEFAULT_MS;
|
||||||
|
ESP_LOGD(TAG, "Reconnecting per user request...");
|
||||||
break;
|
break;
|
||||||
}
|
} else if (client->config->auto_reconnect &&
|
||||||
if (platform_tick_get_ms() - client->reconnect_tick > client->wait_timeout_ms) {
|
platform_tick_get_ms() - client->reconnect_tick > client->wait_timeout_ms) {
|
||||||
client->state = MQTT_STATE_INIT;
|
client->state = MQTT_STATE_INIT;
|
||||||
client->reconnect_tick = platform_tick_get_ms();
|
client->reconnect_tick = platform_tick_get_ms();
|
||||||
ESP_LOGD(TAG, "Reconnecting...");
|
ESP_LOGD(TAG, "Reconnecting...");
|
||||||
@ -1601,6 +1603,20 @@ esp_err_t esp_mqtt_client_reconnect(esp_mqtt_client_handle_t client)
|
|||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static esp_err_t send_disconnect_msg(esp_mqtt_client_handle_t client)
|
||||||
|
{
|
||||||
|
// Notify the broker we are disconnecting
|
||||||
|
client->mqtt_state.outbound_message = mqtt_msg_disconnect(&client->mqtt_state.mqtt_connection);
|
||||||
|
if (client->mqtt_state.outbound_message->length == 0) {
|
||||||
|
ESP_LOGE(TAG, "Disconnect message cannot be created");
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
if (mqtt_write_data(client) != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "Error sending disconnect message");
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client)
|
esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client)
|
||||||
{
|
{
|
||||||
if (!client) {
|
if (!client) {
|
||||||
@ -1619,16 +1635,10 @@ esp_err_t esp_mqtt_client_stop(esp_mqtt_client_handle_t client)
|
|||||||
|
|
||||||
// Only send the disconnect message if the client is connected
|
// Only send the disconnect message if the client is connected
|
||||||
if (client->state == MQTT_STATE_CONNECTED) {
|
if (client->state == MQTT_STATE_CONNECTED) {
|
||||||
// Notify the broker we are disconnecting
|
if (send_disconnect_msg(client) != ESP_OK) {
|
||||||
client->mqtt_state.outbound_message = mqtt_msg_disconnect(&client->mqtt_state.mqtt_connection);
|
|
||||||
if (client->mqtt_state.outbound_message->length == 0) {
|
|
||||||
ESP_LOGE(TAG, "Disconnect message cannot be created");
|
|
||||||
MQTT_API_UNLOCK(client);
|
MQTT_API_UNLOCK(client);
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
if (mqtt_write_data(client) != ESP_OK) {
|
|
||||||
ESP_LOGE(TAG, "Error sending disconnect message");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client->run = false;
|
client->run = false;
|
||||||
|
Reference in New Issue
Block a user