Mercurial > code > home > repos > homeauto
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 |
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 |