main/task_mqtt.c

changeset 77
15dc572a7fcb
parent 69
5437e0514d59
--- 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");
 	}
     }
 }

mercurial