Skip to content

Commit 03e095b

Browse files
committed
MQTT Last Will and Testament
Register a message with the MQTT broker to publish if the client loses connection. Also publish online/offline status - all to a `status` topic. avoid global variable
1 parent 15c5c83 commit 03e095b

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

Diff for: RX_FSK/src/conn-mqtt.cpp

+21-8
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ TimerHandle_t mqttReconnectTimer;
3737
extern t_wifi_state wifi_state;
3838
char time_str[32];
3939

40-
4140
/* Global initalization (on TTGO startup) */
4241
void MQTT::init() {
4342
}
@@ -70,10 +69,16 @@ void MQTT::netsetup() {
7069
if (strlen(sonde.config.mqtt.password) > 0) {
7170
mqttClient.setCredentials(sonde.config.mqtt.username, sonde.config.mqtt.password);
7271
}
72+
73+
char lwt[128];
74+
snprintf(lwt, sizeof(lwt), "%sstatus", sonde.config.mqtt.prefix);
75+
mqttClient.setWill(lwt, MQTT_QOS, MQTT_RETAIN_TRUE, "lost connection");
76+
7377
MQTT::connectToMqtt();
7478
}
7579

7680
void MQTT::netshutdown() {
81+
publishLwt("offline");
7782
mqttClient.disconnect(false); // nice shutdown....
7883
delay(200);
7984
mqttClient.disconnect(true); // force
@@ -91,6 +96,7 @@ void MQTT::updateStation( PosInfo *pi ) {
9196
unsigned long now = millis();
9297
if ( (lastMqttUptime == 0) || (now - lastMqttUptime >= sonde.config.mqtt.report_interval) ) {
9398
MQTT::connectToMqtt();
99+
publishLwt("online");
94100
publishUptime();
95101
publishPmuInfo();
96102
publishGps();
@@ -106,6 +112,12 @@ int MQTT::mqttGate(uint flag){
106112
return ((sonde.config.mqtt.active & flag) && mqttClient.connected());
107113
}
108114

115+
void MQTT::publishLwt(const char *message) {
116+
char lwt[128];
117+
snprintf(lwt, sizeof(lwt), "%sstatus", sonde.config.mqtt.prefix);
118+
mqttClient.publish(lwt, MQTT_QOS, MQTT_RETAIN_TRUE, message);
119+
}
120+
109121
int MQTT::connectToMqtt() {
110122
if(mqttClient.connected())
111123
return 1;
@@ -115,6 +127,7 @@ int MQTT::connectToMqtt() {
115127
return 0;
116128
LOG_D(TAG, "MQTT not connected, connecting....");
117129
mqttClient.connect();
130+
publishLwt("online");
118131
return 1;
119132
}
120133

@@ -160,7 +173,7 @@ void MQTT::publishUptime()
160173
LOG_D(TAG, "publishUptime: sending %s\n", payload);
161174
char topic[128];
162175
snprintf(topic, 128, "%s%s", sonde.config.mqtt.prefix, "uptime");
163-
mqttClient.publish(topic, 1, 1, payload);
176+
mqttClient.publish(topic, MQTT_QOS, MQTT_RETAIN_TRUE, payload);
164177
}
165178

166179
void MQTT::publishPmuInfo()
@@ -187,7 +200,7 @@ void MQTT::publishPmuInfo()
187200

188201
char topic[128];
189202
snprintf(topic, sizeof(topic), "%s%s", sonde.config.mqtt.prefix, "pmu");
190-
mqttClient.publish(topic, 1, 1, payload);
203+
mqttClient.publish(topic, MQTT_QOS, MQTT_RETAIN_TRUE, payload);
191204
}
192205

193206

@@ -209,7 +222,7 @@ void MQTT::publishGps()
209222

210223
char topic[128];
211224
snprintf(topic, sizeof(topic), "%s%s", sonde.config.mqtt.prefix, "gps");
212-
mqttClient.publish(topic, 1, 1, payload);
225+
mqttClient.publish(topic, MQTT_QOS, MQTT_RETAIN_TRUE, payload);
213226
}
214227

215228

@@ -225,7 +238,7 @@ void MQTT::publishPeak(double pf, int rssi)
225238

226239
char topic[128];
227240
snprintf(topic, sizeof(topic), "%s%s", sonde.config.mqtt.prefix, "spectrum");
228-
mqttClient.publish(topic, 1, /* retain */ false, payload);
241+
mqttClient.publish(topic, MQTT_QOS_NONE, MQTT_RETAIN_FALSE, payload);
229242
}
230243

231244
// What's the scanner looking at?
@@ -243,7 +256,7 @@ void MQTT::publishQRG(int num, const char* type, char* launchsite, float mhz)
243256

244257
char topic[128];
245258
snprintf(topic, sizeof(topic), "%s%s", sonde.config.mqtt.prefix, "qrg");
246-
mqttClient.publish(topic, 1, /*retain*/ false, payload);
259+
mqttClient.publish(topic, MQTT_QOS_NONE, MQTT_RETAIN_FALSE, payload);
247260
}
248261

249262

@@ -257,7 +270,7 @@ void MQTT::publishDebug(char *debugmsg)
257270
snprintf(payload, 256, "{\"msg\": %s}", debugmsg);
258271
char topic[128];
259272
snprintf(topic, sizeof(topic), "%s%s", sonde.config.mqtt.prefix, "debug");
260-
mqttClient.publish(topic, 1, /*retain*/ false, payload);
273+
mqttClient.publish(topic, MQTT_QOS_NONE, MQTT_RETAIN_FALSE, payload);
261274
}
262275

263276
void MQTT::publishPacket(SondeInfo *si)
@@ -279,7 +292,7 @@ void MQTT::publishPacket(SondeInfo *si)
279292
char topic[128];
280293
snprintf(topic, 128, "%s%s", sonde.config.mqtt.prefix, "packet");
281294
LOG_D(TAG, "publishPacket: %s\n", payload);
282-
mqttClient.publish(topic, 1, 1, payload);
295+
mqttClient.publish(topic, MQTT_QOS, MQTT_RETAIN_TRUE, payload);
283296
}
284297

285298
String MQTT::getStatus() {

Diff for: RX_FSK/src/conn-mqtt.h

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
#define MQTT_SEND_DEBUG 0x80
1818
#define MQTT_SEND_ANY (MQTT_SEND_UPTIME|MQTT_SEND_SONDE|MQTT_SEND_PMU|MQTT_SEND_GPS|MQTT_SEND_RFINFO|MQTT_SEND_DEBUG)
1919

20+
#define MQTT_QOS_NONE 0
21+
#define MQTT_QOS 1
22+
#define MQTT_RETAIN_TRUE true
23+
#define MQTT_RETAIN_FALSE false
24+
2025
class MQTT : public Conn
2126
{
2227
public:
@@ -62,6 +67,7 @@ class MQTT : public Conn
6267
void publishUptime();
6368
void publishPmuInfo();
6469
void publishGps();
70+
void publishLwt(const char *message);
6571
void timeFormat();
6672
int mqttGate(uint flag);
6773
int connectToMqtt();

0 commit comments

Comments
 (0)