annotate espNode/desk/src/mqtt.cpp @ 784:415d7853ad45

fix enroll slot bug; try to log better
author drewp@bigasterisk.com
date Thu, 27 Aug 2020 23:54:11 -0700
parents e4cf795d3677
children 3ff074ba25f1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
1 #include "mqtt.h"
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
2
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
3 #include "config.h"
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
4 #include "fingerprint.h"
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
5 #include "wifi.h"
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
6
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
7 namespace mqtt {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
8 AsyncMqttClient mqttClient;
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
9 TimerHandle_t mqttReconnectTimer;
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
10
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
11 #define MAX_INCOMING_PAYLOAD 1536
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
12 class IncomingMessage {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
13 public:
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
14 bool complete;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
15 std::string topic;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
16 std::vector<byte> payload;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
17 };
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
18 IncomingMessage incomingMessage;
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
19
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
20 void StopTimer() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
21 xTimerStop(mqttReconnectTimer,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
22 0); // ensure we don't reconnect to MQTT while reconnecting
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
23 // to Wi-Fi
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
24 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
25
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
26 void Publish(std::string subtopic, std::string msg) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
27 std::string topic = "fingerprint/" + subtopic;
784
415d7853ad45 fix enroll slot bug; try to log better
drewp@bigasterisk.com
parents: 783
diff changeset
28 mqttClient.publish(topic.c_str(), 1, /*retain=*/false, msg.data(), msg.size());
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
29 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
30
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
31 void ConnectToMqtt() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
32 Serial.println("Connecting to MQTT...");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
33 mqttClient.connect();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
34 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
35
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
36 void SendTemperature() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
37 float temp_c = temperatureRead();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
38 char buf[20];
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
39 snprintf(buf, sizeof(buf), "%.3fC", temp_c);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
40 mqttClient.publish("fingerprint/temperature", 1, /*retain=*/true, buf);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
41 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
42 void onMqttConnect(bool sessionPresent) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
43 Serial.println("Connected to MQTT.");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
44 Serial.print("Session present: ");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
45 Serial.println(sessionPresent);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
46
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
47 mqttClient.subscribe("fingerprint/command", 1);
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
48 mqttClient.subscribe("fingerprint/set/#", 1);
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
49
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
50 SendTemperature();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
51
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
52 mqttClient.setWill("fingerprint/status", 1, /*retain=*/true, "offline");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
53 mqttClient.publish("fingerprint/status", 1, /*retain=*/true, "online");
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
54
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
55 Serial.println("queuing a blink change");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
56 fingerprint::QueueBlinkConnected();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
57 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
58
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
59 void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
60 Serial.println("Disconnected from MQTT.");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
61 fingerprint::BlinkNotConnected();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
62
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
63 if (wifi::IsConnected()) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
64 xTimerStart(mqttReconnectTimer, 0);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
65 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
66 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
67
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
68 void onMqttMessage(char* topic, char* payload,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
69 AsyncMqttClientMessageProperties properties, size_t len,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
70 size_t index, size_t total) {
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
71 if (index == 0) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
72 incomingMessage.complete = false;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
73 incomingMessage.topic = std::string(topic);
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
74 incomingMessage.payload.clear();
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
75 }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
76
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
77 for (int i = 0; i < len; i++) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
78 incomingMessage.payload.push_back(payload[i]);
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
79 }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
80
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
81 if (index + len == total) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
82 incomingMessage.complete = true;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
83 }
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
84 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
85
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
86 // Don't do command right away; wait for main loop to ask for it.
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
87 bool HasPendingMessage() { return incomingMessage.complete; }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
88 std::pair<std::string, std::vector<byte>> PopPendingMessage() {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
89 std::pair<std::string, std::vector<byte>> ret{incomingMessage.topic,
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
90 incomingMessage.payload};
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
91 incomingMessage.complete = false;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
92 return ret;
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
93 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
94
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
95 void Setup() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
96 mqttReconnectTimer =
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
97 xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
98 reinterpret_cast<TimerCallbackFunction_t>(ConnectToMqtt));
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
99
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
100 mqttClient.onConnect(onMqttConnect);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
101 mqttClient.onDisconnect(onMqttDisconnect);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
102 mqttClient.onMessage(onMqttMessage);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
103 mqttClient.setServer(MQTT_HOST, MQTT_PORT);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
104 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
105
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
106 } // namespace mqtt