OMOTE/Platformio/hardware/ESP32/mqtt_hal_esp32.cpp

160 lines
5.0 KiB
C++

#include "WiFi.h"
#include <PubSubClient.h>
#include "mqtt_hal_esp32.h"
#include "secrets.h"
#if (ENABLE_WIFI_AND_MQTT == 1)
WiFiClient espClient;
PubSubClient mqttClient(espClient);
bool isWifiConnected = false;
tAnnounceWiFiconnected_cb thisAnnounceWiFiconnected_cb = NULL;
void set_announceWiFiconnected_cb_HAL(tAnnounceWiFiconnected_cb pAnnounceWiFiconnected_cb) {
thisAnnounceWiFiconnected_cb = pAnnounceWiFiconnected_cb;
}
tAnnounceSubscribedTopics_cb thisAnnounceSubscribedTopics_cb = NULL;
void set_announceSubscribedTopics_cb_HAL(tAnnounceSubscribedTopics_cb pAnnounceSubscribedTopics_cb) {
thisAnnounceSubscribedTopics_cb = pAnnounceSubscribedTopics_cb;
}
bool getIsWifiConnected_HAL() {
return isWifiConnected;
}
// WiFi status event
void WiFiEvent(WiFiEvent_t event){
//Serial.printf("[WiFi-event] event: %d\r\n", event);
if(event == ARDUINO_EVENT_WIFI_STA_GOT_IP){
// connection to MQTT server will be done in checkMQTTconnection()
// mqttClient.setServer(MQTT_SERVER, 1883); // MQTT initialization
// mqttClient.connect("OMOTE"); // Connect using a client id
}
// Set status bar icon based on WiFi status
if (event == ARDUINO_EVENT_WIFI_STA_GOT_IP || event == ARDUINO_EVENT_WIFI_STA_GOT_IP6) {
isWifiConnected = true;
thisAnnounceWiFiconnected_cb(true);
Serial.printf("WiFi connected, IP address: %s\r\n", WiFi.localIP().toString().c_str());
} else if (event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) {
isWifiConnected = false;
thisAnnounceWiFiconnected_cb(false);
// automatically try to reconnect
Serial.printf("WiFi got disconnected. Will try to reconnect.\r\n");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
} else {
// e.g. ARDUINO_EVENT_WIFI_STA_CONNECTED or many others
// connected is not enough, will wait for IP
isWifiConnected = false;
thisAnnounceWiFiconnected_cb(false);
}
}
void init_mqtt_HAL(void) {
// Setup WiFi
WiFi.setHostname("OMOTE"); //define hostname
WiFi.onEvent(WiFiEvent);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
WiFi.setSleep(true);
}
std::string subscribeTopicOMOTEtest = "OMOTE/test";
void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
std::string topicReceived(topic);
std::string strPayload(reinterpret_cast<const char *>(payload), length);
if (topicReceived == subscribeTopicOMOTEtest) {
Serial.printf("MQTT: received topic %s with payload %s\r\n", subscribeTopicOMOTEtest.c_str(), strPayload.c_str());
}
thisAnnounceSubscribedTopics_cb(topicReceived, strPayload);
}
void mqtt_subscribeTopics() {
mqttClient.setCallback(&callback);
mqttClient.subscribe(subscribeTopicOMOTEtest.c_str());
Serial.printf(" Successfully subscribed to MQTT topic %s\r\n", subscribeTopicOMOTEtest.c_str());
}
bool checkMQTTconnection() {
if (WiFi.isConnected()) {
if (mqttClient.connected()) {
return true;
} else {
// try to connect to mqtt server
mqttClient.setBufferSize(512); // default is 256
//mqttClient.setKeepAlive(15); // default is 15 Client will send MQTTPINGREQ to keep connection alive
//mqttClient.setSocketTimeout(15); // default is 15 This determines how long the client will wait for incoming data when it expects data to arrive - for example, whilst it is in the middle of reading an MQTT packet.
mqttClient.setServer(MQTT_SERVER, MQTT_SERVER_PORT); // MQTT initialization
std::string mqttClientName = std::string(MQTT_CLIENTNAME) + "_esp32_" + std::string(WiFi.macAddress().c_str());
if (mqttClient.connect(mqttClientName.c_str(), MQTT_USER, MQTT_PASS)) {
Serial.printf(" Successfully connected to MQTT broker\r\n");
mqtt_subscribeTopics();
} else {
Serial.printf(" MQTT connection failed (but WiFi is available). Will try later ...\r\n");
}
return mqttClient.connected();
}
} else {
// Serial.printf(" No connection to MQTT server, because WiFi ist not connected.\r\n");
return false;
}
}
unsigned long reconnectInterval = 100;
// in order to do reconnect immediately ...
unsigned long lastReconnectAttempt = millis() - reconnectInterval - 1;
void mqtt_loop_HAL() {
if (!mqttClient.connected()) {
unsigned long currentMillis = millis();
if ((currentMillis - lastReconnectAttempt) > reconnectInterval) {
lastReconnectAttempt = currentMillis;
// Attempt to reconnect
checkMQTTconnection();
}
}
if (mqttClient.connected()) {
mqttClient.loop();
}
}
bool publishMQTTMessage_HAL(const char *topic, const char *payload){
if (checkMQTTconnection()) {
// Serial.printf("Sending mqtt payload to topic \"%s\": %s\r\n", topic, payload);
if (mqttClient.publish(topic, payload)) {
// Serial.printf("Publish ok\r\n");
return true;
}
else {
Serial.printf("Publish failed\r\n");
}
} else {
Serial.printf(" Cannot publish mqtt message, because checkMQTTconnection failed (WiFi or mqtt is not connected)\r\n");
}
return false;
}
void wifiStop_HAL() {
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
}
#endif