Compare commits
No commits in common. "master_upstream" and "0.14.3" have entirely different histories.
master_ups
...
0.14.3
@ -30,21 +30,6 @@ static char *dtostrf (double val, signed char width, unsigned char prec, char *s
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(ESP8266)
|
||||
int strncasecmp(const char * str1, const char * str2, int len) {
|
||||
int d = 0;
|
||||
while(len--) {
|
||||
int c1 = tolower(*str1++);
|
||||
int c2 = tolower(*str2++);
|
||||
if(((d = c1 - c2) != 0) || (c2 == '\0')) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void printBuffer(uint8_t *buffer, uint16_t len) {
|
||||
DEBUG_PRINTER.print('\t');
|
||||
for (uint16_t i=0; i<len; i++) {
|
||||
@ -74,11 +59,11 @@ static uint8_t *stringprint(uint8_t *p, char *s) {
|
||||
}
|
||||
*/
|
||||
|
||||
static uint8_t *stringprint(uint8_t *p, const char *s, uint16_t maxlen=0) {
|
||||
static uint8_t *stringprint_P(uint8_t *p, const char *s, uint16_t maxlen=0) {
|
||||
// If maxlen is specified (has a non-zero value) then use it as the maximum
|
||||
// length of the source string to write to the buffer. Otherwise write
|
||||
// the entire source string.
|
||||
uint16_t len = strlen(s);
|
||||
uint16_t len = strlen_P(s);
|
||||
if (maxlen > 0 && len > maxlen) {
|
||||
len = maxlen;
|
||||
}
|
||||
@ -89,7 +74,7 @@ static uint8_t *stringprint(uint8_t *p, const char *s, uint16_t maxlen=0) {
|
||||
*/
|
||||
p[0] = len >> 8; p++;
|
||||
p[0] = len & 0xFF; p++;
|
||||
strncpy((char *)p, s, len);
|
||||
strncpy_P((char *)p, s, len);
|
||||
return p+len;
|
||||
}
|
||||
|
||||
@ -121,6 +106,31 @@ Adafruit_MQTT::Adafruit_MQTT(const char *server,
|
||||
|
||||
}
|
||||
|
||||
Adafruit_MQTT::Adafruit_MQTT(const __FlashStringHelper *server,
|
||||
uint16_t port,
|
||||
const __FlashStringHelper *cid,
|
||||
const __FlashStringHelper *user,
|
||||
const __FlashStringHelper *pass) {
|
||||
|
||||
servername = (const char *)server;
|
||||
portnum = port;
|
||||
clientid = (const char *)cid;
|
||||
username = (const char *)user;
|
||||
password = (const char *)pass;
|
||||
|
||||
// reset subscriptions
|
||||
for (uint8_t i=0; i<MAXSUBSCRIPTIONS; i++) {
|
||||
subscriptions[i] = 0;
|
||||
}
|
||||
|
||||
will_topic = 0;
|
||||
will_payload = 0;
|
||||
will_qos = 0;
|
||||
will_retain = 0;
|
||||
|
||||
packet_id_counter = 0;
|
||||
|
||||
}
|
||||
|
||||
Adafruit_MQTT::Adafruit_MQTT(const char *server,
|
||||
uint16_t port,
|
||||
@ -146,6 +156,31 @@ Adafruit_MQTT::Adafruit_MQTT(const char *server,
|
||||
|
||||
}
|
||||
|
||||
Adafruit_MQTT::Adafruit_MQTT(const __FlashStringHelper *server,
|
||||
uint16_t port,
|
||||
const __FlashStringHelper *user,
|
||||
const __FlashStringHelper *pass) {
|
||||
|
||||
servername = (const char *)server;
|
||||
portnum = port;
|
||||
clientid = "";
|
||||
username = (const char *)user;
|
||||
password = (const char *)pass;
|
||||
|
||||
// reset subscriptions
|
||||
for (uint8_t i=0; i<MAXSUBSCRIPTIONS; i++) {
|
||||
subscriptions[i] = 0;
|
||||
}
|
||||
|
||||
will_topic = 0;
|
||||
will_payload = 0;
|
||||
will_qos = 0;
|
||||
will_retain = 0;
|
||||
|
||||
packet_id_counter = 0;
|
||||
|
||||
}
|
||||
|
||||
int8_t Adafruit_MQTT::connect() {
|
||||
// Connect to the server.
|
||||
if (!connectServer())
|
||||
@ -197,13 +232,6 @@ int8_t Adafruit_MQTT::connect() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t Adafruit_MQTT::connect(const char *user, const char *pass)
|
||||
{
|
||||
username = user;
|
||||
password = pass;
|
||||
return connect();
|
||||
}
|
||||
|
||||
uint16_t Adafruit_MQTT::processPacketsUntil(uint8_t *buffer, uint8_t waitforpackettype, uint16_t timeout) {
|
||||
uint16_t len;
|
||||
while (len = readFullPacket(buffer, MAXBUFFERSIZE, timeout)) {
|
||||
@ -413,6 +441,7 @@ void Adafruit_MQTT::processPackets(int16_t timeout) {
|
||||
|
||||
while (elapsed < (uint32_t)timeout) {
|
||||
Adafruit_MQTT_Subscribe *sub = readSubscription(timeout - elapsed);
|
||||
|
||||
if (sub) {
|
||||
//Serial.println("**** sub packet received");
|
||||
if (sub->callback_uint32t != NULL) {
|
||||
@ -431,14 +460,9 @@ void Adafruit_MQTT::processPackets(int16_t timeout) {
|
||||
}
|
||||
else if (sub->callback_buffer != NULL) {
|
||||
// huh lets do the callback in buffer mode
|
||||
//Serial.print("*** calling buffer callback with : "); Serial.println((char *)sub->lastread);
|
||||
//Serial.print("*** calling buffer callback with : "); Serial.println(data);
|
||||
sub->callback_buffer((char *)sub->lastread, sub->datalen);
|
||||
}
|
||||
else if (sub->callback_io != NULL) {
|
||||
// huh lets do the callback in io mode
|
||||
//Serial.print("*** calling io instance callback with : "); Serial.println((char *)sub->lastread);
|
||||
((sub->io_mqtt)->*(sub->callback_io))((char *)sub->lastread, sub->datalen);
|
||||
}
|
||||
}
|
||||
|
||||
// keep track over elapsed time
|
||||
@ -469,11 +493,11 @@ Adafruit_MQTT_Subscribe *Adafruit_MQTT::readSubscription(int16_t timeout) {
|
||||
if (subscriptions[i]) {
|
||||
// Skip this subscription if its name length isn't the same as the
|
||||
// received topic name.
|
||||
if (strlen(subscriptions[i]->topic) != topiclen)
|
||||
if (strlen_P(subscriptions[i]->topic) != topiclen)
|
||||
continue;
|
||||
// Stop if the subscription topic matches the received topic. Be careful
|
||||
// to make comparison case insensitive.
|
||||
if (strncasecmp((char*)buffer+4, subscriptions[i]->topic, topiclen) == 0) {
|
||||
if (strncasecmp_P((char*)buffer+4, subscriptions[i]->topic, topiclen) == 0) {
|
||||
DEBUG_PRINT(F("Found sub #")); DEBUG_PRINTLN(i);
|
||||
break;
|
||||
}
|
||||
@ -558,9 +582,9 @@ uint8_t Adafruit_MQTT::connectPacket(uint8_t *packet) {
|
||||
// fill in packet[1] last
|
||||
|
||||
#if MQTT_PROTOCOL_LEVEL == 3
|
||||
p = stringprint(p, "MQIsdp");
|
||||
p = stringprint_P(p, PSTR("MQIsdp"));
|
||||
#elif MQTT_PROTOCOL_LEVEL == 4
|
||||
p = stringprint(p, "MQTT");
|
||||
p = stringprint_P(p, PSTR("MQTT"));
|
||||
#else
|
||||
#error "MQTT level not supported"
|
||||
#endif
|
||||
@ -598,10 +622,10 @@ uint8_t Adafruit_MQTT::connectPacket(uint8_t *packet) {
|
||||
p++;
|
||||
|
||||
if(MQTT_PROTOCOL_LEVEL == 3) {
|
||||
p = stringprint(p, clientid, 23); // Limit client ID to first 23 characters.
|
||||
p = stringprint_P(p, clientid, 23); // Limit client ID to first 23 characters.
|
||||
} else {
|
||||
if (pgm_read_byte(clientid) != 0) {
|
||||
p = stringprint(p, clientid);
|
||||
p = stringprint_P(p, clientid);
|
||||
} else {
|
||||
p[0] = 0x0;
|
||||
p++;
|
||||
@ -612,15 +636,15 @@ uint8_t Adafruit_MQTT::connectPacket(uint8_t *packet) {
|
||||
}
|
||||
|
||||
if (will_topic && pgm_read_byte(will_topic) != 0) {
|
||||
p = stringprint(p, will_topic);
|
||||
p = stringprint(p, will_payload);
|
||||
p = stringprint_P(p, will_topic);
|
||||
p = stringprint_P(p, will_payload);
|
||||
}
|
||||
|
||||
if (pgm_read_byte(username) != 0) {
|
||||
p = stringprint(p, username);
|
||||
p = stringprint_P(p, username);
|
||||
}
|
||||
if (pgm_read_byte(password) != 0) {
|
||||
p = stringprint(p, password);
|
||||
p = stringprint_P(p, password);
|
||||
}
|
||||
|
||||
len = p - packet;
|
||||
@ -640,7 +664,7 @@ uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic,
|
||||
|
||||
// calc length of non-header data
|
||||
len += 2; // two bytes to set the topic size
|
||||
len += strlen(topic); // topic length
|
||||
len += strlen_P(topic); // topic length
|
||||
if(qos > 0) {
|
||||
len += 2; // qos packet id
|
||||
}
|
||||
@ -663,7 +687,7 @@ uint16_t Adafruit_MQTT::publishPacket(uint8_t *packet, const char *topic,
|
||||
} while ( len > 0 );
|
||||
|
||||
// topic comes before packet identifier
|
||||
p = stringprint(p, topic);
|
||||
p = stringprint_P(p, topic);
|
||||
|
||||
// add packet identifier. used for checking PUBACK in QOS > 0
|
||||
if(qos > 0) {
|
||||
@ -700,7 +724,7 @@ uint8_t Adafruit_MQTT::subscribePacket(uint8_t *packet, const char *topic,
|
||||
// increment the packet id
|
||||
packet_id_counter++;
|
||||
|
||||
p = stringprint(p, topic);
|
||||
p = stringprint_P(p, topic);
|
||||
|
||||
p[0] = qos;
|
||||
p++;
|
||||
@ -731,7 +755,7 @@ uint8_t Adafruit_MQTT::unsubscribePacket(uint8_t *packet, const char *topic) {
|
||||
// increment the packet id
|
||||
packet_id_counter++;
|
||||
|
||||
p = stringprint(p, topic);
|
||||
p = stringprint_P(p, topic);
|
||||
|
||||
len = p - packet;
|
||||
packet[1] = len-2; // don't include the 2 bytes of fixed header data
|
||||
@ -775,15 +799,17 @@ Adafruit_MQTT_Publish::Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver,
|
||||
topic = feed;
|
||||
qos = q;
|
||||
}
|
||||
bool Adafruit_MQTT_Publish::publish(int32_t i) {
|
||||
char payload[12];
|
||||
ltoa(i, payload, 10);
|
||||
return mqtt->publish(topic, payload, qos);
|
||||
|
||||
Adafruit_MQTT_Publish::Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver,
|
||||
const __FlashStringHelper *feed, uint8_t q) {
|
||||
mqtt = mqttserver;
|
||||
topic = (const char *)feed;
|
||||
qos = q;
|
||||
}
|
||||
|
||||
bool Adafruit_MQTT_Publish::publish(uint32_t i) {
|
||||
char payload[11];
|
||||
ultoa(i, payload, 10);
|
||||
bool Adafruit_MQTT_Publish::publish(int32_t i) {
|
||||
char payload[18];
|
||||
itoa(i, payload, 10);
|
||||
return mqtt->publish(topic, payload, qos);
|
||||
}
|
||||
|
||||
@ -793,6 +819,12 @@ bool Adafruit_MQTT_Publish::publish(double f, uint8_t precision) {
|
||||
return mqtt->publish(topic, payload, qos);
|
||||
}
|
||||
|
||||
bool Adafruit_MQTT_Publish::publish(uint32_t i) {
|
||||
char payload[18];
|
||||
itoa(i, payload, 10);
|
||||
return mqtt->publish(topic, payload, qos);
|
||||
}
|
||||
|
||||
bool Adafruit_MQTT_Publish::publish(const char *payload) {
|
||||
return mqtt->publish(topic, payload, qos);
|
||||
}
|
||||
@ -815,8 +847,17 @@ Adafruit_MQTT_Subscribe::Adafruit_MQTT_Subscribe(Adafruit_MQTT *mqttserver,
|
||||
callback_uint32t = 0;
|
||||
callback_buffer = 0;
|
||||
callback_double = 0;
|
||||
callback_io = 0;
|
||||
io_mqtt = 0;
|
||||
}
|
||||
|
||||
Adafruit_MQTT_Subscribe::Adafruit_MQTT_Subscribe(Adafruit_MQTT *mqttserver,
|
||||
const __FlashStringHelper *feed, uint8_t q) {
|
||||
mqtt = mqttserver;
|
||||
topic = (const char *)feed;
|
||||
qos = q;
|
||||
datalen = 0;
|
||||
callback_uint32t = 0;
|
||||
callback_buffer = 0;
|
||||
callback_double = 0;
|
||||
}
|
||||
|
||||
void Adafruit_MQTT_Subscribe::setCallback(SubscribeCallbackUInt32Type cb) {
|
||||
@ -831,15 +872,8 @@ void Adafruit_MQTT_Subscribe::setCallback(SubscribeCallbackBufferType cb) {
|
||||
callback_buffer = cb;
|
||||
}
|
||||
|
||||
void Adafruit_MQTT_Subscribe::setCallback(AdafruitIO_MQTT *io, SubscribeCallbackIOType cb) {
|
||||
callback_io = cb;
|
||||
io_mqtt= io;
|
||||
}
|
||||
|
||||
void Adafruit_MQTT_Subscribe::removeCallback(void) {
|
||||
callback_uint32t = 0;
|
||||
callback_buffer = 0;
|
||||
callback_double = 0;
|
||||
callback_io = 0;
|
||||
io_mqtt = 0;
|
||||
}
|
||||
|
@ -29,10 +29,6 @@
|
||||
#define strncasecmp_P(f1, f2, len) strncasecmp((f1), (f2), (len))
|
||||
#endif
|
||||
|
||||
#define ADAFRUIT_MQTT_VERSION_MAJOR 0
|
||||
#define ADAFRUIT_MQTT_VERSION_MINOR 17
|
||||
#define ADAFRUIT_MQTT_VERSION_PATCH 0
|
||||
|
||||
// Uncomment/comment to turn on/off debug output messages.
|
||||
//#define MQTT_DEBUG
|
||||
// Uncomment/comment to turn on/off error output messages.
|
||||
@ -110,13 +106,7 @@
|
||||
|
||||
// how much data we save in a subscription object
|
||||
// eg max-subscription-payload-size
|
||||
#if defined (__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__)
|
||||
#define SUBSCRIPTIONDATALEN 20
|
||||
#else
|
||||
#define SUBSCRIPTIONDATALEN 100
|
||||
#endif
|
||||
|
||||
class AdafruitIO_MQTT; // forward decl
|
||||
#define SUBSCRIPTIONDATALEN 20
|
||||
|
||||
//Function pointer that returns an int
|
||||
typedef void (*SubscribeCallbackUInt32Type)(uint32_t);
|
||||
@ -124,8 +114,6 @@ typedef void (*SubscribeCallbackUInt32Type)(uint32_t);
|
||||
typedef void (*SubscribeCallbackDoubleType)(double);
|
||||
// returns a chunk of raw data
|
||||
typedef void (*SubscribeCallbackBufferType)(char *str, uint16_t len);
|
||||
// returns an io data wrapper instance
|
||||
typedef void (AdafruitIO_MQTT::*SubscribeCallbackIOType)(char *str, uint16_t len);
|
||||
|
||||
extern void printBuffer(uint8_t *buffer, uint16_t len);
|
||||
|
||||
@ -138,11 +126,19 @@ class Adafruit_MQTT {
|
||||
const char *cid,
|
||||
const char *user,
|
||||
const char *pass);
|
||||
|
||||
Adafruit_MQTT(const __FlashStringHelper *server,
|
||||
uint16_t port,
|
||||
const __FlashStringHelper *cid,
|
||||
const __FlashStringHelper *user,
|
||||
const __FlashStringHelper *pass);
|
||||
Adafruit_MQTT(const char *server,
|
||||
uint16_t port,
|
||||
const char *user = "",
|
||||
const char *pass = "");
|
||||
const char *user,
|
||||
const char *pass);
|
||||
Adafruit_MQTT(const __FlashStringHelper *server,
|
||||
uint16_t port,
|
||||
const __FlashStringHelper *user,
|
||||
const __FlashStringHelper *pass);
|
||||
virtual ~Adafruit_MQTT() {}
|
||||
|
||||
// Connect to the MQTT server. Returns 0 on success, otherwise an error code
|
||||
@ -157,7 +153,6 @@ class Adafruit_MQTT {
|
||||
// Use connectErrorString() to get a printable string version of the
|
||||
// error.
|
||||
int8_t connect();
|
||||
int8_t connect(const char *user, const char *pass);
|
||||
|
||||
// Return a printable string version of the error code returned by
|
||||
// connect(). This returns a __FlashStringHelper*, which points to a
|
||||
@ -175,11 +170,19 @@ class Adafruit_MQTT {
|
||||
// to be called before connect() because it is sent as part of the
|
||||
// connect control packet.
|
||||
bool will(const char *topic, const char *payload, uint8_t qos = 0, uint8_t retain = 0);
|
||||
bool will(const __FlashStringHelper *topic, const char *payload, uint8_t qos = 0, uint8_t retain = 0) {
|
||||
return will((const char *)topic, payload, qos, retain);
|
||||
}
|
||||
|
||||
// Publish a message to a topic using the specified QoS level. Returns true
|
||||
// if the message was published, false otherwise.
|
||||
// The topic must be stored in PROGMEM. It can either be a
|
||||
// char*, or a __FlashStringHelper* (the result of the F() macro).
|
||||
bool publish(const char *topic, const char *payload, uint8_t qos = 0);
|
||||
bool publish(const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos = 0);
|
||||
bool publish(const __FlashStringHelper *topic, const char *payload, uint8_t qos = 0) {
|
||||
return publish((const char *)topic, payload, qos);
|
||||
}
|
||||
|
||||
// Add a subscription to receive messages for a topic. Returns true if the
|
||||
// subscription could be added or was already present, false otherwise.
|
||||
@ -255,6 +258,7 @@ class Adafruit_MQTT {
|
||||
class Adafruit_MQTT_Publish {
|
||||
public:
|
||||
Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, const char *feed, uint8_t qos = 0);
|
||||
Adafruit_MQTT_Publish(Adafruit_MQTT *mqttserver, const __FlashStringHelper *feed, uint8_t qos = 0);
|
||||
|
||||
bool publish(const char *s);
|
||||
bool publish(double f, uint8_t precision=2); // Precision controls the minimum number of digits after decimal.
|
||||
@ -273,11 +277,11 @@ private:
|
||||
class Adafruit_MQTT_Subscribe {
|
||||
public:
|
||||
Adafruit_MQTT_Subscribe(Adafruit_MQTT *mqttserver, const char *feedname, uint8_t q=0);
|
||||
Adafruit_MQTT_Subscribe(Adafruit_MQTT *mqttserver, const __FlashStringHelper *feedname, uint8_t q=0);
|
||||
|
||||
void setCallback(SubscribeCallbackUInt32Type callb);
|
||||
void setCallback(SubscribeCallbackDoubleType callb);
|
||||
void setCallback(SubscribeCallbackBufferType callb);
|
||||
void setCallback(AdafruitIO_MQTT *io, SubscribeCallbackIOType callb);
|
||||
void removeCallback(void);
|
||||
|
||||
const char *topic;
|
||||
@ -291,9 +295,6 @@ class Adafruit_MQTT_Subscribe {
|
||||
SubscribeCallbackUInt32Type callback_uint32t;
|
||||
SubscribeCallbackDoubleType callback_double;
|
||||
SubscribeCallbackBufferType callback_buffer;
|
||||
SubscribeCallbackIOType callback_io;
|
||||
|
||||
AdafruitIO_MQTT *io_mqtt;
|
||||
|
||||
private:
|
||||
Adafruit_MQTT *mqtt;
|
||||
|
152
Adafruit_MQTT_CC3000.h
Normal file
152
Adafruit_MQTT_CC3000.h
Normal file
@ -0,0 +1,152 @@
|
||||
// The MIT License (MIT)
|
||||
//
|
||||
// Copyright (c) 2015 Adafruit Industries
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
#ifndef _ADAFRUIT_MQTT_CC3000_H_
|
||||
#define _ADAFRUIT_MQTT_CC3000_H_
|
||||
|
||||
#include <Adafruit_SleepyDog.h>
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include "Adafruit_MQTT.h"
|
||||
|
||||
|
||||
// delay in ms between calls of available()
|
||||
#define MQTT_CC3000_INTERAVAILDELAY 10
|
||||
|
||||
|
||||
// CC3000-specific version of the Adafruit_MQTT class.
|
||||
// Note that this is defined as a header-only class to prevent issues with using
|
||||
// the library on non-CC3000 platforms (since Arduino will include all .cpp files
|
||||
// in the compilation of the library).
|
||||
class Adafruit_MQTT_CC3000 : public Adafruit_MQTT {
|
||||
public:
|
||||
Adafruit_MQTT_CC3000(Adafruit_CC3000 *cc3k, const char *server, uint16_t port,
|
||||
const char *cid, const char *user, const char *pass):
|
||||
Adafruit_MQTT(server, port, cid, user, pass),
|
||||
cc3000(cc3k)
|
||||
{}
|
||||
|
||||
Adafruit_MQTT_CC3000(Adafruit_CC3000 *cc3k, const char *server, uint16_t port,
|
||||
const char *user, const char *pass):
|
||||
Adafruit_MQTT(server, port, user, pass),
|
||||
cc3000(cc3k)
|
||||
{}
|
||||
|
||||
bool connectServer() {
|
||||
uint32_t ip = 0;
|
||||
|
||||
Watchdog.reset();
|
||||
|
||||
// look up IP address
|
||||
if (serverip == 0) {
|
||||
// Try looking up the website's IP address using CC3K's built in getHostByName
|
||||
strcpy_P((char *)buffer, servername);
|
||||
Serial.print((char *)buffer); Serial.print(F(" -> "));
|
||||
uint8_t dnsretries = 5;
|
||||
|
||||
Watchdog.reset();
|
||||
while (ip == 0) {
|
||||
if (! cc3000->getHostByName((char *)buffer, &ip)) {
|
||||
Serial.println(F("Couldn't resolve!"));
|
||||
dnsretries--;
|
||||
Watchdog.reset();
|
||||
}
|
||||
//Serial.println("OK"); Serial.println(ip, HEX);
|
||||
if (!dnsretries) return false;
|
||||
delay(500);
|
||||
}
|
||||
|
||||
serverip = ip;
|
||||
cc3000->printIPdotsRev(serverip);
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
Watchdog.reset();
|
||||
|
||||
// connect to server
|
||||
DEBUG_PRINTLN(F("Connecting to TCP"));
|
||||
mqttclient = cc3000->connectTCP(serverip, portnum);
|
||||
|
||||
return mqttclient.connected();
|
||||
}
|
||||
|
||||
bool disconnectServer() {
|
||||
if (connected()) {
|
||||
return (mqttclient.close() == 0);
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool connected() {
|
||||
return mqttclient.connected();
|
||||
}
|
||||
|
||||
uint16_t readPacket(uint8_t *buffer, uint16_t maxlen, int16_t timeout) {
|
||||
/* Read data until either the connection is closed, or the idle timeout is reached. */
|
||||
uint16_t len = 0;
|
||||
int16_t t = timeout;
|
||||
|
||||
while (mqttclient.connected() && (timeout >= 0)) {
|
||||
//DEBUG_PRINT('.');
|
||||
while (mqttclient.available()) {
|
||||
//DEBUG_PRINT('!');
|
||||
char c = mqttclient.read();
|
||||
timeout = t; // reset the timeout
|
||||
buffer[len] = c;
|
||||
//DEBUG_PRINTLN((uint8_t)c, HEX);
|
||||
len++;
|
||||
if (len == maxlen) { // we read all we want, bail
|
||||
DEBUG_PRINT(F("Read packet:\t"));
|
||||
DEBUG_PRINTBUFFER(buffer, len);
|
||||
return len;
|
||||
}
|
||||
}
|
||||
Watchdog.reset();
|
||||
timeout -= MQTT_CC3000_INTERAVAILDELAY;
|
||||
delay(MQTT_CC3000_INTERAVAILDELAY);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
bool sendPacket(uint8_t *buffer, uint8_t len) {
|
||||
if (mqttclient.connected()) {
|
||||
uint16_t ret = mqttclient.write(buffer, len);
|
||||
DEBUG_PRINT(F("sendPacket returned: ")); DEBUG_PRINTLN(ret);
|
||||
if (ret != len) {
|
||||
DEBUG_PRINTLN("Failed to send complete packet.")
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
DEBUG_PRINTLN(F("Connection failed!"));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
uint32_t serverip;
|
||||
Adafruit_CC3000 *cc3000;
|
||||
Adafruit_CC3000_Client mqttclient;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
@ -25,7 +25,7 @@
|
||||
bool Adafruit_MQTT_Client::connectServer() {
|
||||
// Grab server name from flash and copy to buffer for name resolution.
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
strcpy((char *)buffer, servername);
|
||||
strcpy_P((char *)buffer, servername);
|
||||
DEBUG_PRINT(F("Connecting to: ")); DEBUG_PRINTLN((char *)buffer);
|
||||
// Connect and check for success (0 result).
|
||||
int r = client->connect((char *)buffer, portnum);
|
||||
@ -81,7 +81,7 @@ bool Adafruit_MQTT_Client::sendPacket(uint8_t *buffer, uint16_t len) {
|
||||
if (client->connected()) {
|
||||
// send 250 bytes at most at a time, can adjust this later based on Client
|
||||
|
||||
uint16_t sendlen = len > 250 ? 250 : len;
|
||||
uint16_t sendlen = min(len, 250);
|
||||
//Serial.print("Sending: "); Serial.println(sendlen);
|
||||
ret = client->write(buffer, sendlen);
|
||||
DEBUG_PRINT(F("Client sendPacket returned: ")); DEBUG_PRINTLN(ret);
|
||||
|
@ -42,7 +42,7 @@ class Adafruit_MQTT_Client : public Adafruit_MQTT {
|
||||
{}
|
||||
|
||||
Adafruit_MQTT_Client(Client *client, const char *server, uint16_t port,
|
||||
const char *user="", const char *pass=""):
|
||||
const char *user, const char *pass):
|
||||
Adafruit_MQTT(server, port, user, pass),
|
||||
client(client)
|
||||
{}
|
||||
|
@ -42,14 +42,14 @@ class Adafruit_MQTT_FONA : public Adafruit_MQTT {
|
||||
{}
|
||||
|
||||
Adafruit_MQTT_FONA(Adafruit_FONA *f, const char *server, uint16_t port,
|
||||
const char *user="", const char *pass=""):
|
||||
const char *user, const char *pass):
|
||||
Adafruit_MQTT(server, port, user, pass),
|
||||
fona(f)
|
||||
{}
|
||||
|
||||
bool connectServer() {
|
||||
char server[40];
|
||||
strncpy(server, servername, 40);
|
||||
strncpy_P(server, servername, 40);
|
||||
#ifdef ADAFRUIT_SLEEPYDOG_H
|
||||
Watchdog.reset();
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Adafruit MQTT Library [![Build Status](https://travis-ci.org/adafruit/Adafruit_MQTT_Library.svg?branch=master)](https://travis-ci.org/adafruit/Adafruit_MQTT_Library)
|
||||
|
||||
Arduino library for MQTT support, including access to Adafruit IO. Works with
|
||||
the Adafruit FONA, Arduino Yun, ESP8266 Arduino platforms, and anything that supports
|
||||
the Adafruit CC3000, FONA, Arduino Yun, ESP8266 Arduino platforms, and anything that supports
|
||||
Arduino's Client interface (like Ethernet shield).
|
||||
|
||||
See included examples for how to use the library to access an MQTT service to
|
||||
@ -11,7 +11,10 @@ spec but is intended to support enough for QoS 0 and 1 publishing.
|
||||
Depends on the following other libraries depending on the target platform:
|
||||
|
||||
- [Adafruit SleepyDog](https://github.com/adafruit/Adafruit_SleepyDog), watchdog
|
||||
library used by FONA code for reliability.
|
||||
library used by FONA and CC3000 code for reliability.
|
||||
|
||||
- [Adafruit CC3000](https://github.com/adafruit/Adafruit_CC3000_Library), required
|
||||
for the CC3000 hardware.
|
||||
|
||||
- [Adafruit FONA](https://github.com/adafruit/Adafruit_FONA_Library), required for
|
||||
the FONA hardware.
|
||||
|
@ -1,122 +0,0 @@
|
||||
/***************************************************
|
||||
Adafruit MQTT Library ESP8266 Adafruit IO Anonymous Time Query
|
||||
|
||||
Must use the latest version of ESP8266 Arduino from:
|
||||
https://github.com/esp8266/Arduino
|
||||
|
||||
Works great with Adafruit's Huzzah ESP board & Feather
|
||||
----> https://www.adafruit.com/product/2471
|
||||
----> https://www.adafruit.com/products/2821
|
||||
|
||||
Adafruit invests time and resources providing this open source code,
|
||||
please support Adafruit and open-source hardware by purchasing
|
||||
products from Adafruit!
|
||||
|
||||
Written by Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#include <ESP8266WiFi.h>
|
||||
#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 8883
|
||||
|
||||
WiFiClientSecure client;
|
||||
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT);
|
||||
|
||||
Adafruit_MQTT_Subscribe timefeed = Adafruit_MQTT_Subscribe(&mqtt, "time/seconds");
|
||||
|
||||
// set timezone offset from UTC
|
||||
int timeZone = -4; // UTC - 4 eastern daylight time (nyc)
|
||||
int interval = 4; // trigger every X hours
|
||||
|
||||
int last_min = -1;
|
||||
|
||||
void timecallback(uint32_t current) {
|
||||
// adjust to local time zone
|
||||
current += (timeZone * 60 * 60);
|
||||
int curr_hour = (current / 60 / 60) % 24;
|
||||
int curr_min = (current / 60 ) % 60;
|
||||
int curr_sec = (current) % 60;
|
||||
|
||||
Serial.print("Time: ");
|
||||
Serial.print(curr_hour); Serial.print(':');
|
||||
Serial.print(curr_min); Serial.print(':');
|
||||
Serial.println(curr_sec);
|
||||
|
||||
// only trigger on minute change
|
||||
if(curr_min != last_min) {
|
||||
last_min = curr_min;
|
||||
|
||||
Serial.println("This will print out every minute!");
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
|
||||
Serial.begin(115200);
|
||||
delay(10);
|
||||
|
||||
Serial.print(F("\nAdafruit IO anonymous Time Demo"));
|
||||
|
||||
WiFi.begin(WLAN_SSID, WLAN_PASS);
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(F("."));
|
||||
}
|
||||
Serial.println(F(" WiFi connected."));
|
||||
|
||||
timefeed.setCallback(timecallback);
|
||||
mqtt.subscribe(&timefeed);
|
||||
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
// wait 10 seconds for subscription messages
|
||||
// since we have no other tasks in this example.
|
||||
mqtt.processPackets(10000);
|
||||
|
||||
// keep the connection alive
|
||||
mqtt.ping();
|
||||
|
||||
}
|
||||
|
||||
// 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 5 seconds...");
|
||||
mqtt.disconnect();
|
||||
delay(5000); // wait 5 seconds
|
||||
retries--;
|
||||
if (retries == 0) {
|
||||
// basically die and wait for WDT to reset me
|
||||
while (1);
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println("MQTT Connected!");
|
||||
}
|
@ -39,22 +39,33 @@ WiFiClient client;
|
||||
// or... use WiFiFlientSecure for SSL
|
||||
//WiFiClientSecure client;
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// 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_KEY);
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Error Reporting *********************************/
|
||||
|
||||
Adafruit_MQTT_Subscribe errors = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/errors");
|
||||
Adafruit_MQTT_Subscribe throttle = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/throttle");
|
||||
const char ERROR_FEED[] PROGMEM = AIO_USERNAME "/errors";
|
||||
Adafruit_MQTT_Subscribe errors = Adafruit_MQTT_Subscribe(&mqtt, ERROR_FEED);
|
||||
|
||||
const char THROTTLE_FEED[] PROGMEM = AIO_USERNAME "/throttle";
|
||||
Adafruit_MQTT_Subscribe throttle = Adafruit_MQTT_Subscribe(&mqtt, THROTTLE_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -37,18 +37,24 @@
|
||||
// WiFiFlientSecure for SSL/TLS support
|
||||
WiFiClientSecure 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_KEY);
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// io.adafruit.com SHA1 fingerprint. Current fingerprint can be verified via:
|
||||
// echo | openssl s_client -connect io.adafruit.com:443 |& openssl x509 -fingerprint -noout
|
||||
#define AIO_SSL_FINGERPRINT "77 00 54 2D DA E7 D8 03 27 31 23 99 EB 27 DB CB A5 4C 57 18"
|
||||
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
// io.adafruit.com SHA1 fingerprint
|
||||
const char* fingerprint = "26 96 1C 2A 51 07 FD 15 80 96 93 AE F7 32 CE B9 0D 01 55 C4";
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'test' for publishing.
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish test = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/test");
|
||||
const char TEST_FEED[] PROGMEM = AIO_USERNAME "/feeds/test";
|
||||
Adafruit_MQTT_Publish test = Adafruit_MQTT_Publish(&mqtt, TEST_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -43,14 +43,23 @@ WiFiClient client;
|
||||
// or... use WiFiFlientSecure for SSL
|
||||
//WiFiClientSecure client;
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// 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);
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
Adafruit_MQTT_Subscribe slider = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/slider");
|
||||
// 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);
|
||||
const char SLIDER_FEED[] PROGMEM = AIO_USERNAME "/feeds/slider";
|
||||
Adafruit_MQTT_Subscribe slider = Adafruit_MQTT_Subscribe(&mqtt, SLIDER_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -40,14 +40,20 @@ WiFiClient client;
|
||||
// or... use WiFiFlientSecure for SSL
|
||||
//WiFiClientSecure client;
|
||||
|
||||
// Store the MQTT server, username, and password in flash memory.
|
||||
// This is required for using the Adafruit MQTT library.
|
||||
const char MQTT_SERVER[] PROGMEM = ARB_SERVER;
|
||||
const char MQTT_USERNAME[] PROGMEM = ARB_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = ARB_PW;
|
||||
|
||||
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
|
||||
Adafruit_MQTT_Client mqtt(&client, ARB_SERVER, ARB_SERVERPORT, ARB_USERNAME, ARB_PW);
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, ARB_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'arb_packet' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
#define ARB_FEED "/feeds/arb_packet"
|
||||
const char ARB_FEED[] PROGMEM = "/feeds/arb_packet";
|
||||
Adafruit_MQTT_Publish ap = Adafruit_MQTT_Publish(&mqtt, ARB_FEED);
|
||||
|
||||
|
||||
|
0
examples/mqtt_cc3k/.due.test.skip
Normal file
0
examples/mqtt_cc3k/.due.test.skip
Normal file
0
examples/mqtt_cc3k/.esp8266.test.skip
Normal file
0
examples/mqtt_cc3k/.esp8266.test.skip
Normal file
0
examples/mqtt_cc3k/.leonardo.test.skip
Normal file
0
examples/mqtt_cc3k/.leonardo.test.skip
Normal file
0
examples/mqtt_cc3k/.uno.test.skip
Normal file
0
examples/mqtt_cc3k/.uno.test.skip
Normal file
0
examples/mqtt_cc3k/.zero.test.skip
Normal file
0
examples/mqtt_cc3k/.zero.test.skip
Normal file
131
examples/mqtt_cc3k/cc3000helper.cpp
Normal file
131
examples/mqtt_cc3k/cc3000helper.cpp
Normal file
@ -0,0 +1,131 @@
|
||||
#include <Adafruit_SleepyDog.h>
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <ccspi.h>
|
||||
#include <SPI.h>
|
||||
|
||||
//#define STATICIP
|
||||
|
||||
#define halt(s) { Serial.println(F( s )); while(1); }
|
||||
|
||||
uint16_t checkFirmwareVersion(void);
|
||||
bool displayConnectionDetails(void);
|
||||
|
||||
extern Adafruit_CC3000 cc3000;
|
||||
|
||||
boolean CC3000connect(const char* wlan_ssid, const char* wlan_pass, uint8_t wlan_security) {
|
||||
Watchdog.reset();
|
||||
|
||||
// Check for compatible firmware
|
||||
if (checkFirmwareVersion() < 0x113) halt("Wrong firmware version!");
|
||||
|
||||
// Delete any old connection data on the module
|
||||
Serial.println(F("\nDeleting old connection profiles"));
|
||||
if (!cc3000.deleteProfiles()) halt("Failed!");
|
||||
|
||||
#ifdef STATICIP
|
||||
Serial.println(F("Setting static IP"));
|
||||
uint32_t ipAddress = cc3000.IP2U32(10, 0, 1, 19);
|
||||
uint32_t netMask = cc3000.IP2U32(255, 255, 255, 0);
|
||||
uint32_t defaultGateway = cc3000.IP2U32(10, 0, 1, 1);
|
||||
uint32_t dns = cc3000.IP2U32(8, 8, 4, 4);
|
||||
|
||||
if (!cc3000.setStaticIPAddress(ipAddress, netMask, defaultGateway, dns)) {
|
||||
Serial.println(F("Failed to set static IP!"));
|
||||
while(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Attempt to connect to an access point
|
||||
Serial.print(F("\nAttempting to connect to "));
|
||||
Serial.print(wlan_ssid); Serial.print(F("..."));
|
||||
|
||||
Watchdog.disable();
|
||||
// try 3 times
|
||||
if (!cc3000.connectToAP(wlan_ssid, wlan_pass, wlan_security, 3)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Watchdog.enable(8000);
|
||||
Serial.println(F("Connected!"));
|
||||
|
||||
uint8_t retries;
|
||||
#ifndef STATICIP
|
||||
/* Wait for DHCP to complete */
|
||||
Serial.println(F("Requesting DHCP"));
|
||||
retries = 10;
|
||||
while (!cc3000.checkDHCP())
|
||||
{
|
||||
Watchdog.reset();
|
||||
delay(1000);
|
||||
retries--;
|
||||
if (!retries) return false;
|
||||
}
|
||||
#endif
|
||||
/* Display the IP address DNS, Gateway, etc. */
|
||||
retries = 10;
|
||||
while (! displayConnectionDetails()) {
|
||||
Watchdog.reset();
|
||||
delay(1000);
|
||||
retries--;
|
||||
if (!retries) return false;
|
||||
}
|
||||
|
||||
Watchdog.reset();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the CC3000's internal firmware patch ID
|
||||
*/
|
||||
/**************************************************************************/
|
||||
uint16_t checkFirmwareVersion(void)
|
||||
{
|
||||
uint8_t major, minor;
|
||||
uint16_t version;
|
||||
|
||||
if(!cc3000.getFirmwareVersion(&major, &minor))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the firmware version!\r\n"));
|
||||
version = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("Firmware V. : "));
|
||||
Serial.print(major); Serial.print(F(".")); Serial.println(minor);
|
||||
version = major; version <<= 8; version |= minor;
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/*!
|
||||
@brief Tries to read the IP address and other connection details
|
||||
*/
|
||||
/**************************************************************************/
|
||||
bool displayConnectionDetails(void)
|
||||
{
|
||||
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
|
||||
|
||||
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
|
||||
{
|
||||
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
|
||||
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
|
||||
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
|
||||
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
|
||||
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
|
||||
Serial.println();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
155
examples/mqtt_cc3k/mqtt_cc3k.ino
Normal file
155
examples/mqtt_cc3k/mqtt_cc3k.ino
Normal file
@ -0,0 +1,155 @@
|
||||
/***************************************************
|
||||
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
|
||||
products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
MIT license, all text above must be included in any redistribution
|
||||
****************************************************/
|
||||
#include <Adafruit_SleepyDog.h>
|
||||
#include <Adafruit_CC3000.h>
|
||||
#include <SPI.h>
|
||||
#include "utility/debug.h"
|
||||
#include "Adafruit_MQTT.h"
|
||||
#include "Adafruit_MQTT_CC3000.h"
|
||||
|
||||
/*************************** CC3000 Pins ***********************************/
|
||||
|
||||
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
|
||||
#define ADAFRUIT_CC3000_VBAT 5 // VBAT & CS can be any digital pins.
|
||||
#define ADAFRUIT_CC3000_CS 10
|
||||
// Use hardware SPI for the remaining pins
|
||||
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
|
||||
|
||||
/************************* WiFi Access Point *********************************/
|
||||
|
||||
#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,
|
||||
// WLAN_SEC_WPA or WLAN_SEC_WPA2
|
||||
|
||||
/************************* 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!) ******************/
|
||||
|
||||
// Setup the main CC3000 class, just like a normal CC3000 sketch.
|
||||
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT);
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// Setup the CC3000 MQTT class by passing in the CC3000 class and MQTT server and login details.
|
||||
Adafruit_MQTT_CC3000 mqtt(&cc3000, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
// You don't need to change anything below this line!
|
||||
#define halt(s) { Serial.println(F( s )); while(1); }
|
||||
|
||||
// CC3000connect is a helper function that sets up the CC3000 and connects to
|
||||
// the WiFi network. See the cc3000helper.cpp tab above for the source!
|
||||
boolean CC3000connect(const char* wlan_ssid, const char* wlan_pass, uint8_t wlan_security);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
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"));
|
||||
|
||||
Serial.print(F("Free RAM: ")); Serial.println(getFreeRam(), DEC);
|
||||
|
||||
// Initialise the CC3000 module
|
||||
Serial.print(F("\nInit the CC3000..."));
|
||||
if (!cc3000.begin())
|
||||
halt("Failed");
|
||||
|
||||
mqtt.subscribe(&onoffbutton);
|
||||
|
||||
while (! CC3000connect(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
|
||||
Serial.println(F("Retrying WiFi"));
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t x=0;
|
||||
|
||||
void loop() {
|
||||
// Make sure to reset watchdog every loop iteration!
|
||||
Watchdog.reset();
|
||||
|
||||
// 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' 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!"));
|
||||
}
|
||||
|
||||
// ping the server to keep the mqtt connection alive
|
||||
if(! mqtt.ping()) {
|
||||
Serial.println(F("MQTT Ping failed."));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 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));
|
||||
if (ret < 0)
|
||||
CC3000connect(WLAN_SSID, WLAN_PASS, WLAN_SECURITY); // y0w, lets connect to wifi again
|
||||
Serial.println("Retrying MQTT connection in 5 seconds...");
|
||||
mqtt.disconnect();
|
||||
delay(5000); // wait 5 seconds
|
||||
}
|
||||
Serial.println("MQTT Connected!");
|
||||
}
|
@ -38,17 +38,25 @@ WiFiClient client;
|
||||
// or... use WiFiFlientSecure for SSL
|
||||
//WiFiClientSecure client;
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// 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_KEY);
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -41,7 +41,17 @@ byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
|
||||
//Set up the ethernet client
|
||||
EthernetClient client;
|
||||
|
||||
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
|
||||
// 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); }
|
||||
@ -51,10 +61,12 @@ Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -25,9 +25,8 @@
|
||||
|
||||
/*************************** FONA Pins ***********************************/
|
||||
|
||||
// Default pins for Feather 32u4 FONA
|
||||
#define FONA_RX 9
|
||||
#define FONA_TX 8
|
||||
#define FONA_RX 2
|
||||
#define FONA_TX 3
|
||||
#define FONA_RST 4
|
||||
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
|
||||
|
||||
@ -53,8 +52,14 @@ Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
|
||||
|
||||
/************ Global State (you don't need to change this!) ******************/
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// Setup the FONA MQTT class by passing in the FONA class and MQTT server and login details.
|
||||
Adafruit_MQTT_FONA mqtt(&fona, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
|
||||
Adafruit_MQTT_FONA mqtt(&fona, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
// You don't need to change anything below this line!
|
||||
#define halt(s) { Serial.println(F( s )); while(1); }
|
||||
@ -67,10 +72,12 @@ boolean FONAconnect(const __FlashStringHelper *apn, const __FlashStringHelper *u
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
@ -117,6 +124,17 @@ void loop() {
|
||||
// function definition further below.
|
||||
MQTT_connect();
|
||||
|
||||
Watchdog.reset();
|
||||
|
||||
// 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.println((char *)onoffbutton.lastread);
|
||||
}
|
||||
}
|
||||
|
||||
Watchdog.reset();
|
||||
// Now we can publish stuff!
|
||||
Serial.print(F("\nSending photocell val "));
|
||||
@ -130,16 +148,6 @@ void loop() {
|
||||
txfailures = 0;
|
||||
}
|
||||
|
||||
Watchdog.reset();
|
||||
// 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.println((char *)onoffbutton.lastread);
|
||||
}
|
||||
}
|
||||
|
||||
// ping the server to keep the mqtt connection alive, only needed if we're not publishing
|
||||
//if(! mqtt.ping()) {
|
||||
// Serial.println(F("MQTT Ping failed."));
|
||||
|
@ -11,13 +11,15 @@
|
||||
#include <SPI.h>
|
||||
#include "Adafruit_MQTT.h"
|
||||
#include "Adafruit_MQTT_Client.h"
|
||||
#include <WiFi101.h>
|
||||
#include <Adafruit_WINC1500.h>
|
||||
|
||||
|
||||
/************************* WiFI Setup *****************************/
|
||||
#define WINC_CS 8
|
||||
#define WINC_IRQ 7
|
||||
#define WINC_RST 4
|
||||
#define WINC_EN 2 // or, tie EN to VCC
|
||||
|
||||
Adafruit_WINC1500 WiFi(WINC_CS, WINC_IRQ, WINC_RST);
|
||||
|
||||
char ssid[] = "yournetwork"; // your network SSID (name)
|
||||
char pass[] = "yourpassword"; // your network password (use for WPA, or use as key for WEP)
|
||||
@ -29,15 +31,25 @@ int status = WL_IDLE_STATUS;
|
||||
|
||||
#define AIO_SERVER "io.adafruit.com"
|
||||
#define AIO_SERVERPORT 1883
|
||||
#define AIO_USERNAME "adafruitiousername"
|
||||
#define AIO_KEY "adafruitiokey"
|
||||
#define AIO_USERNAME "adafruit2"
|
||||
#define AIO_KEY "3e148db54389a8b7c3efa9ddd2cd388317bcbf58"
|
||||
|
||||
/************ Global State (you don't need to change this!) ******************/
|
||||
|
||||
//Set up the wifi client
|
||||
WiFiClient client;
|
||||
Adafruit_WINC1500Client client;
|
||||
|
||||
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
|
||||
// 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); }
|
||||
@ -46,18 +58,18 @@ Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
#define LEDPIN 13
|
||||
|
||||
|
||||
void setup() {
|
||||
WiFi.setPins(WINC_CS, WINC_IRQ, WINC_RST, WINC_EN);
|
||||
|
||||
while (!Serial);
|
||||
Serial.begin(115200);
|
||||
|
@ -18,10 +18,11 @@
|
||||
****************************************************/
|
||||
#include <Bridge.h>
|
||||
#include <Console.h>
|
||||
#include <BridgeClient.h>
|
||||
#include <YunClient.h>
|
||||
#include "Adafruit_MQTT.h"
|
||||
#include "Adafruit_MQTT_Client.h"
|
||||
|
||||
|
||||
/************************* Adafruit.io Setup *********************************/
|
||||
|
||||
#define AIO_SERVER "io.adafruit.com"
|
||||
@ -29,23 +30,30 @@
|
||||
#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!) ******************/
|
||||
|
||||
// Create a BridgeClient instance to communicate using the Yun's bridge & Linux OS.
|
||||
BridgeClient client;
|
||||
// Create a YunClient instance to communicate using the Yun's brighe & Linux OS.
|
||||
YunClient client;
|
||||
|
||||
// Store the MQTT server, 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_USERNAME[] PROGMEM = AIO_USERNAME;
|
||||
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;
|
||||
|
||||
// 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_KEY);
|
||||
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD);
|
||||
|
||||
/****************************** Feeds ***************************************/
|
||||
|
||||
// Setup a feed called 'photocell' for publishing.
|
||||
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
|
||||
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/photocell");
|
||||
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.
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/onoff");
|
||||
const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff";
|
||||
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED);
|
||||
|
||||
/*************************** Sketch Code ************************************/
|
||||
|
||||
|
@ -3,7 +3,7 @@ Adafruit_MQTT_CC3000 KEYWORD1
|
||||
Adafruit_MQTT_FONA KEYWORD1
|
||||
Adafruit_MQTT_Client KEYWORD1
|
||||
Adafruit_MQTT_Publish KEYWORD1
|
||||
Adafruit_MQTT_Subscribe KEYWORD1
|
||||
Adafruit_MQTT_Subscribe KEYWORD1
|
||||
connect KEYWORD2
|
||||
connectErrorString KEYWORD2
|
||||
disconnect KEYWORD2
|
||||
|
@ -1,8 +1,8 @@
|
||||
name=Adafruit MQTT Library
|
||||
version=0.20.1
|
||||
version=0.14.2
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=MQTT library that supports the FONA, ESP8266, Yun, and generic Arduino Client hardware.
|
||||
sentence=MQTT library that supports the CC3000, FONA, ESP8266, Yun, and generic Arduino Client hardware.
|
||||
paragraph=Simple MQTT library that supports the bare minimum to publish and subscribe to topics.
|
||||
category=Communication
|
||||
url=https://github.com/adafruit/Adafruit_MQTT_Library
|
||||
|
Loading…
Reference in New Issue
Block a user