Skip to content

W6100 khoih-prog / AsyncMQTT_ESP32

This AsyncMQTT_ESP32 library is based on and modified from Marvin Roger's async-mqtt-client Library.

eric_g

Published February 01, 2023

Original author: khoih prog · CanadaOriginal source (new tab)

W6100 khoih-prog / AsyncMQTT_ESP32

Components

Hardware components

Project description

Why Async is better

  • Using asynchronous network means that you can handle more than one connection at the same time
  • You are called once the request is ready and parsed
  • When you send the response, you are immediately ready to handle other connections while the server is taking care of sending the response in the background
  • Speed is OMG
  • Easy to use API, HTTP Basic and Digest MD5 Authentication (default), ChunkedResponse
  • Easily extensible to handle any type of content
  • Supports Continue 100
  • Async WebSocket plugin offering different locations without extra servers or ports
  • Async EventSource (Server-Sent Events) plugin to send events to the browser
  • URL Rewrite plugin for conditional and permanent url rewrites
  • ServeStatic plugin that supports cache, Last-Modified, default index and more
  • Simple template processing engine to handle templates

 

Example FullyFeaturedSSL_ESP32_SC_W5500

1. File FullyFeaturedSSL_ESP32_SC_W5500.ino

 

 #include "defines.h"
  
 extern "C"
 {
 #include "freertos/FreeRTOS.h"
 #include "freertos/timers.h"
 }
  
 #define ASYNC_TCP_SSL_ENABLED true
 //#define ASYNC_TCP_SSL_ENABLED false
  
 #include <AsyncMQTT_ESP32.h>
  
 //#define MQTT_HOST IPAddress(192, 168, 2, 110)
 #define MQTT_HOST "broker.emqx.io" // Broker address
  
 #if ASYNC_TCP_SSL_ENABLED
  
 #define MQTT_SECURE true
  
 const uint8_t MQTT_SERVER_FINGERPRINT[] = {0x7e, 0x36, 0x22, 0x01, 0xf9, 0x7e, 0x99, 0x2f, 0xc5, 0xdb, 0x3d, 0xbe, 0xac, 0x48, 0x67, 0x5b, 0x5d, 0x47, 0x94, 0xd2};
 const char *PubTopic = "async-mqtt/ESP32_W5500_SSL_Pub"; // Topic to publish
  
 #define MQTT_PORT 8883
  
 #else
  
 const char *PubTopic = "async-mqtt/ESP32_SC_W5500_Pub"; // Topic to publish
  
 #define MQTT_PORT 1883
  
 #endif
  
 AsyncMqttClient mqttClient;
 TimerHandle_t mqttReconnectTimer;
  
 void connectToMqtt()
 {
 Serial.println("Connecting to MQTT...");
 mqttClient.connect();
 }
  
 void ETH_event(WiFiEvent_t event)
 {
 switch (event)
 {
 #if USING_CORE_ESP32_CORE_V200_PLUS
  
 case ARDUINO_EVENT_ETH_START:
 Serial.println("ETH starting");
 break;
  
 case ARDUINO_EVENT_ETH_CONNECTED:
 Serial.println("ETH connected");
 break;
  
 case ARDUINO_EVENT_ETH_GOT_IP:
 Serial.println("ETH got IP");
 Serial.print("IP address: ");
 Serial.println(ETH.localIP());
 connectToMqtt();
 break;
  
 case ARDUINO_EVENT_ETH_DISCONNECTED:
 Serial.println("ETH lost connection");
  
 // ensure we don't reconnect to MQTT when no ETH
 xTimerStop(mqttReconnectTimer, 0);
  
 break;
  
 case ARDUINO_EVENT_ETH_STOP:
 Serial.println("ETH stops");
  
 // ensure we don't reconnect to MQTT when no ETH
 xTimerStop(mqttReconnectTimer, 0);
  
 break;
 #else
  
 case SYSTEM_EVENT_ETH_CONNECTED:
 erial.println(F("ETH Connected"));
 break;
  
 case SYSTEM_EVENT_ETH_GOT_IP:
 Serial.println("ETH connected");
 Serial.println("IP address: ");
 Serial.println(ETH.localIP());
 connectToMqtt();
 break;
  
 case SYSTEM_EVENT_ETH_DISCONNECTED:
 case SYSTEM_EVENT_ETH_STOP:
 Serial.println("ETH lost connection");
  
 // ensure we don't reconnect to MQTT when no ETH
 xTimerStop(mqttReconnectTimer, 0);
  
 break;
 #endif
  
 default:
 break;
 }
 }
  
 void printSeparationLine()
 {
 Serial.println("************************************************");
 }
  
 void onMqttConnect(bool sessionPresent)
 {
 Serial.print("Connected to MQTT broker: ");
 Serial.print(MQTT_HOST);
 Serial.print(", port: ");
 Serial.println(MQTT_PORT);
 Serial.print("PubTopic: ");
 Serial.println(PubTopic);
  
 printSeparationLine();
 Serial.print("Session present: ");
 Serial.println(sessionPresent);
  
 uint16_t packetIdSub = mqttClient.subscribe(PubTopic, 2);
 Serial.print("Subscribing at QoS 2, packetId: ");
 Serial.println(packetIdSub);
  
 mqttClient.publish(PubTopic, 0, true, "ESP32_W5500 Test");
 Serial.println("Publishing at QoS 0");
  
 uint16_t packetIdPub1 = mqttClient.publish(PubTopic, 1, true, "test 2");
 Serial.print("Publishing at QoS 1, packetId: ");
 Serial.println(packetIdPub1);
  
 uint16_t packetIdPub2 = mqttClient.publish(PubTopic, 2, true, "test 3");
 Serial.print("Publishing at QoS 2, packetId: ");
 Serial.println(packetIdPub2);
  
 printSeparationLine();
 }
  
 void onMqttDisconnect(AsyncMqttClientDisconnectReason reason)
 {
 (void) reason;
  
 Serial.println("Disconnected from MQTT.");
  
 if (ESP32_W5500_isConnected())
 {
 xTimerStart(mqttReconnectTimer, 0);
 }
 }
  
 void onMqttSubscribe(const uint16_t& packetId, const uint8_t& qos)
 {
 Serial.println("Subscribe acknowledged.");
 Serial.print(" packetId: ");
 Serial.println(packetId);
 Serial.print(" qos: ");
 Serial.println(qos);
 }
  
 void onMqttUnsubscribe(const uint16_t& packetId)
 {
 Serial.println("Unsubscribe acknowledged.");
 Serial.print(" packetId: ");
 Serial.println(packetId);
 }
  
 void onMqttMessage(char* topic, char* payload, const AsyncMqttClientMessageProperties& properties,
 const size_t& len, const size_t& index, const size_t& total)
 {
 (void) payload;
  
 Serial.println("Publish received.");
 Serial.print(" topic: ");
 Serial.println(topic);
 Serial.print(" qos: ");
 Serial.println(properties.qos);
 Serial.print(" dup: ");
 Serial.println(properties.dup);
 Serial.print(" retain: ");
 Serial.println(properties.retain);
 Serial.print(" len: ");
 Serial.println(len);
 Serial.print(" index: ");
 Serial.println(index);
 Serial.print(" total: ");
 Serial.println(total);
 }
  
 void onMqttPublish(const uint16_t& packetId)
 {
 Serial.println("Publish acknowledged");
 Serial.print(" packetId: ");
 Serial.println(packetId);
 }
  
 void setup()
 {
 Serial.begin(115200);
  
 while (!Serial && millis() < 5000);
  
 delay(500);
  
 Serial.print("\nStarting FullyFeatureSSL_ESP32_SC_W5500 on ");
 Serial.print(ARDUINO_BOARD);
 Serial.println(" with " + String(SHIELD_TYPE));
 Serial.println(WEBSERVER_ESP32_SC_W5500_VERSION);
 Serial.println(ASYNC_MQTT_ESP32_VERSION);
  
 AMQTT_LOGWARN(F("Default SPI pinout:"));
 AMQTT_LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST);
 AMQTT_LOGWARN1(F("MOSI:"), MOSI_GPIO);
 AMQTT_LOGWARN1(F("MISO:"), MISO_GPIO);
 AMQTT_LOGWARN1(F("SCK:"), SCK_GPIO);
 AMQTT_LOGWARN1(F("CS:"), CS_GPIO);
 AMQTT_LOGWARN1(F("INT:"), INT_GPIO);
 AMQTT_LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ);
 AMQTT_LOGWARN(F("========================="));
  
 mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0,
 reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
  
 mqttClient.onConnect(onMqttConnect);
 mqttClient.onDisconnect(onMqttDisconnect);
 mqttClient.onSubscribe(onMqttSubscribe);
 mqttClient.onUnsubscribe(onMqttUnsubscribe);
 mqttClient.onMessage(onMqttMessage);
 mqttClient.onPublish(onMqttPublish);
  
 mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  
 #if ASYNC_TCP_SSL_ENABLED
 mqttClient.setSecure(MQTT_SECURE);
  
 if (MQTT_SECURE)
 {
 //mqttClient.addServerFingerprint((const uint8_t[])MQTT_SERVER_FINGERPRINT);
 mqttClient.addServerFingerprint((const uint8_t *)MQTT_SERVER_FINGERPRINT);
 }
  
 #endif
  
 ///////////////////////////////////
  
 // To be called before ETH.begin()
 WiFi.onEvent(ETH_event);
  
 // start the ethernet connection and the server:
 // Use DHCP dynamic IP and random mac
 //bool begin(int MISO_GPIO, int MOSI_GPIO, int SCLK_GPIO, int CS_GPIO, int INT_GPIO, int SPI_CLOCK_MHZ,
 // int SPI_HOST, uint8_t *W5500_Mac = W5500_Default_Mac);
 ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST );
 //ETH.begin( MISO_GPIO, MOSI_GPIO, SCK_GPIO, CS_GPIO, INT_GPIO, SPI_CLOCK_MHZ, ETH_SPI_HOST, mac[millis() % NUMBER_OF_MAC] );
  
 // Static IP, leave without this line to get IP via DHCP
 //bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0);
 //ETH.config(myIP, myGW, mySN, myDNS);
  
 ESP32_W5500_waitForConnect();
  
 ///////////////////////////////////
 }
  
 void loop()
 {
 }

 

2. File defines.h

 

 #ifndef defines_h
 #define defines_h
  
 // Debug Level from 0 to 4
 #define _ETHERNET_WEBSERVER_LOGLEVEL_ 1
 #define _ASYNC_MQTT_LOGLEVEL_ 1
  
 //////////////////////////////////////////////////////////
  
 // For ESP32-S3
 // Optional values to override default settings
 //#define ETH_SPI_HOST SPI2_HOST

Comments

Similar projects you might like

Comments