From 3919f4d03a70ef36432611fcb5cd3d8063879673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joe=CC=88l=20Ga=CC=88hwiler?= Date: Fri, 11 Feb 2022 08:58:48 +0100 Subject: [PATCH] keep connecting until stopped --- Makefile | 4 +-- esp_mqtt.c | 23 ++++++++------- esp_mqtt.h | 5 ++-- test/main/main.c | 44 ++++++++++++++--------------- test/main/server_root_cert.pem | 51 +++++++++++++++++++--------------- 5 files changed, 67 insertions(+), 60 deletions(-) diff --git a/Makefile b/Makefile index bb3221e..b4d2b09 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,8 @@ endif ESP_IDF_VERSION := "v3.3.5" fmt: - clang-format -i ./*.c ./*.h -style="{BasedOnStyle: Google, ColumnLimit: 120}" - clang-format -i ./test/main/*.c -style="{BasedOnStyle: Google, ColumnLimit: 120}" + clang-format -i ./*.c ./*.h -style="{BasedOnStyle: Google, ColumnLimit: 120, SortIncludes: false}" + clang-format -i ./test/main/*.c -style="{BasedOnStyle: Google, ColumnLimit: 120, SortIncludes: false}" test/xtensa-esp32-elf: wget https://dl.espressif.com/dl/$(XTENSA_TOOLCHAIN) diff --git a/esp_mqtt.c b/esp_mqtt.c index d6d191a..d2e50b4 100644 --- a/esp_mqtt.c +++ b/esp_mqtt.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #if defined(CONFIG_ESP_MQTT_TLS_ENABLE) @@ -274,7 +273,7 @@ static bool esp_mqtt_process_connect() { return true; } -static void esp_mqtt_process(void *p) { +static void esp_mqtt_process() { // connection loop for (;;) { // log attempt @@ -288,7 +287,7 @@ static void esp_mqtt_process(void *p) { // log success ESP_LOGI(ESP_MQTT_LOG_TAG, "esp_mqtt_process: connection attempt successful"); - // set local flag + // set flag esp_mqtt_connected = true; // release mutex @@ -411,23 +410,27 @@ static void esp_mqtt_process(void *p) { esp_lwmqtt_network_disconnect(&esp_mqtt_network); #endif - // set local flags + // set flags esp_mqtt_connected = false; - esp_mqtt_running = false; esp_mqtt_error = false; // release mutex ESP_MQTT_UNLOCK_MAIN(); - ESP_LOGI(ESP_MQTT_LOG_TAG, "esp_mqtt_process: exit task"); + // log event + ESP_LOGI(ESP_MQTT_LOG_TAG, "esp_mqtt_process: lost connection"); // call callback if existing if (esp_mqtt_status_callback) { esp_mqtt_status_callback(ESP_MQTT_STATUS_DISCONNECTED); } +} - // delete task - vTaskDelete(NULL); +static void esp_mqtt_run(void *p) { + // keep processing + for (;;) { + esp_mqtt_process(); + } } void esp_mqtt_lwt(const char *topic, const char *payload, int qos, bool retained) { @@ -535,7 +538,7 @@ bool esp_mqtt_start(const char *host, const char *port, const char *client_id, c // create mqtt thread ESP_LOGI(ESP_MQTT_LOG_TAG, "esp_mqtt_start: create task"); - BaseType_t ret = xTaskCreatePinnedToCore(esp_mqtt_process, "esp_mqtt", CONFIG_ESP_MQTT_TASK_STACK_SIZE, NULL, + BaseType_t ret = xTaskCreatePinnedToCore(esp_mqtt_run, "esp_mqtt", CONFIG_ESP_MQTT_TASK_STACK_SIZE, NULL, CONFIG_ESP_MQTT_TASK_STACK_PRIORITY, &esp_mqtt_task, 1); if (ret != pdPASS) { ESP_LOGW(ESP_MQTT_LOG_TAG, "esp_mqtt_start: failed to create task"); @@ -543,7 +546,7 @@ bool esp_mqtt_start(const char *host, const char *port, const char *client_id, c return false; } - // set local flag + // set flag esp_mqtt_running = true; // release mutex diff --git a/esp_mqtt.h b/esp_mqtt.h index 74b7b80..6069755 100644 --- a/esp_mqtt.h +++ b/esp_mqtt.h @@ -71,7 +71,8 @@ void esp_mqtt_lwt(const char *topic, const char *payload, int qos, bool retained * The background process will attempt to connect to the specified broker once a second until a connection can be * established. This process can be interrupted by calling `esp_mqtt_stop();`. If a connection has been established, * the status callback will be called with `ESP_MQTT_STATUS_CONNECTED`. From that moment on the functions - * `esp_mqtt_subscribe`, `esp_mqtt_unsubscribe` and `esp_mqtt_publish` can be used to interact with the broker. + * `esp_mqtt_subscribe`, `esp_mqtt_unsubscribe` and `esp_mqtt_publish` can be used to interact with the broker. If an + * established connection fails, it will be retried until the process is stopped. * * @param host - The broker host. * @param port - The broker port. @@ -130,7 +131,7 @@ bool esp_mqtt_publish(const char *topic, uint8_t *payload, size_t len, int qos, /** * Stop the MQTT process. * - * Will stop initial connection attempts or disconnect any active connection. + * Will stop the running MQTT process. */ void esp_mqtt_stop(); diff --git a/test/main/main.c b/test/main/main.c index 77c8b78..24538e4 100644 --- a/test/main/main.c +++ b/test/main/main.c @@ -16,7 +16,10 @@ #define MQTT_PORT "1883" #define MQTTS_PORT "8883" -// openssl s_client -showcerts -connect public.cloud.shiftr.io:8883 -servername public.cloud.shiftr.io +#define PUBLISH_INTERVAL 1000 +#define RESTART_INTERVAL 20000 + +// openssl s_client -showcerts -connect garage.cloud.shiftr.io:8883 -servername garage.cloud.shiftr.io extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start"); extern const uint8_t server_root_cert_pem_end[] asm("_binary_server_root_cert_pem_end"); @@ -34,16 +37,19 @@ static void connect() { static void process(void *p) { for (;;) { - // publish roughly every second + // publish every second esp_mqtt_publish("/hello", (uint8_t *)"world", 5, 2, false); - vTaskDelay(1000 / portTICK_PERIOD_MS); + vTaskDelay(PUBLISH_INTERVAL / portTICK_PERIOD_MS); } } static void restart(void *_) { + // initial start + connect(); + for (;;) { - // stop and start mqtt 15s - vTaskDelay(15000 / portTICK_PERIOD_MS); + // restart periodically + vTaskDelay(RESTART_INTERVAL / portTICK_PERIOD_MS); esp_mqtt_stop(); connect(); } @@ -53,22 +59,16 @@ static esp_err_t event_handler(void *ctx, system_event_t *event) { switch (event->event_id) { case SYSTEM_EVENT_STA_START: // connect to ap - esp_wifi_connect(); + ESP_ERROR_CHECK_WITHOUT_ABORT(esp_wifi_connect()); break; case SYSTEM_EVENT_STA_GOT_IP: - // start mqtt - connect(); - break; case SYSTEM_EVENT_STA_DISCONNECTED: - // stop mqtt - esp_mqtt_stop(); - - // reconnect wifi - esp_wifi_connect(); + // reconnect Wi-Fi + ESP_ERROR_CHECK_WITHOUT_ABORT(esp_wifi_connect()); break; @@ -88,9 +88,7 @@ static void status_callback(esp_mqtt_status_t status) { break; case ESP_MQTT_STATUS_DISCONNECTED: - // reconnect - connect(); - + default: break; } } @@ -100,30 +98,30 @@ static void message_callback(const char *topic, uint8_t *payload, size_t len) { } void app_main() { - // initialize nvs flash + // initialize NVS flash ESP_ERROR_CHECK(nvs_flash_init()); - // initialize tcp/ip adapter + // initialize TCP/IP adapter tcpip_adapter_init(); // register event handler ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); - // initialize wifi + // initialize Wi-Fi wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); - // set wifi storage to ram + // set Wi-Fi storage to ram ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); // set wifi mode ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - // prepare wifi config + // prepare Wi-Fi config wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID, .password = WIFI_PASS}}; ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); - // start wifi + // start Wi-Fi ESP_ERROR_CHECK(esp_wifi_start()); // initialize mqtt diff --git a/test/main/server_root_cert.pem b/test/main/server_root_cert.pem index 1d82449..123d192 100644 --- a/test/main/server_root_cert.pem +++ b/test/main/server_root_cert.pem @@ -1,26 +1,31 @@ -----BEGIN CERTIFICATE----- -MIIEZTCCA02gAwIBAgIQQAF1BIMUpMghjISpDBbN3zANBgkqhkiG9w0BAQsFADA/ +MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTIwMTAwNzE5MjE0MFoXDTIxMDkyOTE5MjE0MFow -MjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxCzAJBgNVBAMT -AlIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuwIVKMz2oJTTDxLs -jVWSw/iC8ZmmekKIp10mqrUrucVMsa+Oa/l1yKPXD0eUFFU1V4yeqKI5GfWCPEKp -Tm71O8Mu243AsFzzWTjn7c9p8FoLG77AlCQlh/o3cbMT5xys4Zvv2+Q7RVJFlqnB -U840yFLuta7tj95gcOKlVKu2bQ6XpUA0ayvTvGbrZjR8+muLj1cpmfgwF126cm/7 -gcWt0oZYPRfH5wm78Sv3htzB2nFd1EbjzK0lwYi8YGd1ZrPxGPeiXOZT/zqItkel -/xMY6pgJdz+dU/nPAeX1pnAXFK9jpP+Zs5Od3FOnBv5IhR2haa4ldbsTzFID9e1R -oYvbFQIDAQABo4IBaDCCAWQwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8E -BAMCAYYwSwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5p -ZGVudHJ1c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTE -p7Gkeyxx+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEE -AYLfEwEBATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2Vu -Y3J5cHQub3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0 -LmNvbS9EU1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYf -r52LFMLGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B -AQsFAAOCAQEA2UzgyfWEiDcx27sT4rP8i2tiEmxYt0l+PAK3qB8oYevO4C5z70kH -ejWEHx2taPDY/laBL21/WKZuNTYQHHPD5b1tXgHXbnL7KqC401dk5VvCadTQsvd8 -S8MXjohyc9z9/G2948kLjmE6Flh9dDYrVYA9x2O+hEPGOaEOa1eePynBgPayvUfL -qjBstzLhWVQLGAkXXmNs+5ZnPBxzDJOLxhF2JIbeQAcH5H0tZrUlo5ZYyOqA7s9p -O5b85o3AM/OJ+CktFBQtfvBhcJVd9wvlwPsk+uyOy2HI7mNxKKgsBTt375teA2Tw -UdHkhVNcsAKX1H7GNNLOEADksd86wuoXvg== +DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC +ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL +wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D +LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK +4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5 +bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y +sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ +Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4 +FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc +SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql +PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND +TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 +c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx ++tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB +ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu +b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E +U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu +MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC +5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW +9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG +WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O +he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC +Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 -----END CERTIFICATE-----