fix secure mqtt

This commit is contained in:
MichaelDvP
2023-07-10 12:36:59 +02:00
parent f62b5548a3
commit ae46f40fce
2 changed files with 10 additions and 13 deletions

View File

@@ -49,6 +49,10 @@ void MqttSettingsService::begin() {
} }
if (_state.rootCA.length() > 0) { if (_state.rootCA.length() > 0) {
_mqttClient = static_cast<MqttClient *>(new espMqttClientSecure(espMqttClientTypes::UseInternalTask::NO)); _mqttClient = static_cast<MqttClient *>(new espMqttClientSecure(espMqttClientTypes::UseInternalTask::NO));
// use setInsecure() if there is no internet connection to verify the rootCA
// static_cast<espMqttClientSecure *>(_mqttClient)->setInsecure();
String cert = "-----BEGIN CERTIFICATE-----\n" + _state.rootCA + "\n-----END CERTIFICATE-----\n";
static_cast<espMqttClientSecure *>(_mqttClient)->setCACert(retainCstr(cert.c_str(), &_retainedRootCA));
static_cast<espMqttClientSecure *>(_mqttClient)->onConnect(std::bind(&MqttSettingsService::onMqttConnect, this, _1)); static_cast<espMqttClientSecure *>(_mqttClient)->onConnect(std::bind(&MqttSettingsService::onMqttConnect, this, _1));
static_cast<espMqttClientSecure *>(_mqttClient)->onDisconnect(std::bind(&MqttSettingsService::onMqttDisconnect, this, _1)); static_cast<espMqttClientSecure *>(_mqttClient)->onDisconnect(std::bind(&MqttSettingsService::onMqttDisconnect, this, _1));
} else { } else {
@@ -151,18 +155,14 @@ void MqttSettingsService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
} }
bool MqttSettingsService::configureMqtt() { bool MqttSettingsService::configureMqtt() {
if (_mqttClient == nullptr) {
begin();
}
// disconnect if connected // disconnect if connected
if (_mqttClient->connected()) {
_mqttClient->disconnect(true); _mqttClient->disconnect(true);
}
// only connect if WiFi is connected and MQTT is enabled // only connect if WiFi is connected and MQTT is enabled
if (_state.enabled && !_state.host.isEmpty()) { if (_state.enabled && emsesp::EMSESP::system_.network_connected() && !_state.host.isEmpty()) {
_reconfigureMqtt = false; _reconfigureMqtt = false;
if (_state.rootCA.length() > 0) { if (_state.rootCA.length() > 0) {
// static_cast<espMqttClientSecure *>(_mqttClient)->setInsecure();
String cert = "-----BEGIN CERTIFICATE-----\n" + _state.rootCA + "\n-----END CERTIFICATE-----\n";
static_cast<espMqttClientSecure *>(_mqttClient)->setCACert(retainCstr(cert.c_str(), &_retainedRootCA));
static_cast<espMqttClientSecure *>(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port); static_cast<espMqttClientSecure *>(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port);
if (_state.username.length() > 0) { if (_state.username.length() > 0) {
static_cast<espMqttClientSecure *>(_mqttClient) static_cast<espMqttClientSecure *>(_mqttClient)
@@ -174,7 +174,6 @@ bool MqttSettingsService::configureMqtt() {
static_cast<espMqttClientSecure *>(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId)); static_cast<espMqttClientSecure *>(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId));
static_cast<espMqttClientSecure *>(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast<espMqttClientSecure *>(_mqttClient)->setKeepAlive(_state.keepAlive);
static_cast<espMqttClientSecure *>(_mqttClient)->setCleanSession(_state.cleanSession); static_cast<espMqttClientSecure *>(_mqttClient)->setCleanSession(_state.cleanSession);
return _mqttClient->connect();
} else { } else {
// emsesp::EMSESP::logger().info("Configuring MQTT client"); // emsesp::EMSESP::logger().info("Configuring MQTT client");
static_cast<espMqttClient *>(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port); static_cast<espMqttClient *>(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port);
@@ -188,10 +187,8 @@ bool MqttSettingsService::configureMqtt() {
static_cast<espMqttClient *>(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId)); static_cast<espMqttClient *>(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId));
static_cast<espMqttClient *>(_mqttClient)->setKeepAlive(_state.keepAlive); static_cast<espMqttClient *>(_mqttClient)->setKeepAlive(_state.keepAlive);
static_cast<espMqttClient *>(_mqttClient)->setCleanSession(_state.cleanSession); static_cast<espMqttClient *>(_mqttClient)->setCleanSession(_state.cleanSession);
return _mqttClient->connect();
// } else {
// emsesp::EMSESP::logger().info("Error configuring MQTT client");
} }
return _mqttClient->connect();
} }
return false; return false;
} }

View File

@@ -138,7 +138,7 @@ class MqttSettingsService : public StatefulService<MqttSettings> {
espMqttClientTypes::DisconnectReason _disconnectReason; espMqttClientTypes::DisconnectReason _disconnectReason;
// the MQTT client instance // the MQTT client instance
MqttClient * _mqttClient = nullptr; MqttClient * _mqttClient;
void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info);
void onMqttConnect(bool sessionPresent); void onMqttConnect(bool sessionPresent);