Skip to content

Commit ed9f0ce

Browse files
Nicolas Emilianinemiliani
Nicolas Emiliani
authored andcommitted
(homieiot#648) enable psk tls if ESP32
-> If using ESP32 and ssl is enabled then the json config parameters need to be setup : * mqtt.psk : the pre shared key, up to 32 chars * mqtt.psk_identity : the pre shared key identity, up to 32 chars -> Don't publish stats nor invoke the user defined loop function if OTA is ongoing. This helps aliviate the TCP window going out of space. -> Send out 1 every 100 of the 206 messages while doing OTA updates
1 parent b9f6bc1 commit ed9f0ce

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

src/Homie/Boot/BootNormal.cpp

+32-3
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,18 @@ void BootNormal::setup() {
7777
#if ASYNC_TCP_SSL_ENABLED
7878
Interface::get().getLogger() << "SSL is: " << Interface::get().getConfig().get().mqtt.server.ssl.enabled << endl;
7979
Interface::get().getMqttClient().setSecure(Interface::get().getConfig().get().mqtt.server.ssl.enabled);
80-
if (Interface::get().getConfig().get().mqtt.server.ssl.enabled && Interface::get().getConfig().get().mqtt.server.ssl.hasFingerprint) {
80+
if (Interface::get().getConfig().get().mqtt.server.ssl.enabled){ // && Interface::get().getConfig().get().mqtt.server.ssl.hasFingerprint) {
81+
#if defined(ESP8266)
8182
char hexBuf[MAX_FINGERPRINT_STRING_LENGTH];
8283
Helpers::byteArrayToHexString(Interface::get().getConfig().get().mqtt.server.ssl.fingerprint, hexBuf, MAX_FINGERPRINT_SIZE);
8384
Interface::get().getLogger() << "Using fingerprint: " << hexBuf << endl;
8485
Interface::get().getMqttClient().addServerFingerprint((const uint8_t*)Interface::get().getConfig().get().mqtt.server.ssl.fingerprint);
86+
#elif defined(ESP32)
87+
Interface::get().getMqttClient().setPsk(
88+
Interface::get().getConfig().get().mqtt.server.ssl.psk_ident,
89+
Interface::get().getConfig().get().mqtt.server.ssl.psk);
8590
}
91+
#endif
8692
#endif
8793

8894
Interface::get().getMqttClient().setMaxTopicLength(MAX_MQTT_TOPIC_LENGTH);
@@ -164,6 +170,7 @@ void BootNormal::loop() {
164170
return;
165171
}
166172

173+
if(_otaOngoing) return;
167174
// here, we have notified the sketch we are ready
168175

169176
if (_mqttOfflineMessageId == 0 && Interface::get().flaggedForSleep) {
@@ -211,13 +218,20 @@ char* BootNormal::_prefixMqttTopic(PGM_P topic) {
211218
}
212219

213220
bool BootNormal::_publishOtaStatus(int status, const char* info) {
221+
static uint8_t count = 0;
222+
++count;
223+
214224
String payload(status);
215225
if (info) {
216226
payload.concat(F(" "));
217227
payload.concat(info);
218228
}
219-
220-
return Interface::get().getMqttClient().publish(_prefixMqttTopic(PSTR("/$implementation/ota/status")), 0, true, payload.c_str()) != 0;
229+
if(count == 100){
230+
count = 0;
231+
return Interface::get().getMqttClient().publish(
232+
_prefixMqttTopic(PSTR("/$implementation/ota/status")), 0, true, payload.c_str()) != 0;
233+
}
234+
return false;
221235
}
222236

223237
void BootNormal::_endOtaUpdate(bool success, uint8_t update_error) {
@@ -779,6 +793,13 @@ void BootNormal::_onMqttDisconnected(AsyncMqttClientDisconnectReason reason) {
779793
}
780794

781795
void BootNormal::_onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
796+
/*
797+
Interface::get().getLogger() << F("BootNormal::_onMqttMessage") << endl;
798+
Interface::get().getLogger() << "topic > " << topic << endl;
799+
Interface::get().getLogger() << "len > " << len << endl;
800+
Interface::get().getLogger() << "index > " << index << endl;
801+
Interface::get().getLogger() << "total > " << total << endl;
802+
*/
782803
if (total == 0) return; // no empty message possible
783804

784805
if (index == 0) {
@@ -875,6 +896,13 @@ bool HomieInternals::BootNormal::__fillPayloadBuffer(char * topic, char * payloa
875896
}
876897

877898
bool HomieInternals::BootNormal::__handleOTAUpdates(char* topic, char* payload, const AsyncMqttClientMessageProperties& properties, size_t len, size_t index, size_t total) {
899+
/*
900+
Interface::get().getLogger() << F("HomieInternals::BootNormal::__handleOTAUpdates...") << endl;
901+
Interface::get().getLogger() << "0 > " << _mqttTopicLevels.get()[0] << endl;
902+
Interface::get().getLogger() << "1 > " << _mqttTopicLevels.get()[1] << endl;
903+
Interface::get().getLogger() << "2 > " << _mqttTopicLevels.get()[2] << endl;
904+
Interface::get().getLogger() << "3 > " << _mqttTopicLevels.get()[3] << endl;
905+
*/
878906
if (
879907
_mqttTopicLevelsCount == 5
880908
&& strcmp(_mqttTopicLevels.get()[0], Interface::get().getConfig().get().deviceId) == 0
@@ -1047,6 +1075,7 @@ bool HomieInternals::BootNormal::__handleOTAUpdates(char* topic, char* payload,
10471075
}
10481076
return true;
10491077
}
1078+
Interface::get().getLogger() << F("HomieInternals::BootNormal::__handleOTAUpdates FALSE") << endl;
10501079
return false;
10511080
}
10521081

src/Homie/Config.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ bool Config::load() {
9090
const char* reqMqttUsername = reqMqtt["username"] | "";
9191
const char* reqMqttPassword = reqMqtt["password"] | "";
9292
const char* reqMqttFingerprint = reqMqtt["ssl_fingerprint"] | "";
93+
const char* reqMqttPsk = reqMqtt["psk"] | "";
94+
const char* reqMqttPskIdent = reqMqtt["psk_identity"] | "";
9395
const char* reqMqttBaseTopic = reqMqtt["base_topic"] | DEFAULT_MQTT_BASE_TOPIC;
9496

9597
strlcpy(_configStruct.name, reqName, MAX_FRIENDLY_NAME_LENGTH);
@@ -107,10 +109,15 @@ bool Config::load() {
107109
strlcpy(_configStruct.mqtt.server.host, reqMqttHost, MAX_HOSTNAME_LENGTH);
108110
#if ASYNC_TCP_SSL_ENABLED
109111
_configStruct.mqtt.server.ssl.enabled = reqMqttSsl;
112+
#if ESP8266
110113
if (strcmp_P(reqMqttFingerprint, PSTR("")) != 0) {
111114
_configStruct.mqtt.server.ssl.hasFingerprint = true;
112115
Helpers::hexStringToByteArray(reqMqttFingerprint, _configStruct.mqtt.server.ssl.fingerprint, MAX_FINGERPRINT_SIZE);
113116
}
117+
#elif defined(ESP32)
118+
strlcpy(_configStruct.mqtt.server.ssl.psk, reqMqttPsk, MAX_PSK_STRING_LENGTH);
119+
strlcpy(_configStruct.mqtt.server.ssl.psk_ident, reqMqttPskIdent, MAX_PSK_STRING_LENGTH);
120+
#endif
114121
#endif
115122
_configStruct.mqtt.server.port = reqMqttPort;
116123
strlcpy(_configStruct.mqtt.baseTopic, reqMqttBaseTopic, MAX_MQTT_BASE_TOPIC_LENGTH);
@@ -305,11 +312,18 @@ void Config::log() const {
305312
Interface::get().getLogger() << F(" ◦ Port: ") << _configStruct.mqtt.server.port << endl;
306313
#if ASYNC_TCP_SSL_ENABLED
307314
Interface::get().getLogger() << F(" ◦ SSL enabled: ") << (_configStruct.mqtt.server.ssl.enabled ? "true" : "false") << endl;
315+
#if ESP8266
308316
if (_configStruct.mqtt.server.ssl.enabled && _configStruct.mqtt.server.ssl.hasFingerprint) {
309317
char hexBuf[MAX_FINGERPRINT_STRING_LENGTH];
310318
Helpers::byteArrayToHexString(Interface::get().getConfig().get().mqtt.server.ssl.fingerprint, hexBuf, MAX_FINGERPRINT_SIZE);
311319
Interface::get().getLogger() << F(" ◦ Fingerprint: ") << hexBuf << endl;
312320
}
321+
#elif defined(ESP32)
322+
if (_configStruct.mqtt.server.ssl.enabled) {
323+
Interface::get().getLogger() << F(" ◦ PSK identity not shown") << endl;
324+
Interface::get().getLogger() << F(" ◦ PSK not shown") << endl;
325+
}
326+
#endif
313327
#endif
314328
Interface::get().getLogger() << F(" ◦ Base topic: ") << _configStruct.mqtt.baseTopic << endl;
315329
Interface::get().getLogger() << F(" ◦ Auth? ") << (_configStruct.mqtt.auth ? F("yes") : F("no")) << endl;

src/Homie/Datatypes/ConfigStruct.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,14 @@ struct ConfigStruct {
2828
#if ASYNC_TCP_SSL_ENABLED
2929
struct {
3030
bool enabled;
31+
#if ESP8266
3132
bool hasFingerprint;
3233
uint8_t fingerprint[MAX_FINGERPRINT_SIZE];
34+
#elif ESP32
35+
char psk_ident[MAX_PSK_STRING_LENGTH];
36+
char psk[MAX_PSK_STRING_LENGTH];
3337
} ssl;
38+
#endif
3439
#endif
3540
} server;
3641
char baseTopic[MAX_MQTT_BASE_TOPIC_LENGTH];
@@ -44,3 +49,4 @@ struct ConfigStruct {
4449
} ota;
4550
};
4651
} // namespace HomieInternals
52+

src/Homie/Limits.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@ namespace HomieInternals {
3636

3737
const uint8_t MAX_IP_STRING_LENGTH = 16 + 1;
3838

39+
const uint8_t MAX_PSK_STRING_LENGTH = 64 + 1;
40+
3941
} // namespace HomieInternals

0 commit comments

Comments
 (0)