Add date and time to client ID generation for more unique value.

This commit is contained in:
Tony DiCola 2015-07-06 13:43:52 -07:00
parent 207bcd44dd
commit 9b92bb379c
4 changed files with 62 additions and 53 deletions

View File

@ -68,7 +68,7 @@
// Largest full packet we're able to send. // Largest full packet we're able to send.
// Need to be able to store at least ~90 chars for a connect packet with full // Need to be able to store at least ~90 chars for a connect packet with full
// 23 char client ID. // 23 char client ID.
#define MAXBUFFERSIZE (105) #define MAXBUFFERSIZE (125)
#define MQTT_CONN_USERNAMEFLAG 0x80 #define MQTT_CONN_USERNAMEFLAG 0x80
#define MQTT_CONN_PASSWORDFLAG 0x40 #define MQTT_CONN_PASSWORDFLAG 0x40
@ -92,7 +92,7 @@ class Adafruit_MQTT_Subscribe; // forward decl
class Adafruit_MQTT { class Adafruit_MQTT {
public: 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); const char *user, const char *pass);
virtual ~Adafruit_MQTT() {} virtual ~Adafruit_MQTT() {}
@ -114,7 +114,7 @@ class Adafruit_MQTT {
// Publish a message to a topic using the specified QoS level. Returns true // Publish a message to a topic using the specified QoS level. Returns true
// if the message was published, false otherwise. // if the message was published, false otherwise.
bool publish(const char *topic, char *payload, uint8_t qos); bool publish(const char *topic, char *payload, uint8_t qos);
// Add a subscription to receive messages for a topic. Returns true if the // Add a subscription to receive messages for a topic. Returns true if the
// subscription could be added, false otherwise. // subscription could be added, false otherwise.
bool subscribe(Adafruit_MQTT_Subscribe *sub); bool subscribe(Adafruit_MQTT_Subscribe *sub);
@ -173,7 +173,7 @@ class Adafruit_MQTT_Publish {
// This might be ignored and a higher precision value sent. // This might be ignored and a higher precision value sent.
bool publish(int32_t i); bool publish(int32_t i);
bool publish(uint32_t i); bool publish(uint32_t i);
private: private:
Adafruit_MQTT *mqtt; Adafruit_MQTT *mqtt;
const char *topic; const char *topic;

View File

@ -1,14 +1,14 @@
/*************************************************** /***************************************************
Adafruit MQTT Library CC3000 Example Adafruit MQTT Library CC3000 Example
Designed specifically to work with the Adafruit WiFi products: Designed specifically to work with the Adafruit WiFi products:
----> https://www.adafruit.com/products/1469 ----> https://www.adafruit.com/products/1469
Adafruit invests time and resources providing this open source code, Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing please support Adafruit and open-source hardware by purchasing
products from Adafruit! 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 MIT license, all text above must be included in any redistribution
****************************************************/ ****************************************************/
#include <Adafruit_SleepyDog.h> #include <Adafruit_SleepyDog.h>
@ -30,7 +30,7 @@
#define WLAN_SSID "...your SSID..." // can't be longer than 32 characters! #define WLAN_SSID "...your SSID..." // can't be longer than 32 characters!
#define WLAN_PASS "...your password..." #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 // WLAN_SEC_WPA or WLAN_SEC_WPA2
/************************* Adafruit.io Setup *********************************/ /************************* Adafruit.io Setup *********************************/
@ -38,7 +38,7 @@
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 #define AIO_SERVERPORT 1883
#define AIO_USERNAME "...your AIO username (see https://accounts.adafruit.com)..." #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!) ******************/ /************ 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. // Store the MQTT server, client ID, username, and password in flash memory.
// This is required for using the Adafruit MQTT library. // This is required for using the Adafruit MQTT library.
const char MQTT_SERVER[] PROGMEM = AIO_SERVER; 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_USERNAME[] PROGMEM = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; 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 ***************************************/ /****************************** Feeds ***************************************/
// Setup a feed called 'photocell' for publishing. // Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname> // Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell"; const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell";
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, PHOTOCELL_FEED); 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"; const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED); Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
@ -84,7 +87,7 @@ void setup() {
// Initialise the CC3000 module // Initialise the CC3000 module
Serial.print(F("\nInit the CC3000...")); Serial.print(F("\nInit the CC3000..."));
if (!cc3000.begin()) if (!cc3000.begin())
halt("Failed"); halt("Failed");
mqtt.subscribe(&onoffbutton); mqtt.subscribe(&onoffbutton);
@ -107,17 +110,17 @@ void setup() {
case 5: Serial.println(F("Not authed")); break; case 5: Serial.println(F("Not authed")); break;
case 6: Serial.println(F("Failed to subscribe")); break; case 6: Serial.println(F("Failed to subscribe")); break;
default: { default: {
Serial.println(F("Connection failed")); Serial.println(F("Connection failed"));
CC3000connect(WLAN_SSID, WLAN_PASS, WLAN_SECURITY); // y0w, lets connect to wifi again CC3000connect(WLAN_SSID, WLAN_PASS, WLAN_SECURITY); // y0w, lets connect to wifi again
return; // restart the loop return; // restart the loop
} }
} }
Serial.println(F("Retrying MQTT connection")); Serial.println(F("Retrying MQTT connection"));
delay(5000); delay(5000);
} }
////////////////////////////// //////////////////////////////
Serial.println(F("MQTT Connected!")); Serial.println(F("MQTT Connected!"));
} }
uint32_t x=0; uint32_t x=0;
@ -125,7 +128,7 @@ uint32_t x=0;
void loop() { void loop() {
// Make sure to reset watchdog every loop iteration! // Make sure to reset watchdog every loop iteration!
Watchdog.reset(); Watchdog.reset();
// Try to ping the MQTT server // Try to ping the MQTT server
/* /*
if (! mqtt.ping(3) ) { if (! mqtt.ping(3) ) {
@ -140,13 +143,13 @@ void loop() {
Adafruit_MQTT_Subscribe *subscription; Adafruit_MQTT_Subscribe *subscription;
while (subscription = mqtt.readSubscription(1000)) { while (subscription = mqtt.readSubscription(1000)) {
if (subscription == &onoffbutton) { if (subscription == &onoffbutton) {
Serial.print(F("Got: ")); Serial.print(F("Got: "));
Serial.println((char *)onoffbutton.lastread); Serial.println((char *)onoffbutton.lastread);
} }
} }
// Now we can publish stuff! // Now we can publish stuff!
Serial.print(F("\nSending photocell val ")); Serial.print(F("\nSending photocell val "));
Serial.print(x); Serial.print(x);
Serial.print("..."); Serial.print("...");
if (! photocell.publish(x++)) { if (! photocell.publish(x++)) {

View File

@ -1,4 +1,4 @@
/*************************************************** /***************************************************
Adafruit MQTT Library ESP8266 Example Adafruit MQTT Library ESP8266 Example
Must use ESP8266 Arduino from: Must use ESP8266 Arduino from:
@ -7,11 +7,11 @@
Works great with Adafruit's Huzzah ESP board: Works great with Adafruit's Huzzah ESP board:
----> https://www.adafruit.com/product/2471 ----> https://www.adafruit.com/product/2471
Adafruit invests time and resources providing this open source code, Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing please support Adafruit and open-source hardware by purchasing
products from Adafruit! 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 MIT license, all text above must be included in any redistribution
****************************************************/ ****************************************************/
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
@ -28,7 +28,7 @@
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 #define AIO_SERVERPORT 1883
#define AIO_USERNAME "...your AIO username (see https://accounts.adafruit.com)..." #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!) ******************/ /************ 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. // Store the MQTT server, client ID, username, and password in flash memory.
// This is required for using the Adafruit MQTT library. // This is required for using the Adafruit MQTT library.
const char MQTT_SERVER[] PROGMEM = AIO_SERVER; 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_USERNAME[] PROGMEM = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
@ -47,12 +50,12 @@ Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, M
/****************************** Feeds ***************************************/ /****************************** Feeds ***************************************/
// Setup a feed called 'photocell' for publishing. // Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname> // Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell"; const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell";
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, PHOTOCELL_FEED); 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"; const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED); Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
@ -68,7 +71,7 @@ void setup() {
Serial.println(); Serial.println(); Serial.println(); Serial.println();
Serial.print("Connecting to "); Serial.print("Connecting to ");
Serial.println(WLAN_SSID); Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS); WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
delay(500); delay(500);
@ -76,7 +79,7 @@ void setup() {
} }
Serial.println(); Serial.println();
Serial.println("WiFi connected"); Serial.println("WiFi connected");
Serial.println("IP address: "); Serial.println(WiFi.localIP()); Serial.println("IP address: "); Serial.println(WiFi.localIP());
// Setup MQTT subscription for onoff feed. // Setup MQTT subscription for onoff feed.
@ -97,7 +100,7 @@ void setup() {
} }
Serial.println(F("Retrying MQTT connection")); Serial.println(F("Retrying MQTT connection"));
mqtt.disconnect(); mqtt.disconnect();
delay(5000); delay(5000);
} }
Serial.println(F("MQTT Connected!")); Serial.println(F("MQTT Connected!"));
} }
@ -117,13 +120,13 @@ void loop() {
Adafruit_MQTT_Subscribe *subscription; Adafruit_MQTT_Subscribe *subscription;
while (subscription = mqtt.readSubscription(1000)) { while (subscription = mqtt.readSubscription(1000)) {
if (subscription == &onoffbutton) { if (subscription == &onoffbutton) {
Serial.print(F("Got: ")); Serial.print(F("Got: "));
Serial.println((char *)onoffbutton.lastread); Serial.println((char *)onoffbutton.lastread);
} }
} }
// Now we can publish stuff! // Now we can publish stuff!
Serial.print(F("\nSending photocell val ")); Serial.print(F("\nSending photocell val "));
Serial.print(x); Serial.print(x);
Serial.print("..."); Serial.print("...");
if (! photocell.publish(x++)) { if (! photocell.publish(x++)) {

View File

@ -1,20 +1,20 @@
/*************************************************** /***************************************************
Adafruit MQTT Library FONA Example 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/1946
----> http://www.adafruit.com/products/1963 ----> http://www.adafruit.com/products/1963
----> http://www.adafruit.com/products/2468 ----> http://www.adafruit.com/products/2468
----> http://www.adafruit.com/products/2542 ----> 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. required to interface.
Adafruit invests time and resources providing this open source code, Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing please support Adafruit and open-source hardware by purchasing
products from Adafruit! 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 MIT license, all text above must be included in any redistribution
****************************************************/ ****************************************************/
#include <Adafruit_SleepyDog.h> #include <Adafruit_SleepyDog.h>
@ -48,14 +48,17 @@ Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 #define AIO_SERVERPORT 1883
#define AIO_USERNAME "...your AIO username (see https://accounts.adafruit.com)..." #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!) ******************/ /************ Global State (you don't need to change this!) ******************/
// Store the MQTT server, client ID, username, and password in flash memory. // Store the MQTT server, client ID, username, and password in flash memory.
// This is required for using the Adafruit MQTT library. // This is required for using the Adafruit MQTT library.
const char MQTT_SERVER[] PROGMEM = AIO_SERVER; 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_USERNAME[] PROGMEM = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
@ -71,12 +74,12 @@ boolean FONAconnect(const __FlashStringHelper *apn, const __FlashStringHelper *u
/****************************** Feeds ***************************************/ /****************************** Feeds ***************************************/
// Setup a feed called 'photocell' for publishing. // Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname> // Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell"; const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell";
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, PHOTOCELL_FEED); 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"; const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED); 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 5: Serial.println(F("Not authed")); break;
case 6: Serial.println(F("Failed to subscribe")); break; case 6: Serial.println(F("Failed to subscribe")); break;
default: { default: {
Serial.println(F("Connection failed")); Serial.println(F("Connection failed"));
break; break;
} }
} }
Serial.println(F("Retrying MQTT connection")); Serial.println(F("Retrying MQTT connection"));
retries--; retries--;
if (retries == 0) halt("Resetting system"); if (retries == 0) halt("Resetting system");
delay(5000); delay(5000);
} }
Serial.println(F("MQTT Connected!")); Serial.println(F("MQTT Connected!"));
txfailures = 0; txfailures = 0;
} }
// Try to ping the MQTT server // Try to ping the MQTT server
/* /*
if (! mqtt.ping(3) ) { if (! mqtt.ping(3) ) {
@ -148,19 +151,19 @@ void loop() {
Serial.println("Ping fail!"); Serial.println("Ping fail!");
} }
*/ */
// this is our 'wait for incoming subscription packets' busy subloop // this is our 'wait for incoming subscription packets' busy subloop
Adafruit_MQTT_Subscribe *subscription; Adafruit_MQTT_Subscribe *subscription;
while (subscription = mqtt.readSubscription(5000)) { while (subscription = mqtt.readSubscription(5000)) {
if (subscription == &onoffbutton) { if (subscription == &onoffbutton) {
Serial.print(F("Got: ")); Serial.print(F("Got: "));
Serial.println((char *)onoffbutton.lastread); Serial.println((char *)onoffbutton.lastread);
} }
} }
// Now we can publish stuff! // Now we can publish stuff!
Serial.print(F("\nSending photocell val ")); Serial.print(F("\nSending photocell val "));
Serial.print(x); Serial.print(x);
Serial.print("..."); Serial.print("...");
if (! photocell.publish(x++)) { if (! photocell.publish(x++)) {