v2.9
This commit is contained in:
@ -0,0 +1,247 @@
|
||||
/****************************************************************************************************************************
|
||||
MQTTClient_Basic.ino - Dead simple MQTT Client for Ethernet shields
|
||||
|
||||
For Ethernet shields using ESP32_W5500 (ESP32 + W5500)
|
||||
|
||||
WebServer_ESP32_W5500 is a library for the ESP32 with Ethernet W5500 to run WebServer
|
||||
|
||||
Based on and modified from ESP32-IDF https://github.com/espressif/esp-idf
|
||||
Built by Khoi Hoang https://github.com/khoih-prog/WebServer_ESP32_W5500
|
||||
Licensed under GPLv3 license
|
||||
*****************************************************************************************************************************/
|
||||
|
||||
/*
|
||||
Basic MQTT example (without SSL!) with Authentication
|
||||
This sketch demonstrates the basic capabilities of the library.
|
||||
It connects to an MQTT server then:
|
||||
- providing username and password
|
||||
- publishes "hello world" to the topic "outTopic"
|
||||
- subscribes to the topic "inTopic", printing out any messages
|
||||
it receives. NB - it assumes the received payloads are strings not binary
|
||||
|
||||
It will reconnect to the server if the connection is lost using a blocking
|
||||
reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
|
||||
achieve the same result without blocking the main loop.
|
||||
*/
|
||||
|
||||
#if !( defined(ESP32) )
|
||||
#error This code is designed for (ESP32 + W5500) to run on ESP32 platform! Please check your Tools->Board setting.
|
||||
#endif
|
||||
|
||||
#define DEBUG_ETHERNET_WEBSERVER_PORT Serial
|
||||
|
||||
// Debug Level from 0 to 4
|
||||
#define _ETHERNET_WEBSERVER_LOGLEVEL_ 3
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
// Optional values to override default settings
|
||||
// Don't change unless you know what you're doing
|
||||
//#define ETH_SPI_HOST SPI3_HOST
|
||||
//#define SPI_CLOCK_MHZ 25
|
||||
|
||||
// Must connect INT to GPIOxx or not working
|
||||
//#define INT_GPIO 4
|
||||
|
||||
//#define MISO_GPIO 19
|
||||
//#define MOSI_GPIO 23
|
||||
//#define SCK_GPIO 18
|
||||
//#define CS_GPIO 5
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
#include <WebServer_ESP32_W5500.h>
|
||||
|
||||
WebServer server(80);
|
||||
|
||||
// Enter a MAC address and IP address for your controller below.
|
||||
#define NUMBER_OF_MAC 20
|
||||
|
||||
byte mac[][NUMBER_OF_MAC] =
|
||||
{
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x01 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x02 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x03 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x04 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x05 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x06 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x07 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x08 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x09 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0A },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0B },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0C },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0D },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x0E },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x0F },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x10 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x12 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x13 },
|
||||
{ 0xDE, 0xAD, 0xBE, 0xEF, 0xBE, 0x14 },
|
||||
};
|
||||
|
||||
// Select the IP address according to your local network
|
||||
IPAddress myIP(192, 168, 2, 232);
|
||||
IPAddress myGW(192, 168, 2, 1);
|
||||
IPAddress mySN(255, 255, 255, 0);
|
||||
|
||||
// Google DNS Server IP
|
||||
IPAddress myDNS(8, 8, 8, 8);
|
||||
|
||||
#include <PubSubClient.h>
|
||||
|
||||
// Update these with values suitable for your network.
|
||||
//const char* mqttServer = "broker.example"; // Broker address
|
||||
const char* mqttServer = "broker.emqx.io"; // Broker address
|
||||
//const char* mqttServer = "broker.shiftr.io"; // Broker address
|
||||
|
||||
const char *ID = "MQTTClient_SSL-Client"; // Name of our device, must be unique
|
||||
const char *TOPIC = "MQTT_Pub"; // Topic to subscribe to
|
||||
const char *subTopic = "MQTT_Sub"; // Topic to subscribe to
|
||||
|
||||
//IPAddress mqttServer(172, 16, 0, 2);
|
||||
|
||||
void callback(char* topic, byte* payload, unsigned int length)
|
||||
{
|
||||
Serial.print("Message arrived [");
|
||||
Serial.print(topic);
|
||||
Serial.print("] ");
|
||||
|
||||
for (unsigned int i = 0; i < length; i++)
|
||||
{
|
||||
Serial.print((char)payload[i]);
|
||||
}
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
WiFiClient ethClient;
|
||||
PubSubClient client(mqttServer, 1883, callback, ethClient);
|
||||
|
||||
void reconnect()
|
||||
{
|
||||
// Loop until we're reconnected
|
||||
while (!client.connected())
|
||||
{
|
||||
//Serial.print("Attempting MQTT connection to ");
|
||||
//Serial.print(mqttServer);
|
||||
|
||||
// Attempt to connect
|
||||
if (client.connect(ID, "try", "try"))
|
||||
{
|
||||
//Serial.println("...connected");
|
||||
|
||||
// Once connected, publish an announcement...
|
||||
String data = "Hello from MQTTClient_SSL on " + String(BOARD_NAME);
|
||||
|
||||
client.publish(TOPIC, data.c_str());
|
||||
|
||||
//Serial.println("Published connection message successfully!");
|
||||
//Serial.print("Subscribed to: ");
|
||||
//Serial.println(subTopic);
|
||||
|
||||
// This is a workaround to address https://github.com/OPEnSLab-OSU/SSLClient/issues/9
|
||||
//ethClientSSL.flush();
|
||||
// ... and resubscribe
|
||||
client.subscribe(subTopic);
|
||||
// for loopback testing
|
||||
client.subscribe(TOPIC);
|
||||
// This is a workaround to address https://github.com/OPEnSLab-OSU/SSLClient/issues/9
|
||||
//ethClientSSL.flush();
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print("...failed, rc=");
|
||||
Serial.print(client.state());
|
||||
Serial.println(" try again in 5 seconds");
|
||||
|
||||
// Wait 5 seconds before retrying
|
||||
delay(5000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
|
||||
while (!Serial && (millis() < 5000));
|
||||
|
||||
Serial.print(F("\nStart MQTTClient_Basic on "));
|
||||
Serial.print(ARDUINO_BOARD);
|
||||
Serial.print(F(" with "));
|
||||
Serial.println(SHIELD_TYPE);
|
||||
Serial.println(WEBSERVER_ESP32_W5500_VERSION);
|
||||
|
||||
ET_LOGWARN(F("Default SPI pinout:"));
|
||||
ET_LOGWARN1(F("SPI_HOST:"), ETH_SPI_HOST);
|
||||
ET_LOGWARN1(F("MOSI:"), MOSI_GPIO);
|
||||
ET_LOGWARN1(F("MISO:"), MISO_GPIO);
|
||||
ET_LOGWARN1(F("SCK:"), SCK_GPIO);
|
||||
ET_LOGWARN1(F("CS:"), CS_GPIO);
|
||||
ET_LOGWARN1(F("INT:"), INT_GPIO);
|
||||
ET_LOGWARN1(F("SPI Clock (MHz):"), SPI_CLOCK_MHZ);
|
||||
ET_LOGWARN(F("========================="));
|
||||
|
||||
///////////////////////////////////
|
||||
|
||||
// To be called before ETH.begin()
|
||||
ESP32_W5500_onEvent();
|
||||
|
||||
// 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 *W6100_Mac = W6100_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();
|
||||
|
||||
///////////////////////////////////
|
||||
|
||||
client.setServer(mqttServer, 1883);
|
||||
client.setCallback(callback);
|
||||
|
||||
// Allow the hardware to sort itself out
|
||||
delay(1500);
|
||||
}
|
||||
|
||||
#define MQTT_PUBLISH_INTERVAL_MS 5000L
|
||||
|
||||
String data = "Hello from MQTTClient_Basic on " + String(ARDUINO_BOARD) + " with " + String(SHIELD_TYPE);
|
||||
const char *pubData = data.c_str();
|
||||
|
||||
unsigned long lastMsg = 0;
|
||||
|
||||
void loop()
|
||||
{
|
||||
static unsigned long now;
|
||||
|
||||
if (!client.connected())
|
||||
{
|
||||
reconnect();
|
||||
}
|
||||
|
||||
// Sending Data
|
||||
now = millis();
|
||||
|
||||
if (now - lastMsg > MQTT_PUBLISH_INTERVAL_MS)
|
||||
{
|
||||
lastMsg = now;
|
||||
|
||||
if (!client.publish(TOPIC, pubData))
|
||||
{
|
||||
Serial.println("Message failed to send.");
|
||||
}
|
||||
|
||||
Serial.print("Message Send : " + String(TOPIC) + " => ");
|
||||
Serial.println(data);
|
||||
}
|
||||
|
||||
client.loop();
|
||||
}
|
Reference in New Issue
Block a user