#include "EspMQTT.h"
extern char* SKETCH_ID;
extern char* WIFI_SSID;
extern char* WIFI_PASSWORD;
extern char* MQTT_SERVER;
extern char* MQTT_USER;
extern char* MQTT_PASSWORD;
extern char* MQTT_PUBLISH_TOPIC;
extern char* MQTT_SUBSCRIBE_TOPIC;
WiFiClient _espClient;
PubSubClient _client(_espClient);
EspMQTT::EspMQTT() {
}
void EspMQTT::begin()
{
Serial.begin(115200);
Serial.println("System started");
_client.setServer(MQTT_SERVER, 1883);
_client.setCallback(callback);
wifi();
}
void EspMQTT::callback(char* topic, byte* payload, unsigned int length)
{
String message = String();
for (int i = 0; i < length; i++) {
char input_char = (char)payload[i];
message += input_char;
}
}
void EspMQTT::wifi()
{
++ _wifi_reconnect_tries;
if (_mqtt_reconnect_tries != 0) {
_mqtt_reconnect_tries = 0;
}
boolean networkScan = false;
int n = WiFi.scanNetworks();
delay(300);
for (int i = 0; i < n; ++i) {
if (WiFi.SSID(i) == WIFI_SSID) {
Serial.print(WIFI_SSID);
Serial.print(" is available");
Serial.println("");
networkScan = true;
break;
}
}
if(networkScan) {
if (_wifi_reconnect_tries > 1) {
Serial.print("Retrying:: ");
}
Serial.print("Connecting to ");
Serial.print(WIFI_SSID);
Serial.println("");
long wifi_initiate = millis();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
if (WiFi.status() == WL_CONNECTED) {
break;
}
if ((millis() - wifi_initiate) > 15000L) {
break;
}
delay(500);
}
if (WiFi.status() == WL_CONNECTED) {
Serial.print(" Connected!!");
Serial.println("");
_wifi_reconnect_tries = 0;
} else if ((WiFi.status() != WL_CONNECTED) && (_wifi_reconnect_tries > 3)) {
Serial.print(" Failed to connect to ");
Serial.print(WIFI_SSID);
Serial.println("");
Serial.println("Rebooting...");
delay(1000);
digitalWrite(RESET_PIN, LOW);
}
} else {
Serial.print(WIFI_SSID);
Serial.print(" is offline");
Serial.println("");
if (_wifi_reconnect_tries > 3) {
_wifi_check_time = 300000L;
_wifi_reconnect_tries = 0;
Serial.println("System will try again after 5 minutes");
}
}
}
void EspMQTT::mqtt()
{
if (_mqtt_reconnect_tries > 1) {
Serial.print("Retrying:: ");
}
Serial.print("Connecting to mqtt server: ");
Serial.println(MQTT_SERVER);
_client.connect(SKETCH_ID, MQTT_USER, MQTT_PASSWORD);
delay(500);
if (_client.connected()) {
_client.publish(MQTT_PUBLISH_TOPIC, "system online"); // Initial system status publish to server
_client.subscribe(MQTT_SUBSCRIBE_TOPIC); // Subscribe to your MQTT topic
Serial.println(".. Connected!!");
_mqtt_reconnect_tries = 0;
} else {
Serial.print("Failed to connect to mqtt server, rc=");
Serial.print(_client.state());
Serial.println("");
}
}
void EspMQTT::loop()
{
_client.loop();
if((WiFi.status() != WL_CONNECTED) && ((millis() - _wifi_reconnect_time) > _wifi_check_time)) {
_wifi_check_time = 15000L;
_wifi_reconnect_time = millis();
wifi();
}
if ((WiFi.status() == WL_CONNECTED) && (!_client.connected()) && ((millis() - _mqtt_reconnect_time) > 5000L)) {
_mqtt_reconnect_time = millis();
++ _mqtt_reconnect_tries;
mqtt();
if ((_mqtt_reconnect_tries > 5) && (!_client.connected())) {
Serial.println("Rebooting");
delay(1000);
digitalWrite(16, LOW);
}
}
}