annotate espNode/desk/src/mqtt.cpp @ 783:e4cf795d3677

support download/set/delete, but somehow enroll has broken
author drewp@bigasterisk.com
date Wed, 26 Aug 2020 03:06:07 -0700
parents 6c42c1f64f00
children 415d7853ad45
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;
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
28 mqttClient.publish(topic.c_str(), 1, /*retain=*/false, msg.data(),
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
29 msg.size());
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
30 // yield();
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
31 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
32
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
33 void ConnectToMqtt() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
34 Serial.println("Connecting to MQTT...");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
35 mqttClient.connect();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
36 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
37
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
38 void SendTemperature() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
39 float temp_c = temperatureRead();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
40 char buf[20];
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
41 snprintf(buf, sizeof(buf), "%.3fC", temp_c);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
42 mqttClient.publish("fingerprint/temperature", 1, /*retain=*/true, buf);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
43 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
44 void onMqttConnect(bool sessionPresent) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
45 Serial.println("Connected to MQTT.");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
46 Serial.print("Session present: ");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
47 Serial.println(sessionPresent);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
48
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
49 mqttClient.subscribe("fingerprint/command", 1);
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
50 mqttClient.subscribe("fingerprint/set/#", 1);
781
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 SendTemperature();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
53
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
54 mqttClient.setWill("fingerprint/status", 1, /*retain=*/true, "offline");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
55 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
56
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
57 Serial.println("queuing a blink change");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
58 fingerprint::QueueBlinkConnected();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
59 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
60
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
61 void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
62 Serial.println("Disconnected from MQTT.");
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
63 fingerprint::BlinkNotConnected();
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
64
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
65 if (wifi::IsConnected()) {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
66 xTimerStart(mqttReconnectTimer, 0);
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 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
69
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
70 void onMqttMessage(char* topic, char* payload,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
71 AsyncMqttClientMessageProperties properties, size_t len,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
72 size_t index, size_t total) {
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
73 if (index == 0) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
74 incomingMessage.complete = false;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
75 incomingMessage.topic = std::string(topic);
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
76 incomingMessage.payload.clear();
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
77 }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
78
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
79 for (int i = 0; i < len; i++) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
80 incomingMessage.payload.push_back(payload[i]);
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
81 }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
82
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
83 if (index + len == total) {
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
84 incomingMessage.complete = true;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
85 }
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
86 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
87
783
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
88 // 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
89 bool HasPendingMessage() { return incomingMessage.complete; }
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
90 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
91 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
92 incomingMessage.payload};
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
93 incomingMessage.complete = false;
e4cf795d3677 support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents: 781
diff changeset
94 return ret;
781
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
95 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
96
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
97 void Setup() {
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
98 mqttReconnectTimer =
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
99 xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0,
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
100 reinterpret_cast<TimerCallbackFunction_t>(ConnectToMqtt));
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
101
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
102 mqttClient.onConnect(onMqttConnect);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
103 mqttClient.onDisconnect(onMqttDisconnect);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
104 mqttClient.onMessage(onMqttMessage);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
105 mqttClient.setServer(MQTT_HOST, MQTT_PORT);
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
106 }
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
107
6c42c1f64f00 new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff changeset
108 } // namespace mqtt