diff --git a/Adafruit_MQTT.h b/Adafruit_MQTT.h index e88735a..f2fee07 100644 --- a/Adafruit_MQTT.h +++ b/Adafruit_MQTT.h @@ -45,6 +45,7 @@ #define DEBUG_PRINTBUFFER(buffer, len) {} #endif +// Use 3 (MQTT 3.0) or 4 (MQTT 3.1.1) #define MQTT_PROTOCOL_LEVEL 4 #define MQTT_CTRL_CONNECT 0x1 diff --git a/examples/mqtt_ethernet/.due.test.skip b/examples/mqtt_ethernet/.due.test.skip new file mode 100644 index 0000000..e69de29 diff --git a/examples/mqtt_ethernet/.esp8266.test.skip b/examples/mqtt_ethernet/.esp8266.test.skip new file mode 100644 index 0000000..e69de29 diff --git a/examples/mqtt_ethernet/mqtt_ethernet.ino b/examples/mqtt_ethernet/mqtt_ethernet.ino new file mode 100644 index 0000000..c27f8a8 --- /dev/null +++ b/examples/mqtt_ethernet/mqtt_ethernet.ino @@ -0,0 +1,141 @@ +/*************************************************** + Adafruit MQTT Library Ethernet Example + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Alec Moore + Derived from the code written by Limor Fried/Ladyada for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ +#include +#include "Adafruit_MQTT.h" +#include "Adafruit_MQTT_Client.h" + +#include +#include +#include +#include + +/************************* Ethernet Client Setup *****************************/ +byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; + +//Uncomment the following, and set to a valid ip if you don't have dhcp available. +//IPAddress iotIP (192, 168, 0, 42); +//Uncomment the following, and set to your preference if you don't have automatic dns. +//IPAddress dnsIP (8, 8, 8, 8); +//If you uncommented either of the above lines, make sure to change "Ethernet.begin(mac)" to "Ethernet.begin(mac, iotIP)" or "Ethernet.begin(mac, iotIP, dnsIP)" + + +/************************* Adafruit.io Setup *********************************/ + +#define AIO_SERVER "io.adafruit.com" +#define AIO_SERVERPORT 1883 +#define AIO_USERNAME "...your AIO username (see https://accounts.adafruit.com)..." +#define AIO_KEY "...your AIO key..." + + +/************ Global State (you don't need to change this!) ******************/ + +//Set up the ethernet client +EthernetClient client; + +// Store the MQTT server, client ID, username, and password in flash memory. +// This is required for using the Adafruit MQTT library. +const char MQTT_SERVER[] PROGMEM = AIO_SERVER; +// Set a unique MQTT client ID using the AIO key + the date and time the sketch +// was compiled (so this should be unique across multiple devices for a user, +// alternatively you can manually set this to a GUID or other random value). +const char MQTT_CLIENTID[] PROGMEM = __TIME__ AIO_USERNAME; +const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; +const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; + +Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD); + +// You don't need to change anything below this line! +#define halt(s) { Serial.println(F( s )); while(1); } + + +/****************************** Feeds ***************************************/ + +// Setup a feed called 'photocell' for publishing. +// Notice MQTT paths for AIO follow the form: /feeds/ +const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell"; +Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, PHOTOCELL_FEED); + +// Setup a feed called 'onoff' for subscribing to changes. +const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff"; +Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED); + +/*************************** Sketch Code ************************************/ + +void setup() { + Serial.begin(115200); + + Serial.println(F("Adafruit MQTT demo")); + + // Initialise the Client + Serial.print(F("\nInit the Client...")); + Ethernet.begin(mac); + delay(1000); //give the ethernet a second to initialize + + + mqtt.subscribe(&onoffbutton); +} + +uint32_t x=0; + +void loop() { + // Ensure the connection to the MQTT server is alive (this will make the first + // connection and automatically reconnect when disconnected). See the MQTT_connect + // function definition further below. + MQTT_connect(); + + // Try to ping the MQTT server + if (! mqtt.ping(3) ) { + // MQTT pings failed, let's reconnect by forcing a watchdog reset. + Serial.println("Ping fail! Resetting..."); + delay(10000); + } + + // this is our 'wait for incoming subscription packets' busy subloop + Adafruit_MQTT_Subscribe *subscription; + while ((subscription = mqtt.readSubscription(1000))) { + if (subscription == &onoffbutton) { + Serial.print(F("Got: ")); + Serial.println((char *)onoffbutton.lastread); + } + } + + // Now we can publish stuff! + Serial.print(F("\nSending photocell val ")); + Serial.print(x); + Serial.print("..."); + if (! photocell.publish(x++)) { + Serial.println(F("Failed")); + } else { + Serial.println(F("OK!")); + } +} + +// Function to connect and reconnect as necessary to the MQTT server. +// Should be called in the loop function and it will take care if connecting. +void MQTT_connect() { + int8_t ret; + + // Stop if already connected. + if (mqtt.connected()) { + return; + } + + Serial.print("Connecting to MQTT... "); + + while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected + Serial.println(mqtt.connectErrorString(ret)); + Serial.println("Retrying MQTT connection in 5 seconds..."); + mqtt.disconnect(); + delay(5000); // wait 5 seconds + } + Serial.println("MQTT Connected!"); +}