diff -r 0432d9147682 -r 15dc572a7fcb main/task_mqtt.c --- a/main/task_mqtt.c Thu Sep 28 11:29:23 2023 +0200 +++ b/main/task_mqtt.c Tue Oct 03 17:24:06 2023 +0200 @@ -17,6 +17,7 @@ const int TASK_MQTT_CONNECT = BIT0; ///< Request MQTT connection const int TASK_MQTT_DISCONNECT = BIT1; ///< Request MQTT disconnect const int TASK_MQTT_CONNECTED = BIT2; ///< MQTT is connected +const int TASK_MQTT_STARTED = BIT3; ///< MQTT is started const char *sensState[] = { "OK", "ERROR" }; ///< Sensor state strings const char *unitMode[] = { "OFF", "ON" }; ///< Units state strings @@ -30,8 +31,8 @@ extern unit_t units[3]; extern SemaphoreHandle_t xSemaphoreUnits; extern const esp_app_desc_t *app_desc; -extern strConfig_t config; - +extern char hostname[]; +extern char uuid[]; void connect_mqtt(bool state) { @@ -78,7 +79,7 @@ tmp = xstrcpy((char *)"mbv1.0/co2meters/"); tmp = xstrcat(tmp, msgtype); tmp = xstrcat(tmp, (char *)"/"); - tmp = xstrcat(tmp, config.hostname); + tmp = xstrcat(tmp, hostname); return tmp; } @@ -200,12 +201,30 @@ esp_chip_info(&chip_info); payload = payload_header(); payload = xstrcat(payload, (char *)"{\"uuid\":\""); - payload = xstrcat(payload, config.uuid); + payload = xstrcat(payload, uuid); payload = xstrcat(payload, (char *)"\",\"interval\":"); sprintf(buf, "%d", MAINLOOP_TIMER); payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)",\"properties\":{\"hardwaremake\":\"Unknown\",\"hardwaremodel\":\""); - sprintf(buf, "ESP32 %d cores rev %d, WiFi bgn", chip_info.cores, chip_info.revision); + if (chip_info.model == CHIP_ESP32) + payload = xstrcat(payload, (char *)"ESP32"); + else if (chip_info.model == CHIP_ESP32S2) + payload = xstrcat(payload, (char *)"ESP32-S2"); + else if (chip_info.model == CHIP_ESP32S3) + payload = xstrcat(payload, (char *)"ESP32-S3"); + else if (chip_info.model == CHIP_ESP32C3) + payload = xstrcat(payload, (char *)"ESP32-C3"); + else if (chip_info.model == CHIP_ESP32C2) + payload = xstrcat(payload, (char *)"ESP32-C2"); + else if (chip_info.model == CHIP_ESP32C6) + payload = xstrcat(payload, (char *)"ESP32-C6"); + else if (chip_info.model == CHIP_ESP32H2) + payload = xstrcat(payload, (char *)"ESP32-H2"); + else if (chip_info.model == CHIP_POSIX_LINUX) + payload = xstrcat(payload, (char *)"Posix Linux"); + else + payload = xstrcat(payload, (char *)"Unknown"); + sprintf(buf, " %d cores rev %d, WiFi bgn", chip_info.cores, chip_info.revision); payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)"\",\"os\":\"esp-idf\",\"os_version\":\""); payload = xstrcat(payload, (char *)esp_get_idf_version()); @@ -231,6 +250,11 @@ payload = xstrcat(payload, (char *)"\",\"rssi\":"); sprintf(buf, "%d", wifi_state->STA_rssi); payload = xstrcat(payload, buf); + payload = xstrcat(payload, (char *)",\"bssid\":\""); + payload = xstrcat(payload, wifi_state->STA_bssid); + payload = xstrcat(payload, (char *)"\",\"channel\":"); + sprintf(buf, "%d", wifi_state->STA_channel); + payload = xstrcat(payload, buf); payload = xstrcat(payload, (char *)"}"); xSemaphoreGive(xSemaphoreWiFi); } else { @@ -289,17 +313,18 @@ switch (event->event_id) { case MQTT_EVENT_CONNECTED: - ESP_LOGD(TAG, "MQTT_EVENT_CONNECTED"); + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); xEventGroupSetBits(xEventGroupMQTT, TASK_MQTT_CONNECTED); + xEventGroupSetBits(xEventGroupMQTT, TASK_MQTT_STARTED); break; case MQTT_EVENT_DISCONNECTED: - ESP_LOGD(TAG, "MQTT_EVENT_DISCONNECTED"); + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_CONNECTED); break; case MQTT_EVENT_SUBSCRIBED: - ESP_LOGD(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); break; case MQTT_EVENT_UNSUBSCRIBED: @@ -307,7 +332,7 @@ break; case MQTT_EVENT_PUBLISHED: - ESP_LOGD(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); if (xSemaphoreTake(xSemaphorePcounter, 10) == pdTRUE) { if (count_pub) { count_pub--; @@ -378,40 +403,55 @@ uxBits = xEventGroupWaitBits(xEventGroupMQTT, TASK_MQTT_CONNECT | TASK_MQTT_DISCONNECT, pdFALSE, pdFALSE, portMAX_DELAY ); if (uxBits & TASK_MQTT_CONNECT) { - if (strlen(config.mqtt_server)) { - uri = xstrcpy((char *)"mqtt://"); - if (strlen(config.mqtt_user) && strlen(config.mqtt_pwd)) { - uri = xstrcat(uri, config.mqtt_user); - uri = xstrcat(uri, (char *)":"); - uri = xstrcat(uri, config.mqtt_pwd); - uri = xstrcat(uri, (char *)"@"); + if (! (xEventGroupGetBits(xEventGroupMQTT) & TASK_MQTT_CONNECTED)) { + if (strlen(CONFIG_MQTT_SERVER)) { + uri = xstrcpy((char *)"mqtt://"); + if (strlen(CONFIG_MQTT_USER) && strlen(CONFIG_MQTT_PASS)) { + uri = xstrcat(uri, CONFIG_MQTT_USER); + uri = xstrcat(uri, (char *)":"); + uri = xstrcat(uri, CONFIG_MQTT_PASS); + uri = xstrcat(uri, (char *)"@"); + } + uri = xstrcat(uri, CONFIG_MQTT_SERVER); + if (CONFIG_MQTT_PORT != 1883) { + uri = xstrcat(uri, (char *)":"); + sprintf(port, "%d", CONFIG_MQTT_PORT); + uri = xstrcat(uri, port); + } + } else { + uri = xstrcpy((char *)"mqtt://iot.eclipse.org:1883"); } - uri = xstrcat(uri, config.mqtt_server); - if (config.mqtt_port != 1883) { - uri = xstrcat(uri, (char *)":"); - sprintf(port, "%d", config.mqtt_port); - uri = xstrcat(uri, port); + + ESP_LOGI(TAG, "Request MQTT connect %s", uri); + err = esp_mqtt_client_set_uri(client, uri); + if (err != ESP_OK) + ESP_LOGE(TAG, "Set uri %s", esp_err_to_name(err)); + + if (xEventGroupGetBits(xEventGroupMQTT) & TASK_MQTT_STARTED) { + /* Existing session */ + err = esp_mqtt_client_reconnect(client); + if (err != ESP_OK) + ESP_LOGE(TAG, "Reconnect result %s", esp_err_to_name(err)); + } else { + /* New session */ + err = esp_mqtt_client_start(client); + if (err != ESP_OK) + ESP_LOGE(TAG, "Start result %s", esp_err_to_name(err)); } + if (uri) + free(uri); + uri = NULL; } else { - uri = xstrcpy((char *)"mqtt://iot.eclipse.org:1883"); + ESP_LOGI(TAG, "Request MQTT connect but already connected."); } - ESP_LOGI(TAG, "Request MQTT connect %s", uri); - err = esp_mqtt_client_set_uri(client, uri); - if (err != ESP_OK) - ESP_LOGE(TAG, "Set uri %s", esp_err_to_name(err)); - err = esp_mqtt_client_start(client); - if (err != ESP_OK) - ESP_LOGE(TAG, "Result %s", esp_err_to_name(err)); - if (uri) - free(uri); - uri = NULL; xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_CONNECT); } else if (uxBits & TASK_MQTT_DISCONNECT) { ESP_LOGI(TAG, "Request MQTT disconnect"); esp_mqtt_client_stop(client); xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_DISCONNECT); - xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_CONNECTED); +// xEventGroupClearBits(xEventGroupMQTT, TASK_MQTT_CONNECTED); + ESP_LOGI(TAG, "Request MQTT disconnect done"); } } }