diff --git a/Adafruit_MQTT.cpp b/Adafruit_MQTT.cpp index 6106a07..19c16ff 100644 --- a/Adafruit_MQTT.cpp +++ b/Adafruit_MQTT.cpp @@ -242,6 +242,8 @@ uint16_t Adafruit_MQTT::processPacketsUntil(uint8_t *buffer, uint8_t waitforpack if ((buffer[0] >> 4) == waitforpackettype) { //DEBUG_PRINTLN(F("Found right packet")); return len; + } else { + ERROR_PRINTLN(F("Dropped a packet")); } } return 0; diff --git a/Adafruit_MQTT.h b/Adafruit_MQTT.h index 4813541..8cfbfa2 100644 --- a/Adafruit_MQTT.h +++ b/Adafruit_MQTT.h @@ -49,6 +49,16 @@ #define DEBUG_PRINTBUFFER(buffer, len) {} #endif +#ifdef MQTT_ERROR + #define ERROR_PRINT(...) { DEBUG_PRINTER.print(__VA_ARGS__); } + #define ERROR_PRINTLN(...) { DEBUG_PRINTER.println(__VA_ARGS__); } + #define ERROR_PRINTBUFFER(buffer, len) { printBuffer(buffer, len); } +#else + #define ERROR_PRINT(...) {} + #define ERROR_PRINTLN(...) {} + #define ERROR_PRINTBUFFER(buffer, len) {} +#endif + // Use 3 (MQTT 3.0) or 4 (MQTT 3.1.1) #define MQTT_PROTOCOL_LEVEL 4 diff --git a/examples/mqtt_esp8266_callback/mqtt_esp8266_callback.ino b/examples/mqtt_esp8266_callback/mqtt_esp8266_callback.ino new file mode 100644 index 0000000..cebffc8 --- /dev/null +++ b/examples/mqtt_esp8266_callback/mqtt_esp8266_callback.ino @@ -0,0 +1,147 @@ +/*************************************************** + Adafruit MQTT Library ESP8266 Example + + Must use ESP8266 Arduino from: + https://github.com/esp8266/Arduino + + Works great with Adafruit's Huzzah ESP board: + ----> https://www.adafruit.com/product/2471 + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Tony DiCola for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ +#include +#include "Adafruit_MQTT.h" +#include "Adafruit_MQTT_Client.h" + +/************************* WiFi Access Point *********************************/ + +#define WLAN_SSID "network" +#define WLAN_PASS "password" + +/************************* Adafruit.io Setup *********************************/ + +#define AIO_SERVER "io.adafruit.com" +#define AIO_SERVERPORT 1883 +#define AIO_USERNAME "user" +#define AIO_KEY "key" + +/************ Global State (you don't need to change this!) ******************/ + +// Create an ESP8266 WiFiClient class to connect to the MQTT server. +WiFiClient client; + +// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details. +Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY); + +/****************************** Feeds ***************************************/ + +// Setup a feed called 'time' for subscribing to current time +Adafruit_MQTT_Subscribe timefeed = Adafruit_MQTT_Subscribe(&mqtt, "time/seconds"); + +// Setup a feed called 'slider' for subscribing to changes on the slider +Adafruit_MQTT_Subscribe slider = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/slider", MQTT_QOS_1); + +// Setup a feed called 'onoff' for subscribing to changes to the button +Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff", MQTT_QOS_1); + +/*************************** Sketch Code ************************************/ + +void timecallback(uint32_t x) { + Serial.print("Hey we're in a time callback, the epoch time is: "); + Serial.println(x); +} + +void slidercallback(double x) { + Serial.print("Hey we're in a slider callback, the slider value is: "); + Serial.println(x); +} + +void onoffcallback(char *data, uint16_t len) { + Serial.print("Hey we're in a onoff callback, the button value is: "); + Serial.println(data); +} + + +void setup() { + Serial.begin(115200); + delay(10); + + Serial.println(F("Adafruit MQTT demo")); + + // Connect to WiFi access point. + Serial.println(); Serial.println(); + Serial.print("Connecting to "); + Serial.println(WLAN_SSID); + + WiFi.begin(WLAN_SSID, WLAN_PASS); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + Serial.println("WiFi connected"); + Serial.println("IP address: "); Serial.println(WiFi.localIP()); + + timefeed.setCallback(timecallback); + slider.setCallback(slidercallback); + onoffbutton.setCallback(onoffcallback); + + // Setup MQTT subscription for time feed. + mqtt.subscribe(&timefeed); + mqtt.subscribe(&slider); + 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(); + + // this is our 'wait for incoming subscription packets and callback em' busy subloop + // try to spend your time here: + mqtt.processPackets(10000); + + // ping the server to keep the mqtt connection alive + // NOT required if you are publishing once every KEEPALIVE seconds + + if(! mqtt.ping()) { + mqtt.disconnect(); + } +} + +// 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... "); + + uint8_t retries = 3; + while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected + Serial.println(mqtt.connectErrorString(ret)); + Serial.println("Retrying MQTT connection in 10 seconds..."); + mqtt.disconnect(); + delay(10000); // wait 10 seconds + retries--; + if (retries == 0) { + // basically die and wait for WDT to reset me + while (1); + } + } + Serial.println("MQTT Connected!"); +} \ No newline at end of file