diff --git a/ESP32-mqtt-room.ino b/ESP32-mqtt-room.ino index 2522b5d..a47d49f 100644 --- a/ESP32-mqtt-room.ino +++ b/ESP32-mqtt-room.ino @@ -10,12 +10,17 @@ Ported to Arduino ESP32 by Evandro Copercini */ #include -#include -#include +extern "C" { + #include "freertos/FreeRTOS.h" + #include "freertos/timers.h" +} +#include #include #include #include #include +#include +#include #include "BLEBeacon.h" #include "BLEEddystoneTLM.h" #include "BLEEddystoneURL.h" @@ -29,7 +34,9 @@ uint16_t beconUUID = 0xFEAA; #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00)>>8) + (((x)&0xFF)<<8)) WiFiClient espClient; -PubSubClient client(espClient); +AsyncMqttClient mqttClient; +TimerHandle_t mqttReconnectTimer; +TimerHandle_t wifiReconnectTimer; TaskHandle_t CoreZeroTask; @@ -82,21 +89,61 @@ float calculateDistance(int rssi, int txPower) { } -void reconnect() { - while (!client.connected()) { - Serial.print("Attempting MQTT connection..."); +void connectToWifi() { + Serial.println("Connecting to WiFi..."); + WiFi.begin(ssid, password); + WiFi.setHostname(hostname); +} - if (client.connect(uint64_to_string(ESP.getEfuseMac()), mqttUser, mqttPassword )) { - Serial.print("connected with client id "); - Serial.println(uint64_to_string(ESP.getEfuseMac())); - } else { - Serial.print("failed, rc="); - Serial.print(client.state()); - Serial.println(" try again in 5 seconds"); - // Wait 5 seconds before retrying - delay(5000); +void connectToMqtt() { + Serial.println("Connecting to MQTT"); + mqttClient.setCredentials(mqttUser, mqttPassword); + mqttClient.connect(); +} + +void WiFiEvent(WiFiEvent_t event) { + Serial.printf("[WiFi-event] event: %d\n", event); + switch(event) { + case SYSTEM_EVENT_STA_GOT_IP: + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + connectToMqtt(); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + Serial.println("WiFi lost connection"); + xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi + xTimerStart(wifiReconnectTimer, 0); + break; } +} + +void onMqttConnect(bool sessionPresent) { + Serial.println("Connected to MQTT."); + Serial.print("Session present: "); + Serial.println(sessionPresent); + + String publishTopic = String(channel) + "/" + room; + if (mqttClient.publish((char *)publishTopic.c_str(), 0, 0, "Hello from ESP32") == true) { + Serial.println("Success sending message to topic"); + } else { + Serial.println("Error sending message"); } + +} + +void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { + Serial.println("Disconnected from MQTT."); + + if (WiFi.isConnected()) { + xTimerStart(mqttReconnectTimer, 0); + } +} + +void onMqttPublish(uint16_t packetId) { + Serial.println("Publish acknowledged."); + Serial.print(" packetId: "); + Serial.println(packetId); } class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { @@ -227,7 +274,7 @@ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { String publishTopic = String(channel) + "/" + room; - if (client.publish((char *)publishTopic.c_str(), JSONmessageBuffer) == true) { + if (mqttClient.publish((char *)publishTopic.c_str(), 0, 0, JSONmessageBuffer) == true) { Serial.print("Success sending message to topic: "); Serial.println(publishTopic); // Serial.print("Message: "); Serial.println(JSONmessageBuffer); @@ -256,46 +303,36 @@ void createTaskOnCoreZero() { void setup() { + Serial.begin(115200); + + mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToMqtt)); + wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast(connectToWifi)); + + WiFi.onEvent(WiFiEvent); + + mqttClient.onConnect(onMqttConnect); + mqttClient.onDisconnect(onMqttDisconnect); + + mqttClient.onPublish(onMqttPublish); + mqttClient.setServer(mqttHost, mqttPort); + + connectToWifi(); + createTaskOnCoreZero(); - WiFi.begin(ssid, password); - WiFi.setHostname(hostname); - - Serial.print("Connecting to WiFi.."); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - - Serial.println(); - Serial.print("Connected to the WiFi network as "); - Serial.println(hostname); - - client.setServer(mqttServer, mqttPort); - reconnect(); - - String publishTopic = String(channel) + "/" + room; - if (client.publish((char *)publishTopic.c_str(), "Hello from ESP32") == true) { - Serial.println("Success sending message to topic"); - } else { - Serial.println("Error sending message"); - } - BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); //create new scan pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster + } unsigned long last = 0; void loop() { - if (!client.connected()) { - reconnect(); - } - // vTaskDelay(10); // watchdog timer + vTaskDelay(10); // watchdog timer if (millis() - last > (waitTime * 1000) || last == 0) { Serial.println("Scanning..."); @@ -304,8 +341,6 @@ void loop() { last = millis(); } - - } char *uint64_to_string(uint64_t input) { diff --git a/Settings.h b/Settings.h index 7b74977..8f4c68f 100644 --- a/Settings.h +++ b/Settings.h @@ -7,8 +7,8 @@ //Replace with a human-friendly host name. #define hostname "esp32_room_presence" -//Replace with your MQTT Broker address; example: #define mqttServer "192.168.0.112" -#define mqttServer "$MQTT_BROKER_ADDRESS$" +//Replace with your MQTT Broker address; example: #define mqttHost IPAddress(192, 168, 1, 195) +#define mqttHost IPAddress(192, 168, 1, 195) //Replace with your MQTT Broker port; example: #define mqttPort 1883 #define mqttPort $MQTT_PORT$ diff --git a/Settings_CI.h b/Settings_CI.h index e7084af..e847eb4 100644 --- a/Settings_CI.h +++ b/Settings_CI.h @@ -1,7 +1,7 @@ #define ssid "Travis" #define password "123456789" #define hostname "esp32_room_presence" -#define mqttServer "192.168.1.1" +#define mqttHost IPAddress(192, 168, 1, 195) #define mqttPort 1883 #define mqttUser "homeassistant" #define mqttPassword "123456789" diff --git a/lib/BLEEddystoneTLM/BLEEddystoneTLM.cpp b/lib/BLEEddystoneTLM/BLEEddystoneTLM.cpp index 2fa1e03..c944a29 100644 --- a/lib/BLEEddystoneTLM/BLEEddystoneTLM.cpp +++ b/lib/BLEEddystoneTLM/BLEEddystoneTLM.cpp @@ -3,6 +3,7 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * See original repository at https://github.com/pcbreflux/espressif/tree/master/esp32/arduino/sketchbook/ESP32_BLE_beaconscan */ #include "Arduino.h" #include "sdkconfig.h" @@ -57,27 +58,27 @@ std::string BLEEddystoneTLM::toString() { std::string out = ""; String buff; uint32_t rawsec; - + out += "Version "; buff = String(m_eddystoneData.version, DEC); out += buff.c_str(); out += "\n"; - + out += "Battery Voltage "; buff = String(ENDIAN_CHANGE_U16(m_eddystoneData.volt), DEC); out += buff.c_str(); out += " mV\n"; - + out += "Temperature "; buff = String((float)m_eddystoneData.temp, 1); out += buff.c_str(); out += " °C\n"; - + out += "Adv. Count "; buff = String(ENDIAN_CHANGE_U32(m_eddystoneData.advCount), DEC); out += buff.c_str(); out += "\n"; - + out += "Time "; rawsec = ENDIAN_CHANGE_U32(m_eddystoneData.tmil); buff = "0000"+String(rawsec/864000, DEC); diff --git a/lib/BLEEddystoneTLM/BLEEddystoneTLM.h b/lib/BLEEddystoneTLM/BLEEddystoneTLM.h index de65d6f..94327a3 100644 --- a/lib/BLEEddystoneTLM/BLEEddystoneTLM.h +++ b/lib/BLEEddystoneTLM/BLEEddystoneTLM.h @@ -3,6 +3,7 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * See original repository at https://github.com/pcbreflux/espressif/tree/master/esp32/arduino/sketchbook/ESP32_BLE_beaconscan */ #ifndef _BLEEddystoneTLM_H_ diff --git a/lib/BLEEddystoneURL/BLEEddystoneURL.cpp b/lib/BLEEddystoneURL/BLEEddystoneURL.cpp index ceb4f7a..19f02fa 100644 --- a/lib/BLEEddystoneURL/BLEEddystoneURL.cpp +++ b/lib/BLEEddystoneURL/BLEEddystoneURL.cpp @@ -3,6 +3,7 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * See original repository at https://github.com/pcbreflux/espressif/tree/master/esp32/arduino/sketchbook/ESP32_BLE_beaconscan */ #include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) diff --git a/lib/BLEEddystoneURL/BLEEddystoneURL.h b/lib/BLEEddystoneURL/BLEEddystoneURL.h index 764fdac..3ce4632 100644 --- a/lib/BLEEddystoneURL/BLEEddystoneURL.h +++ b/lib/BLEEddystoneURL/BLEEddystoneURL.h @@ -3,6 +3,7 @@ * * Created on: Mar 12, 2018 * Author: pcbreflux + * See original repository at https://github.com/pcbreflux/espressif/tree/master/esp32/arduino/sketchbook/ESP32_BLE_beaconscan */ #ifndef _BLEEddystoneURL_H_ diff --git a/platformio.ini b/platformio.ini index 6d80167..16b478e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,6 +15,6 @@ src_dir = . platform = espressif32 framework = arduino board = esp32dev -lib_deps = PubSubClient@2.6.0, ArduinoJSON@5.13.2, ESP32 BLE Arduino, AsyncMqttClient@0.8.2, AsyncTCP@1.0.1 +lib_deps = ArduinoJSON@5.13.2, ESP32 BLE Arduino, AsyncMqttClient@0.8.2, AsyncTCP@1.0.1 board_build.partitions = partitions_singleapp.csv upload_port = COM13