Skip to content

Commit 737e76a

Browse files
committed
mqtt: clean session flag
1 parent 3b6f0a5 commit 737e76a

File tree

2 files changed

+66
-32
lines changed

2 files changed

+66
-32
lines changed

code/espurna/config/general.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@
10261026
#endif
10271027

10281028
#ifndef MQTT_RETAIN
1029-
#define MQTT_RETAIN true // MQTT retain flag
1029+
#define MQTT_RETAIN 1 // MQTT retain flag
10301030
#endif
10311031

10321032
#ifndef MQTT_QOS
@@ -1036,7 +1036,19 @@
10361036
#endif
10371037

10381038
#ifndef MQTT_KEEPALIVE
1039-
#define MQTT_KEEPALIVE 120 // MQTT keep-alive interval (in seconds). 2 minutes by default. Cannot be zero.
1039+
#define MQTT_KEEPALIVE 120 // MQTT Keep Alive time, in seconds.
1040+
// Maximum amount of time without any communication between the server and the client before closing the connection.
1041+
// From client side, handled internally by counting amount of time between control packets and / or PINGREQ & PINGRESP.
1042+
// From server side, depends on the implementation (usually, also adds +50% of the original value)
1043+
// 2 minutes by default. Can be zero. Small values 1..5 *may* not be handled properly.
1044+
#endif
1045+
1046+
#ifndef MQTT_CLEAN_SESSION
1047+
#define MQTT_CLEAN_SESSION 0 // MQTT Clean Session flag.
1048+
// When disabled, server is expected to persist subscriptions and not-yet-delivered messages w/ QoS > 0 for the specified Client Id.
1049+
// (and *may* also store messages w/ QoS == 0, depends on the implementation)
1050+
// When enabled, any previously stored session data is discarded.
1051+
// Disabled by default.
10401052
#endif
10411053

10421054
#ifndef MQTT_SKIP_TIME

code/espurna/mqtt.cpp

+52-30
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,10 @@ constexpr KeepAlive keepalive() {
203203
static_assert(keepalive() >= KeepaliveMin, "");
204204
static_assert(keepalive() <= KeepaliveMax, "");
205205

206+
constexpr bool cleanSession() {
207+
return 1 == MQTT_CLEAN_SESSION;
208+
}
209+
206210
STRING_VIEW_INLINE(TopicWill, MQTT_TOPIC_STATUS);
207211

208212
constexpr int willQoS() {
@@ -272,6 +276,7 @@ STRING_VIEW_INLINE(Password, "mqttPassword");
272276
STRING_VIEW_INLINE(QoS, "mqttQoS");
273277
STRING_VIEW_INLINE(Retain, "mqttRetain");
274278
STRING_VIEW_INLINE(Keepalive, "mqttKeep");
279+
STRING_VIEW_INLINE(CleanSession, "mqttClean");
275280
STRING_VIEW_INLINE(ClientId, "mqttClientID");
276281
STRING_VIEW_INLINE(TopicWill, "mqttWill");
277282
STRING_VIEW_INLINE(WillQoS, "mqttWillQoS");
@@ -350,6 +355,10 @@ espurna::mqtt::KeepAlive keepalive() {
350355
build::KeepaliveMin, build::KeepaliveMax);
351356
}
352357

358+
bool cleanSession() {
359+
return getSetting(keys::CleanSession, build::cleanSession());
360+
}
361+
353362
String clientId() {
354363
return getSetting(keys::ClientId, systemIdentifier());
355364
}
@@ -435,18 +444,19 @@ String NAME () {\
435444
}
436445

437446
EXACT_VALUE(autoconnect, settings::autoconnect)
447+
EXACT_VALUE(cleanSession, settings::cleanSession)
438448
EXACT_VALUE(enabled, settings::enabled)
439449
EXACT_VALUE(heartbeatInterval, settings::heartbeatInterval)
440450
EXACT_VALUE(heartbeatMode, settings::heartbeatMode)
441451
EXACT_VALUE(json, settings::json)
442452
EXACT_VALUE(keepalive, settings::keepalive)
443453
EXACT_VALUE(port, settings::port)
444454
EXACT_VALUE(qos, settings::qos)
445-
EXACT_VALUE(willQoS, settings::willQoS)
446-
EXACT_VALUE(willRetain, settings::willRetain)
447455
EXACT_VALUE(retain, settings::retain)
448-
EXACT_VALUE(skipTime, settings::skipTime)
449456
EXACT_VALUE(settings, settings::settings)
457+
EXACT_VALUE(skipTime, settings::skipTime)
458+
EXACT_VALUE(willQoS, settings::willQoS)
459+
EXACT_VALUE(willRetain, settings::willRetain)
450460

451461
#undef EXACT_VALUE
452462

@@ -461,10 +471,11 @@ static constexpr espurna::settings::query::Setting Settings[] PROGMEM {
461471
{keys::WillRetain, internal::willRetain},
462472
{keys::PayloadOffline, settings::payloadOffline},
463473
{keys::PayloadOnline, settings::payloadOnline},
464-
{keys::QoS, internal::qos},
465474
{keys::Retain, internal::retain},
466-
{keys::ClientId, settings::clientId},
475+
{keys::QoS, internal::qos},
467476
{keys::Keepalive, internal::keepalive},
477+
{keys::CleanSession, internal::cleanSession},
478+
{keys::ClientId, settings::clientId},
468479
{keys::User, settings::user},
469480
{keys::Password, settings::password},
470481
{keys::Topic, settings::topic},
@@ -632,11 +643,12 @@ struct MqttConnectionSettings {
632643
String server;
633644
uint16_t port{};
634645

635-
String clientId;
646+
String client_id;
636647

637648
bool retain { mqtt::build::retain() };
638649
int qos { mqtt::build::qos() };
639650
espurna::mqtt::KeepAlive keepalive { mqtt::build::keepalive() };
651+
bool clean_session { mqtt::build::cleanSession() };
640652

641653
String topic;
642654
String user;
@@ -904,9 +916,9 @@ namespace {
904916

905917
void _mqttSetupAsyncClient(bool secure = false) {
906918
_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());
908920
_mqtt.setKeepAlive(_mqtt_settings.keepalive.count());
909-
_mqtt.setCleanSession(false);
921+
_mqtt.setCleanSession(_mqtt_settings.clean_session);
910922

911923
_mqtt.setWill(
912924
_mqtt_settings.will_topic.c_str(),
@@ -959,6 +971,24 @@ bool _mqttSetupSyncClient(bool secure = false) {
959971
bool _mqttConnectSyncClient(bool secure = false) {
960972
bool result = false;
961973

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+
962992
#if MQTT_LIBRARY == MQTT_LIBRARY_ARDUINOMQTT
963993
_mqtt.begin(_mqtt_settings.server.c_str(),
964994
_mqtt_settings.port,
@@ -967,32 +997,22 @@ bool _mqttConnectSyncClient(bool secure = false) {
967997
_mqtt_payload_offline.c_str(),
968998
_mqtt_settings.will_retain, _mqtt_settings.will_qos);
969999
_mqtt.setKeepAlive(_mqtt_settings.keepalive.count());
1000+
_mqtt.setCleanSession(_mqtt_settings.clean_session);
9701001
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);
9741003
#elif MQTT_LIBRARY == MQTT_LIBRARY_PUBSUBCLIENT
9751004
_mqtt.setClient(_mqttGetClient(secure));
9761005
_mqtt.setServer(_mqtt_settings.server.c_str(), _mqtt_settings.port);
9771006

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);
9961016
#endif
9971017

9981018
#if SECURE_CLIENT != SECURE_CLIENT_NONE
@@ -1162,7 +1182,7 @@ void _mqttConfigureImpl(bool reschedule) {
11621182
_mqttApplySetting(_mqtt_settings.pass,
11631183
mqtt::settings::password());
11641184

1165-
_mqttApplySetting(_mqtt_settings.clientId,
1185+
_mqttApplySetting(_mqtt_settings.client_id,
11661186
placeholders.replace(mqtt::settings::clientId()));
11671187

11681188
_mqttApplySetting(_mqtt_settings.qos,
@@ -1171,6 +1191,8 @@ void _mqttConfigureImpl(bool reschedule) {
11711191
mqtt::settings::retain());
11721192
_mqttApplySetting(_mqtt_settings.keepalive,
11731193
mqtt::settings::keepalive());
1194+
_mqttApplySetting(_mqtt_settings.clean_session,
1195+
mqtt::settings::cleanSession());
11741196

11751197
// Heartbeat messages that are supposed to be published when connected
11761198
_mqttApplySetting(_mqtt_heartbeat_mode,

0 commit comments

Comments
 (0)