From 9b92bb379c32ddc24d9dbf6bfc7979376a23933b Mon Sep 17 00:00:00 2001 From: Tony DiCola Date: Mon, 6 Jul 2015 13:43:52 -0700 Subject: [PATCH] Add date and time to client ID generation for more unique value. --- Adafruit_MQTT.h | 8 +++--- examples/mqtt_cc3k/mqtt_cc3k.ino | 37 +++++++++++++----------- examples/mqtt_esp8266/mqtt_esp8266.ino | 31 +++++++++++--------- examples/mqtt_fona/mqtt_fona.ino | 39 ++++++++++++++------------ 4 files changed, 62 insertions(+), 53 deletions(-) diff --git a/Adafruit_MQTT.h b/Adafruit_MQTT.h index 513df80..cb03fd4 100644 --- a/Adafruit_MQTT.h +++ b/Adafruit_MQTT.h @@ -68,7 +68,7 @@ // Largest full packet we're able to send. // Need to be able to store at least ~90 chars for a connect packet with full // 23 char client ID. -#define MAXBUFFERSIZE (105) +#define MAXBUFFERSIZE (125) #define MQTT_CONN_USERNAMEFLAG 0x80 #define MQTT_CONN_PASSWORDFLAG 0x40 @@ -92,7 +92,7 @@ class Adafruit_MQTT_Subscribe; // forward decl class Adafruit_MQTT { public: - Adafruit_MQTT(const char *server, uint16_t port, const char *cid, + Adafruit_MQTT(const char *server, uint16_t port, const char *cid, const char *user, const char *pass); virtual ~Adafruit_MQTT() {} @@ -114,7 +114,7 @@ class Adafruit_MQTT { // Publish a message to a topic using the specified QoS level. Returns true // if the message was published, false otherwise. bool publish(const char *topic, char *payload, uint8_t qos); - + // Add a subscription to receive messages for a topic. Returns true if the // subscription could be added, false otherwise. bool subscribe(Adafruit_MQTT_Subscribe *sub); @@ -173,7 +173,7 @@ class Adafruit_MQTT_Publish { // This might be ignored and a higher precision value sent. bool publish(int32_t i); bool publish(uint32_t i); - + private: Adafruit_MQTT *mqtt; const char *topic; diff --git a/examples/mqtt_cc3k/mqtt_cc3k.ino b/examples/mqtt_cc3k/mqtt_cc3k.ino index 762a13f..7e59017 100644 --- a/examples/mqtt_cc3k/mqtt_cc3k.ino +++ b/examples/mqtt_cc3k/mqtt_cc3k.ino @@ -1,14 +1,14 @@ -/*************************************************** +/*************************************************** Adafruit MQTT Library CC3000 Example Designed specifically to work with the Adafruit WiFi products: ----> https://www.adafruit.com/products/1469 - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Written by Limor Fried/Ladyada for Adafruit Industries. + Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution ****************************************************/ #include @@ -30,7 +30,7 @@ #define WLAN_SSID "...your SSID..." // can't be longer than 32 characters! #define WLAN_PASS "...your password..." -#define WLAN_SECURITY WLAN_SEC_WPA2 // Can be: WLAN_SEC_UNSEC, WLAN_SEC_WEP, +#define WLAN_SECURITY WLAN_SEC_WPA2 // Can be: WLAN_SEC_UNSEC, WLAN_SEC_WEP, // WLAN_SEC_WPA or WLAN_SEC_WPA2 /************************* Adafruit.io Setup *********************************/ @@ -38,7 +38,7 @@ #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..."; +#define AIO_KEY "...your AIO key..." /************ Global State (you don't need to change this!) ******************/ @@ -48,7 +48,10 @@ Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ // 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; -const char MQTT_CLIENTID[] PROGMEM = AIO_KEY; +// 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 = AIO_KEY __DATE__ __TIME__; const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; @@ -64,12 +67,12 @@ boolean CC3000connect(const char* wlan_ssid, const char* wlan_pass, uint8_t wlan /****************************** Feeds ***************************************/ -// Setup a feed called 'photocell' for publishing. +// 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. +// 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); @@ -84,7 +87,7 @@ void setup() { // Initialise the CC3000 module Serial.print(F("\nInit the CC3000...")); - if (!cc3000.begin()) + if (!cc3000.begin()) halt("Failed"); mqtt.subscribe(&onoffbutton); @@ -107,17 +110,17 @@ void setup() { case 5: Serial.println(F("Not authed")); break; case 6: Serial.println(F("Failed to subscribe")); break; default: { - Serial.println(F("Connection failed")); + Serial.println(F("Connection failed")); CC3000connect(WLAN_SSID, WLAN_PASS, WLAN_SECURITY); // y0w, lets connect to wifi again return; // restart the loop } } Serial.println(F("Retrying MQTT connection")); - delay(5000); + delay(5000); } ////////////////////////////// - Serial.println(F("MQTT Connected!")); + Serial.println(F("MQTT Connected!")); } uint32_t x=0; @@ -125,7 +128,7 @@ uint32_t x=0; void loop() { // Make sure to reset watchdog every loop iteration! Watchdog.reset(); - + // Try to ping the MQTT server /* if (! mqtt.ping(3) ) { @@ -140,13 +143,13 @@ void loop() { Adafruit_MQTT_Subscribe *subscription; while (subscription = mqtt.readSubscription(1000)) { if (subscription == &onoffbutton) { - Serial.print(F("Got: ")); + Serial.print(F("Got: ")); Serial.println((char *)onoffbutton.lastread); } } - + // Now we can publish stuff! - Serial.print(F("\nSending photocell val ")); + Serial.print(F("\nSending photocell val ")); Serial.print(x); Serial.print("..."); if (! photocell.publish(x++)) { diff --git a/examples/mqtt_esp8266/mqtt_esp8266.ino b/examples/mqtt_esp8266/mqtt_esp8266.ino index 38bf909..fbf503e 100644 --- a/examples/mqtt_esp8266/mqtt_esp8266.ino +++ b/examples/mqtt_esp8266/mqtt_esp8266.ino @@ -1,4 +1,4 @@ -/*************************************************** +/*************************************************** Adafruit MQTT Library ESP8266 Example Must use ESP8266 Arduino from: @@ -7,11 +7,11 @@ 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 + 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. + Written by Tony DiCola for Adafruit Industries. MIT license, all text above must be included in any redistribution ****************************************************/ #include @@ -28,7 +28,7 @@ #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..."; +#define AIO_KEY "...your AIO key..." /************ Global State (you don't need to change this!) ******************/ @@ -38,7 +38,10 @@ WiFiClient 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; -const char MQTT_CLIENTID[] PROGMEM = AIO_KEY; +// 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 = AIO_KEY __DATE__ __TIME__; const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; @@ -47,12 +50,12 @@ Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, M /****************************** Feeds ***************************************/ -// Setup a feed called 'photocell' for publishing. +// 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. +// 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); @@ -68,7 +71,7 @@ void setup() { 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); @@ -76,7 +79,7 @@ void setup() { } Serial.println(); - Serial.println("WiFi connected"); + Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); // Setup MQTT subscription for onoff feed. @@ -97,7 +100,7 @@ void setup() { } Serial.println(F("Retrying MQTT connection")); mqtt.disconnect(); - delay(5000); + delay(5000); } Serial.println(F("MQTT Connected!")); } @@ -117,13 +120,13 @@ void loop() { Adafruit_MQTT_Subscribe *subscription; while (subscription = mqtt.readSubscription(1000)) { if (subscription == &onoffbutton) { - Serial.print(F("Got: ")); + Serial.print(F("Got: ")); Serial.println((char *)onoffbutton.lastread); } } - + // Now we can publish stuff! - Serial.print(F("\nSending photocell val ")); + Serial.print(F("\nSending photocell val ")); Serial.print(x); Serial.print("..."); if (! photocell.publish(x++)) { diff --git a/examples/mqtt_fona/mqtt_fona.ino b/examples/mqtt_fona/mqtt_fona.ino index f47b323..fd95690 100644 --- a/examples/mqtt_fona/mqtt_fona.ino +++ b/examples/mqtt_fona/mqtt_fona.ino @@ -1,20 +1,20 @@ -/*************************************************** +/*************************************************** Adafruit MQTT Library FONA Example - Designed specifically to work with the Adafruit FONA + Designed specifically to work with the Adafruit FONA ----> http://www.adafruit.com/products/1946 ----> http://www.adafruit.com/products/1963 ----> http://www.adafruit.com/products/2468 ----> http://www.adafruit.com/products/2542 - These cellular modules use TTL Serial to communicate, 2 pins are + These cellular modules use TTL Serial to communicate, 2 pins are required to interface. - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing products from Adafruit! - Written by Limor Fried/Ladyada for Adafruit Industries. + Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution ****************************************************/ #include @@ -48,14 +48,17 @@ Adafruit_FONA fona = Adafruit_FONA(FONA_RST); #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..."; +#define AIO_KEY "...your AIO key..." /************ Global State (you don't need to change this!) ******************/ // 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; -const char MQTT_CLIENTID[] PROGMEM = AIO_KEY; +// 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 = AIO_KEY __DATE__ __TIME__; const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; @@ -71,12 +74,12 @@ boolean FONAconnect(const __FlashStringHelper *apn, const __FlashStringHelper *u /****************************** Feeds ***************************************/ -// Setup a feed called 'photocell' for publishing. +// 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. +// 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); @@ -127,20 +130,20 @@ void loop() { case 5: Serial.println(F("Not authed")); break; case 6: Serial.println(F("Failed to subscribe")); break; default: { - Serial.println(F("Connection failed")); + Serial.println(F("Connection failed")); break; } } Serial.println(F("Retrying MQTT connection")); retries--; if (retries == 0) halt("Resetting system"); - delay(5000); + delay(5000); } Serial.println(F("MQTT Connected!")); - txfailures = 0; + txfailures = 0; } - + // Try to ping the MQTT server /* if (! mqtt.ping(3) ) { @@ -148,19 +151,19 @@ void loop() { Serial.println("Ping fail!"); } */ - + // this is our 'wait for incoming subscription packets' busy subloop Adafruit_MQTT_Subscribe *subscription; while (subscription = mqtt.readSubscription(5000)) { if (subscription == &onoffbutton) { - Serial.print(F("Got: ")); + Serial.print(F("Got: ")); Serial.println((char *)onoffbutton.lastread); } } - + // Now we can publish stuff! - Serial.print(F("\nSending photocell val ")); + Serial.print(F("\nSending photocell val ")); Serial.print(x); Serial.print("..."); if (! photocell.publish(x++)) {