Improvements for esp_mqtt client #174

This commit is contained in:
fvanroie 2022-07-30 23:12:13 +02:00
parent 702143e5ee
commit 756239d245

View File

@ -314,10 +314,10 @@ static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
case MQTT_ERROR_TYPE_NONE: case MQTT_ERROR_TYPE_NONE:
default:; default:;
} }
break;
} }
default: default:
LOG_WARNING(TAG_MQTT, "mqtt_event_handler %d", event->event_id); LOG_WARNING(TAG_MQTT, "mqtt_event_handler %d", event->event_id);
break;
} }
return ESP_OK; return ESP_OK;
} }
@ -345,11 +345,10 @@ void mqttStart()
{ {
char buffer[64]; char buffer[64];
char lastWillPayload[8]; char lastWillPayload[8];
// static uint8_t mqttReconnectCount = 0;
// bool mqttFirstConnect = true;
if(mqttClient) { mqttEnabled = strlen(mqttServer) > 0 && mqttPort > 0;
LOG_INFO(TAG_MQTT, F(D_SERVICE_STARTED)); if(!mqttEnabled) {
LOG_WARNING(TAG_MQTT, F(D_MQTT_NOT_CONFIGURED));
return; return;
} }
@ -368,74 +367,71 @@ void mqttStart()
strncat_P(mqttLwtTopic, PSTR(MQTT_TOPIC_LWT), sizeof(mqttLwtTopic)); strncat_P(mqttLwtTopic, PSTR(MQTT_TOPIC_LWT), sizeof(mqttLwtTopic));
LOG_WARNING(TAG_MQTT, mqttLwtTopic); LOG_WARNING(TAG_MQTT, mqttLwtTopic);
if(mqttEnabled) { mqtt_cfg.event_handle = mqtt_event_handler;
mqtt_cfg.event_handle = mqtt_event_handler; mqtt_cfg.buffer_size = MQTT_MAX_PACKET_SIZE;
mqtt_cfg.buffer_size = MQTT_MAX_PACKET_SIZE; mqtt_cfg.out_buffer_size = 512;
mqtt_cfg.out_buffer_size = 512; mqtt_cfg.reconnect_timeout_ms = 5000;
mqtt_cfg.reconnect_timeout_ms = 5000; mqtt_cfg.disable_auto_reconnect = false;
mqtt_cfg.keepalive = 15; /* seconds */ mqtt_cfg.keepalive = 15; /* seconds */
mqtt_cfg.disable_clean_session = true;
mqtt_cfg.protocol_ver = MQTT_PROTOCOL_V_3_1_1; mqtt_cfg.protocol_ver = MQTT_PROTOCOL_V_3_1_1;
mqtt_cfg.transport = MQTT_TRANSPORT_OVER_TCP; mqtt_cfg.transport = MQTT_TRANSPORT_OVER_TCP;
mqtt_cfg.host = mqttServer; mqtt_cfg.host = mqttServer;
mqtt_cfg.port = mqttPort; mqtt_cfg.port = mqttPort;
mqtt_cfg.username = mqttUsername; mqtt_cfg.username = mqttUsername;
mqtt_cfg.password = mqttPassword; mqtt_cfg.password = mqttPassword;
mqtt_cfg.client_id = mqttClientId; mqtt_cfg.client_id = mqttClientId;
mqtt_cfg.lwt_msg = "offline"; mqtt_cfg.lwt_msg = "offline";
mqtt_cfg.lwt_retain = true; mqtt_cfg.lwt_retain = true;
mqtt_cfg.lwt_topic = mqttLwtTopic; mqtt_cfg.lwt_topic = mqttLwtTopic;
mqtt_cfg.lwt_qos = 1; mqtt_cfg.lwt_qos = 1;
// mqtt_cfg.crt_bundle_attach = esp_crt_bundle_attach; // mqtt_cfg.crt_bundle_attach = esp_crt_bundle_attach;
// test Mosquitto doesn't need a user/pwd // test Mosquitto doesn't need a user/pwd
// // mqtt_cfg.username=(const char *)mqtt_user; // // mqtt_cfg.username=(const char *)mqtt_user;
// // mqtt_cfg.password=(const char *)mqtt_pwd; // // mqtt_cfg.password=(const char *)mqtt_pwd;
if(mqttClient) {
esp_mqtt_set_config(mqttClient, &mqtt_cfg);
} else {
mqttClient = esp_mqtt_client_init(&mqtt_cfg); mqttClient = esp_mqtt_client_init(&mqtt_cfg);
// mqttStart(); if(esp_mqtt_client_start(mqttClient) != ESP_OK) {
} else { LOG_WARNING(TAG_MQTT, F(D_SERVICE_START_FAILED));
LOG_WARNING(TAG_MQTT, F(D_MQTT_NOT_CONFIGURED)); return;
}
} }
// haspProgressMsg(F(D_MQTT_CONNECTING)); LOG_INFO(TAG_MQTT, F(D_SERVICE_STARTING));
// haspProgressVal(mqttReconnectCount * 5);
if(esp_mqtt_client_start(mqttClient) != ESP_OK) {
LOG_WARNING(TAG_MQTT, F(D_SERVICE_START_FAILED));
// Retry until we give up and restart after connectTimeout seconds
// mqttReconnectCount++;
// switch(0) {
// default:
// LOG_WARNING(TAG_MQTT, F("Unknown failure"));
// }
// if(mqttReconnectCount > 20) {
// LOG_ERROR(TAG_MQTT, F("Retry count exceeded, rebooting..."));
// dispatch_reboot(false);
// }
return;
} else {
LOG_INFO(TAG_MQTT, F(D_SERVICE_STARTING));
}
} }
void mqttStop() void mqttStop()
{ {
if(!mqttEnabled) { if(!mqttEnabled) {
LOG_WARNING(TAG_MQTT, F(D_SERVICE_DISABLED)); LOG_WARNING(TAG_MQTT, F(D_SERVICE_DISABLED));
} else if(!mqttClientConnected) { return;
LOG_WARNING(TAG_MQTT, F(D_SERVICE_DISCONNECTED)); }
} else {
LOG_TRACE(TAG_MQTT, F(D_MQTT_DISCONNECTING));
mqtt_send_lwt(false);
esp_mqtt_client_stop(mqttClient);
LOG_INFO(TAG_MQTT, F(D_MQTT_DISCONNECTED));
mqttClient = NULL; if(mqttClient != NULL) {
mqttClientConnected = false; if(mqttClientConnected) {
LOG_TRACE(TAG_MQTT, F(D_MQTT_DISCONNECTING));
}
mqtt_send_lwt(false);
// esp_err_t err = esp_mqtt_client_stop(mqttClient); // Cannot be called from the *MQTT* event handler
mqtt_cfg.disable_auto_reconnect = true;
esp_mqtt_set_config(mqttClient, &mqtt_cfg);
esp_err_t err = esp_mqtt_client_disconnect(mqttClient);
if(err == ESP_OK) {
// mqttClient = NULL;
mqttClientConnected = false;
LOG_INFO(TAG_MQTT, F(D_MQTT_DISCONNECTED));
} else {
LOG_ERROR(TAG_MQTT, F(D_MQTT_FAILED " %d"), err);
}
} else {
LOG_INFO(TAG_MQTT, F(D_SERVICE_STOPPED));
} }
} }
@ -570,7 +566,6 @@ bool mqttSetConfig(const JsonObject& settings)
snprintf_P(mqttNodeTopic, sizeof(mqttNodeTopic), PSTR(MQTT_PREFIX "/%s/"), haspDevice.get_hostname()); snprintf_P(mqttNodeTopic, sizeof(mqttNodeTopic), PSTR(MQTT_PREFIX "/%s/"), haspDevice.get_hostname());
snprintf_P(mqttGroupTopic, sizeof(mqttGroupTopic), PSTR(MQTT_PREFIX "/%s/"), mqttGroupName); snprintf_P(mqttGroupTopic, sizeof(mqttGroupTopic), PSTR(MQTT_PREFIX "/%s/"), mqttGroupName);
mqttEnabled = strlen(mqttServer) > 0 && mqttPort > 0;
return changed; return changed;
} }
#endif // HASP_USE_CONFIG #endif // HASP_USE_CONFIG