modify in the library directory your_directory/Arduino/libraries/ESPAsyncWebServer-master/src/WebAuthentication.cpp @line 72 with this (the comment are the old line ......)
When I tried to compile ESPAsyncWebServer with AsyncElegantOTA, the following error occured:
c:/users/stone/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/gcc8_4_0-esp-2021r2-patch3/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: d:\stone\Documents\build\libraries\ESPAsyncWebServer-master\WebAuthentication.cpp.o:(.literal._ZL6getMD5PhtPc+0x4): undefined reference to `mbedtls_md5_starts'
It looked like the ESPAsyncWebsrver issue, so I went to GitHub to re-download ESPAsyncWebServer (https://github.com/me-no-dev/ESPAsyncWebServer ) and then updated the library. However, this didn't solve the issue that the same error still stopping me from compile it for my ESP32.
After couple of hours, I realized that this was an error that didn't have a proper fixed yet. However, someone at Github provided a solution and it worked for me:
In line 72 of the WebAuthentication.cpp file:
modify in the library directory your_directory/Arduino/libraries/ESPAsyncWebServer-master/src/WebAuthentication.cpp @line 72 with this (the comment are the old line ......)
Just comment these red in comment below and add the blue codes, then compile went fine without issues!
Today, I will show how to combine three commonly used IoT libraries;
WiFimanager, AsyncElegantOTA, and MQTT To become a common IoT code base. So, for our future projects, ESP8266 or ESP32, would have these basic functions.
Let's first look at these three libraries:
Wifimanager = Wi-Fi password management, no need to re-burn the code to change the Wi-Fi SSID & password
FOTA = Use Wi-Fi to update ESP32 code, you can burn code without connecting to USB
MQTT = Streamlined and lightweight communication protocol (Message Queueing Telemetry Transport)
This episode will only introduce how to integrate MQTT into Wifimanager + AsyncElegantFOTA.
To learn how to start Wifimanager + AsyncElegantOTA, Please watch Android #27 Wifimanager + OTA for ESP32/ESP8266 (ESPAsyncWifimanager / ESPAsyncElegantOTA)) https://youtu.be/UlRLTvl4DRc
If you don't have enough time, you can also select the part you want to watch from the timeline below!
Video Timeline:
00:00 Start
01:39 Demonstration of project results
01:57 mqttgo.io MQTT server, free, fast, & stable
05:52 Install three libraries
07:14 Added two ESP32 PINs as MQTT example
07:41 Encrypt the firmware update (ElegantOTA) page
11:44 Explain how the MQTT callback function works
13:07 Control ESP32 I/O pins with MQTT
15:16 Future program can be written from here
/**
* Arduino code base for IoT Projects
* By: Stonez56 aka Kevin Chen 2022-08-16
*
* This source code combined three most common Arduino libraries for IoT Projects,
* ESPAsync_Wifimanager, AsyncElegantOTA, & Pubsubclient MQTT Client.
*
* 1. ESPAsync_WiFiManager: https://github.com/khoih-prog/ESPAsync_WiFiManager
* 2. AsyncElegantOTA: https://github.com/ayushsharma82/AsyncElegantOTA
* 3. Pubsubclient MQTT Client: https://github.com/knolleary/pubsubclient
*
* YouTube video: https://youtu.be/giFHp9RSMvQ
* Source code is available my blog: https://stonez56.blogspot.com/2022/08/android-36-iot-wifimanager-fota-mqtt.html
**/
/*
* Define Relay pins as examples to send/receive MQTT messages
* **/
#define RELAY_PIN_1 12
#define RELAY_PIN_2 14
/**
* Perform OTAs for ESP8266 / ESP32 Elegantly with password protection!
* https://github.com/ayushsharma82/AsyncElegantOTA
* **/
#include <AsyncElegantOTA.h>
const char *FOTA_USERNAME = "un";
const char *FOTA_PASSWORD = "pw";
/**
* Add MQTT client here` PubSubClient V2.8 by Nick O'Leary
* https://github.com/knolleary/pubsubclient
*/
#include <WiFiClient.h>
#include <PubSubClient.h>
#define MSG_BUFFER_SIZE (1024)
char msg[MSG_BUFFER_SIZE];
/** Taiwan No. 1 Free MQTT Server!! **/
const char *mqtt_server = "mqttgo.io";
const int mqtt_port = 1883;
/****************************************************************************************************************************
Async_AutoConnect_ESP32_minimal.ino
For ESP8266 / ESP32 boards
Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
Licensed under MIT license
*****************************************************************************************************************************/
#if !(defined(ESP32))
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
#endif
#include <ESPAsync_WiFiManager.h>
AsyncWebServer webServer(80);
//Start DNS server
DNSServer dnsServer;
//MQTT - Start WiFi client and connect to MQTT server
WiFiClient espClient;
PubSubClient mqtt_client(espClient);
//Define device name
String DEVICE_NAME = "Dual_Relay_Switch";
String home_page_message = "";
void setup()
{
Serial.begin(115200);
pinMode(RELAY_PIN_1, OUTPUT);
pinMode(RELAY_PIN_2, OUTPUT);
while (!Serial)
;
delay(200);
Serial.print("\nAsyncWifimanager started on " + String(ARDUINO_BOARD) + "\n");
//Initialize ESPAsyncWifimanager instance and assign Wi-Fi Client name "AsyncAutoConnect"!
//This name and IP address can be checked from the router
ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "Dual_Relay_Switch");
//####### RESET SAVED WIFI SETTINGS #############
//ESPAsync_wifiManager.resetSettings();
//ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192, 168, 132, 1), IPAddress(192, 168, 132, 1), IPAddress(255, 255, 255, 0));
//ESPAsync_wifiManager.autoConnect("Stonez_ESP32S", "AP-NAME", "AP-PASSWORD");
ESPAsync_wifiManager.autoConnect("Dual_Switch_ESP32S");
if (WiFi.status() == WL_CONNECTED)
{
Serial.print(DEVICE_NAME);
Serial.print(" is on Local IP: ");
Serial.println(WiFi.localIP());
}
else
{
Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status()));
}
//Setup home page access content when visite
home_page_message = "<!DOCTYPE html><html><head><title>" + DEVICE_NAME
+ "</title></head><body><p><h2> Hi! This is " + DEVICE_NAME + "</h2>"
+ "To update firmware, <a href='/update'>Click here!!</a><br/><span>Username & Password required!</span></p><body></html>";
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(200, "text/html", home_page_message); });
//AsyncElegantOTA.begin(&webServer); // Start ElegantOTA WITHOUT username & password
AsyncElegantOTA.begin(&webServer, FOTA_USERNAME, FOTA_PASSWORD); // Start ElegantOTA with username & password
webServer.begin();
Serial.println("AsyncElegantOTA server started @URL/update");
//MQTT starts here!
mqtt_client.setServer(mqtt_server, mqtt_port);
mqtt_client.setCallback(callback);
}
/**
//When MQTT lost connection, this function will be called to reconnect MQTT//
* Modified to accept multiple MQTT topics
* https://www.baldengineer.com/multiple-mqtt-topics-pubsubclient.html
*/
void callback(char *topic, byte *payload, unsigned int length)
{
//Print message received
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
//Process multiple topics here//
payload[length] = '\0';
String message = (char*)payload;
if (strcmp(topic, "studio/humd_switch") == 0)
{
if(message == "true"){
digitalWrite(RELAY_PIN_1, HIGH);
Serial.println("humd_switch true");
}
if(message == "false"){
digitalWrite(RELAY_PIN_1, LOW);
Serial.println("humd_switch false");
}
}
if (strcmp(topic, "studio/humd_switch2") == 0)
{
if(message == "true"){
digitalWrite(RELAY_PIN_2, HIGH);
Serial.println("humd_switch2 true");
}
if(message == "false"){
digitalWrite(RELAY_PIN_2, LOW);
Serial.println("humd_switch2 false");
}
}
}
//============= MQTT ===================
//When MQTT lost connection, this function will be called to reconnect MQTT//
void reconnect(){
//Loop while MQTT connected
while (!mqtt_client.connected())
{
Serial.print("Attempting MQTT connection... ");
// Create a random client ID
String clientId = "Stonez_ESP32Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (mqtt_client.connect(clientId.c_str()))
{
Serial.print("connected to ");
Serial.print(mqtt_server);
// Once connected, publish an announcement...
mqtt_client.publish("outTopic", "Hello world");
// ... and resubscribe
mqtt_client.subscribe("studio/humd_switch");
mqtt_client.subscribe("studio/humd_switch2");
}
else
{
Serial.print("failed, rc=");
Serial.print(mqtt_client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
//============= MQTT ===================
//if can't connect to MQTT server, then re-connect
if (!mqtt_client.connected())
{ reconnect(); }
//constantly check MQTT to see for messages sending/receiving
mqtt_client.loop();
/**
* Write your own code here....
*
*/
}
Async_AutoConnect_ESP32_minimal.ino
/****************************************************************************************************************************
Async_AutoConnect_ESP32_minimal.ino
For ESP8266 / ESP32 boards
Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
Licensed under MIT license
*****************************************************************************************************************************/
#if !(defined(ESP32) )
#error This code is intended to run on the ESP32 platform! Please check your Tools->Board setting.
#endif
#include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager
AsyncWebServer webServer(80);
DNSServer dnsServer;
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); while (!Serial); delay(200);
Serial.print("\nStarting Async_AutoConnect_ESP32_minimal on " + String(ARDUINO_BOARD)); Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION);
ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "AutoConnectAP");
//ESPAsync_wifiManager.resetSettings(); //reset saved settings
ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192,168,132,1), IPAddress(192,168,132,1), IPAddress(255,255,255,0));
ESPAsync_wifiManager.autoConnect("AutoConnectAP");
if (WiFi.status() == WL_CONNECTED) { Serial.print(F("Connected. Local IP: ")); Serial.println(WiFi.localIP()); }
else { Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status())); }
}
void loop() { }
Async_AutoConnect_ESP8266_minimal.ino
/****************************************************************************************************************************
Async_AutoConnect_ESP8266_minimal.ino
For ESP8266 / ESP32 boards
Built by Khoi Hoang https://github.com/khoih-prog/ESPAsync_WiFiManager
Licensed under MIT license
*****************************************************************************************************************************/
#if !( defined(ESP8266) )
#error This code is intended to run on ESP8266 platform! Please check your Tools->Board setting.
#endif
#include <ESPAsync_WiFiManager.h> //https://github.com/khoih-prog/ESPAsync_WiFiManager
AsyncWebServer webServer(80);
DNSServer dnsServer;
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); while (!Serial); delay(200);
Serial.print("\nStarting Async_AutoConnect_ESP8266_minimal on " + String(ARDUINO_BOARD)); Serial.println(ESP_ASYNC_WIFIMANAGER_VERSION);
ESPAsync_WiFiManager ESPAsync_wifiManager(&webServer, &dnsServer, "AutoConnectAP");
//ESPAsync_wifiManager.resetSettings(); //reset saved settings
//ESPAsync_wifiManager.setAPStaticIPConfig(IPAddress(192,168,186,1), IPAddress(192,168,186,1), IPAddress(255,255,255,0));
ESPAsync_wifiManager.autoConnect("AutoConnectAP");
if (WiFi.status() == WL_CONNECTED) { Serial.print(F("Connected. Local IP: ")); Serial.println(WiFi.localIP()); }
else { Serial.println(ESPAsync_wifiManager.getStatus(WiFi.status())); }
}
void loop() { }