Mercurial > code > home > repos > homeauto
annotate espNode/desk/src/mqtt.cpp @ 1678:7831b5de3572
espNode checkpoint
author | drewp@bigasterisk.com |
---|---|
date | Mon, 27 Sep 2021 22:59:39 -0700 |
parents | 3ff074ba25f1 |
children |
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 } |
785
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
25 /* |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
26 |
785
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
27 Subscribed by MCU: |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
28 |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
29 fingerprint/command = |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
30 'enroll' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
31 | 'show_success' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
32 | 'clear_success' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
33 | 'delete_all' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
34 | 'delete/model/<fid>' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
35 | 'get/model/<fid>' |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
36 fingerprint/set/model/<fid> = binary model data |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
37 |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
38 Published from MCU: |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
39 |
1678 | 40 mode in {scan, enroll, download, setModel, deleteModel} |
41 | |
785
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
42 fingerprint/<mode>/status = junk |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
43 fingerprint/<mode>/error/<caller> = FPM error message |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
44 fingerprint/store = some change to fingerprint storage |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
45 fingerprint/detect = input finger |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
46 fingerprint/model/<fid> = binary model data |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
47 fingerprint/image/<fid> = binary image data |
1678 | 48 fingerprint/temperature = "%.3fC" |
785
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
49 */ |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
50 void Publish(const std::string& subtopic, const std::string& msg) { |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
51 std::string topic = "fingerprint/" + subtopic; |
785
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
52 mqttClient.publish(topic.c_str(), 1, /*retain=*/false, msg.data(), |
3ff074ba25f1
updates to mqtt message API; much more consistent logging
drewp@bigasterisk.com
parents:
784
diff
changeset
|
53 msg.size()); |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
54 } |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
55 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
56 void ConnectToMqtt() { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
57 Serial.println("Connecting to MQTT..."); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
58 mqttClient.connect(); |
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 SendTemperature() { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
62 float temp_c = temperatureRead(); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
63 char buf[20]; |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
64 snprintf(buf, sizeof(buf), "%.3fC", temp_c); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
65 mqttClient.publish("fingerprint/temperature", 1, /*retain=*/true, buf); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
66 } |
1678 | 67 |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
68 void onMqttConnect(bool sessionPresent) { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
69 Serial.println("Connected to MQTT."); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
70 Serial.print("Session present: "); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
71 Serial.println(sessionPresent); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
72 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
73 mqttClient.subscribe("fingerprint/command", 1); |
783
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
74 mqttClient.subscribe("fingerprint/set/#", 1); |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
75 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
76 SendTemperature(); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
77 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
78 mqttClient.setWill("fingerprint/status", 1, /*retain=*/true, "offline"); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
79 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
|
80 |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
81 Serial.println("queuing a blink change"); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
82 fingerprint::QueueBlinkConnected(); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
83 } |
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 void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
86 Serial.println("Disconnected from MQTT."); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
87 fingerprint::BlinkNotConnected(); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
88 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
89 if (wifi::IsConnected()) { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
90 xTimerStart(mqttReconnectTimer, 0); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
91 } |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
92 } |
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 void onMqttMessage(char* topic, char* payload, |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
95 AsyncMqttClientMessageProperties properties, size_t len, |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
96 size_t index, size_t total) { |
783
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
97 if (index == 0) { |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
98 incomingMessage.complete = false; |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
99 incomingMessage.topic = std::string(topic); |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
100 incomingMessage.payload.clear(); |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
101 } |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
102 |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
103 for (int i = 0; i < len; i++) { |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
104 incomingMessage.payload.push_back(payload[i]); |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
105 } |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
106 |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
107 if (index + len == total) { |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
108 incomingMessage.complete = true; |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
109 } |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
110 } |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
111 |
783
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
112 // 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
|
113 bool HasPendingMessage() { return incomingMessage.complete; } |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
114 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
|
115 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
|
116 incomingMessage.payload}; |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
117 incomingMessage.complete = false; |
e4cf795d3677
support download/set/delete, but somehow enroll has broken
drewp@bigasterisk.com
parents:
781
diff
changeset
|
118 return ret; |
781
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
119 } |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
120 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
121 void Setup() { |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
122 mqttReconnectTimer = |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
123 xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
124 reinterpret_cast<TimerCallbackFunction_t>(ConnectToMqtt)); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
125 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
126 mqttClient.onConnect(onMqttConnect); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
127 mqttClient.onDisconnect(onMqttDisconnect); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
128 mqttClient.onMessage(onMqttMessage); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
129 mqttClient.setServer(MQTT_HOST, MQTT_PORT); |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
130 } |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
131 |
6c42c1f64f00
new driver for esp32 and R503 fingerprint sensor
drewp@bigasterisk.com
parents:
diff
changeset
|
132 } // namespace mqtt |