@@ -203,6 +203,10 @@ constexpr KeepAlive keepalive() {
203
203
static_assert (keepalive() >= KeepaliveMin, "");
204
204
static_assert (keepalive() <= KeepaliveMax, "");
205
205
206
+ constexpr bool cleanSession () {
207
+ return 1 == MQTT_CLEAN_SESSION;
208
+ }
209
+
206
210
STRING_VIEW_INLINE (TopicWill, MQTT_TOPIC_STATUS);
207
211
208
212
constexpr int willQoS () {
@@ -272,6 +276,7 @@ STRING_VIEW_INLINE(Password, "mqttPassword");
272
276
STRING_VIEW_INLINE (QoS, " mqttQoS" );
273
277
STRING_VIEW_INLINE (Retain, " mqttRetain" );
274
278
STRING_VIEW_INLINE (Keepalive, " mqttKeep" );
279
+ STRING_VIEW_INLINE (CleanSession, " mqttClean" );
275
280
STRING_VIEW_INLINE (ClientId, " mqttClientID" );
276
281
STRING_VIEW_INLINE (TopicWill, " mqttWill" );
277
282
STRING_VIEW_INLINE (WillQoS, " mqttWillQoS" );
@@ -350,6 +355,10 @@ espurna::mqtt::KeepAlive keepalive() {
350
355
build::KeepaliveMin, build::KeepaliveMax);
351
356
}
352
357
358
+ bool cleanSession () {
359
+ return getSetting (keys::CleanSession, build::cleanSession ());
360
+ }
361
+
353
362
String clientId () {
354
363
return getSetting (keys::ClientId, systemIdentifier ());
355
364
}
@@ -435,18 +444,19 @@ String NAME () {\
435
444
}
436
445
437
446
EXACT_VALUE (autoconnect, settings::autoconnect)
447
+ EXACT_VALUE (cleanSession, settings::cleanSession)
438
448
EXACT_VALUE (enabled, settings::enabled)
439
449
EXACT_VALUE (heartbeatInterval, settings::heartbeatInterval)
440
450
EXACT_VALUE (heartbeatMode, settings::heartbeatMode)
441
451
EXACT_VALUE (json, settings::json)
442
452
EXACT_VALUE (keepalive, settings::keepalive)
443
453
EXACT_VALUE (port, settings::port)
444
454
EXACT_VALUE (qos, settings::qos)
445
- EXACT_VALUE (willQoS, settings::willQoS)
446
- EXACT_VALUE (willRetain, settings::willRetain)
447
455
EXACT_VALUE (retain, settings::retain)
448
- EXACT_VALUE (skipTime, settings::skipTime)
449
456
EXACT_VALUE (settings, settings::settings)
457
+ EXACT_VALUE (skipTime, settings::skipTime)
458
+ EXACT_VALUE (willQoS, settings::willQoS)
459
+ EXACT_VALUE (willRetain, settings::willRetain)
450
460
451
461
#undef EXACT_VALUE
452
462
@@ -461,10 +471,11 @@ static constexpr espurna::settings::query::Setting Settings[] PROGMEM {
461
471
{keys::WillRetain, internal::willRetain},
462
472
{keys::PayloadOffline, settings::payloadOffline},
463
473
{keys::PayloadOnline, settings::payloadOnline},
464
- {keys::QoS, internal::qos},
465
474
{keys::Retain, internal::retain},
466
- {keys::ClientId, settings::clientId },
475
+ {keys::QoS, internal::qos },
467
476
{keys::Keepalive, internal::keepalive},
477
+ {keys::CleanSession, internal::cleanSession},
478
+ {keys::ClientId, settings::clientId},
468
479
{keys::User, settings::user},
469
480
{keys::Password, settings::password},
470
481
{keys::Topic, settings::topic},
@@ -632,11 +643,12 @@ struct MqttConnectionSettings {
632
643
String server;
633
644
uint16_t port{};
634
645
635
- String clientId ;
646
+ String client_id ;
636
647
637
648
bool retain { mqtt::build::retain () };
638
649
int qos { mqtt::build::qos () };
639
650
espurna::mqtt::KeepAlive keepalive { mqtt::build::keepalive () };
651
+ bool clean_session { mqtt::build::cleanSession () };
640
652
641
653
String topic;
642
654
String user;
@@ -904,9 +916,9 @@ namespace {
904
916
905
917
void _mqttSetupAsyncClient (bool secure = false ) {
906
918
_mqtt.setServer (_mqtt_settings.server .c_str (), _mqtt_settings.port );
907
- _mqtt.setClientId (_mqtt_settings.clientId .c_str ());
919
+ _mqtt.setClientId (_mqtt_settings.client_id .c_str ());
908
920
_mqtt.setKeepAlive (_mqtt_settings.keepalive .count ());
909
- _mqtt.setCleanSession (false );
921
+ _mqtt.setCleanSession (_mqtt_settings. clean_session );
910
922
911
923
_mqtt.setWill (
912
924
_mqtt_settings.will_topic .c_str (),
@@ -959,6 +971,24 @@ bool _mqttSetupSyncClient(bool secure = false) {
959
971
bool _mqttConnectSyncClient (bool secure = false ) {
960
972
bool result = false ;
961
973
974
+ const auto credentials =
975
+ _mqtt_settings.user .length ()
976
+ && _mqtt_settings.pass .length ();
977
+
978
+ const auto * user =
979
+ credentials
980
+ ? _mqtt_settings.user .c_str ()
981
+ : nullptr ;
982
+
983
+ const auto * pass =
984
+ credentials
985
+ ? _mqtt_settings.pass .c_str ()
986
+ : nullptr ;
987
+
988
+ if (credentials) {
989
+ DEBUG_MSG_P (PSTR (" [MQTT] Connecting as user %s\n " ), user);
990
+ }
991
+
962
992
#if MQTT_LIBRARY == MQTT_LIBRARY_ARDUINOMQTT
963
993
_mqtt.begin (_mqtt_settings.server .c_str (),
964
994
_mqtt_settings.port ,
@@ -967,32 +997,22 @@ bool _mqttConnectSyncClient(bool secure = false) {
967
997
_mqtt_payload_offline.c_str (),
968
998
_mqtt_settings.will_retain , _mqtt_settings.will_qos );
969
999
_mqtt.setKeepAlive (_mqtt_settings.keepalive .count ());
1000
+ _mqtt.setCleanSession (_mqtt_settings.clean_session );
970
1001
result = _mqtt.connect (
971
- _mqtt_settings.clientId .c_str (),
972
- _mqtt_settings.user .c_str (),
973
- _mqtt_settings.pass .c_str ());
1002
+ _mqtt_settings.client_id .c_str (), user, pass);
974
1003
#elif MQTT_LIBRARY == MQTT_LIBRARY_PUBSUBCLIENT
975
1004
_mqtt.setClient (_mqttGetClient (secure));
976
1005
_mqtt.setServer (_mqtt_settings.server .c_str (), _mqtt_settings.port );
977
1006
978
- if (_mqtt_settings.user .length () && _mqtt_settings.pass .length ()) {
979
- DEBUG_MSG_P (PSTR (" [MQTT] Connecting as user %s\n " ), _mqtt_settings.user .c_str ());
980
- result = _mqtt.connect (
981
- _mqtt_settings.clientId .c_str (),
982
- _mqtt_settings.user .c_str (),
983
- _mqtt_settings.pass .c_str (),
984
- _mqtt_settings.will_topic .c_str (),
985
- _mqtt_settings.will_qos ,
986
- _mqtt_settings.will_retain ,
987
- _mqtt_payload_offline.c_str ());
988
- } else {
989
- result = _mqtt.connect (
990
- _mqtt_settings.clientId .c_str (),
991
- _mqtt_settings.will_topic .c_str (),
992
- _mqtt_settings.will_qos ,
993
- _mqtt_settings.will_retain ,
994
- _mqtt_payload_offline.c_str ());
995
- }
1007
+ result = _mqtt.connect (
1008
+ _mqtt_settings.client_id .c_str (),
1009
+ user,
1010
+ pass,
1011
+ _mqtt_settings.will_topic .c_str (),
1012
+ _mqtt_settings.will_qos ,
1013
+ _mqtt_settings.will_retain ,
1014
+ _mqtt_payload_offline.c_str (),
1015
+ _mqtt_settings.clean_session );
996
1016
#endif
997
1017
998
1018
#if SECURE_CLIENT != SECURE_CLIENT_NONE
@@ -1162,7 +1182,7 @@ void _mqttConfigureImpl(bool reschedule) {
1162
1182
_mqttApplySetting (_mqtt_settings.pass ,
1163
1183
mqtt::settings::password ());
1164
1184
1165
- _mqttApplySetting (_mqtt_settings.clientId ,
1185
+ _mqttApplySetting (_mqtt_settings.client_id ,
1166
1186
placeholders.replace (mqtt::settings::clientId ()));
1167
1187
1168
1188
_mqttApplySetting (_mqtt_settings.qos ,
@@ -1171,6 +1191,8 @@ void _mqttConfigureImpl(bool reschedule) {
1171
1191
mqtt::settings::retain ());
1172
1192
_mqttApplySetting (_mqtt_settings.keepalive ,
1173
1193
mqtt::settings::keepalive ());
1194
+ _mqttApplySetting (_mqtt_settings.clean_session ,
1195
+ mqtt::settings::cleanSession ());
1174
1196
1175
1197
// Heartbeat messages that are supposed to be published when connected
1176
1198
_mqttApplySetting (_mqtt_heartbeat_mode,
0 commit comments