Demo application for using the AT&T IoT Starter Kit Powered by AWS.

Dependencies:   SDFileSystem

Fork of ATT_AWS_IoT_demo by Anthony Phillips

IoT Starter Kit Powered by AWS Demo

This program demonstrates the AT&T IoT Starter Kit sending data directly into AWS IoT. It's explained and used in the Getting Started with the IoT Starter Kit Powered by AWS on starterkit.att.com.

What's required

  • AT&T IoT LTE Add-on (also known as the Cellular Shield)
  • NXP K64F - for programming
  • microSD card - used to store your AWS security credentials
  • AWS account
  • Python, locally installed

If you don't already have an IoT Starter Kit, you can purchase a kit here. The IoT Starter Kit Powered by AWS includes the LTE cellular shield, K64F, and a microSD card.

Committer:
ampembeng
Date:
Tue Dec 06 22:31:15 2016 +0000
Revision:
18:6370da1de572
Parent:
16:02008a2a2569
Child:
20:ee34856ae510
Added code to support SD card access.  The key/cert and MQTT information required for the demo can now be pulled from the SD card file system.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Janos Follath 0:fc70c47eecb4 1 /*
ampembeng 15:6f2798e45099 2 * AT&T IoT Starter Kit example using Amazon Web Service
mbed_official 12:1ae41c231014 3 */
ampembeng 15:6f2798e45099 4 #include "mbed.h"
ampembeng 15:6f2798e45099 5
ampembeng 18:6370da1de572 6 // SD File System
ampembeng 18:6370da1de572 7 #include "SDFileSystem.h"
ampembeng 18:6370da1de572 8
ampembeng 15:6f2798e45099 9 // Serial extension
ampembeng 15:6f2798e45099 10 #include "MODSERIAL.h"
Janos Follath 0:fc70c47eecb4 11
ampembeng 15:6f2798e45099 12 // Network includes
ampembeng 15:6f2798e45099 13 #include "WNCInterface.h"
ampembeng 15:6f2798e45099 14 #include "network_interface.h"
Janos Follath 0:fc70c47eecb4 15
ampembeng 15:6f2798e45099 16 // AWS includes
ampembeng 15:6f2798e45099 17 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 18 #include "aws_iot_version.h"
ampembeng 15:6f2798e45099 19 #include "aws_iot_shadow_interface.h"
ampembeng 15:6f2798e45099 20 #include "aws_iot_shadow_json_data.h"
ampembeng 15:6f2798e45099 21 #include "aws_iot_config.h"
ampembeng 15:6f2798e45099 22 #include "aws_iot_mqtt_interface.h"
mbed_official 12:1ae41c231014 23
Janos Follath 0:fc70c47eecb4 24 #if DEBUG_LEVEL > 0
Janos Follath 0:fc70c47eecb4 25 #include "mbedtls/debug.h"
Janos Follath 0:fc70c47eecb4 26 #endif
Janos Follath 0:fc70c47eecb4 27
ampembeng 15:6f2798e45099 28 //=====================================================================================================================
ampembeng 15:6f2798e45099 29 //
ampembeng 15:6f2798e45099 30 // Defines
ampembeng 15:6f2798e45099 31 //
ampembeng 15:6f2798e45099 32 //=====================================================================================================================
ampembeng 15:6f2798e45099 33 // LED Colors
ampembeng 15:6f2798e45099 34 #define COLOR_OFF 0x00
ampembeng 15:6f2798e45099 35 #define COLOR_RED 0x01
ampembeng 15:6f2798e45099 36 #define COLOR_GREEN 0x02
ampembeng 15:6f2798e45099 37 #define COLOR_BLUE 0x04
ampembeng 15:6f2798e45099 38 #define COLOR_WHITE 0x07
ampembeng 15:6f2798e45099 39 #define NUM_COLORS 5
Janos Follath 0:fc70c47eecb4 40
ampembeng 15:6f2798e45099 41 // AWS defines
ampembeng 18:6370da1de572 42 #define PATH_MAX 1024
ampembeng 15:6f2798e45099 43 #define MAX_LENGTH_OF_UPDATE_JSON_BUFFER 200 // NOTE: Be wary of this if your JSON doc grows
ampembeng 15:6f2798e45099 44 #define SHADOW_SYNC_INTERVAL 3.0 // How often we sync with AWS Shadow (in seconds)
Janos Follath 0:fc70c47eecb4 45
ampembeng 15:6f2798e45099 46 // Comment out the following line if color is not supported on the terminal
ampembeng 15:6f2798e45099 47 //#define USE_COLOR
ampembeng 15:6f2798e45099 48 #ifdef USE_COLOR
ampembeng 15:6f2798e45099 49 #define BLK "\033[30m"
ampembeng 15:6f2798e45099 50 #define RED "\033[31m"
ampembeng 15:6f2798e45099 51 #define GRN "\033[32m"
ampembeng 15:6f2798e45099 52 #define YEL "\033[33m"
ampembeng 15:6f2798e45099 53 #define BLU "\033[34m"
ampembeng 15:6f2798e45099 54 #define MAG "\033[35m"
ampembeng 15:6f2798e45099 55 #define CYN "\033[36m"
ampembeng 15:6f2798e45099 56 #define WHT "\033[37m"
ampembeng 15:6f2798e45099 57 #define DEF "\033[39m"
ampembeng 15:6f2798e45099 58 #else
ampembeng 15:6f2798e45099 59 #define BLK
ampembeng 15:6f2798e45099 60 #define RED
ampembeng 15:6f2798e45099 61 #define GRN
ampembeng 15:6f2798e45099 62 #define YEL
ampembeng 15:6f2798e45099 63 #define BLU
ampembeng 15:6f2798e45099 64 #define MAG
ampembeng 15:6f2798e45099 65 #define CYN
ampembeng 15:6f2798e45099 66 #define WHT
ampembeng 15:6f2798e45099 67 #define DEF
Janos Follath 0:fc70c47eecb4 68 #endif
Janos Follath 0:fc70c47eecb4 69
ampembeng 15:6f2798e45099 70 //=====================================================================================================================
ampembeng 15:6f2798e45099 71 //
ampembeng 15:6f2798e45099 72 // Globals
ampembeng 15:6f2798e45099 73 //
ampembeng 15:6f2798e45099 74 //=====================================================================================================================
ampembeng 15:6f2798e45099 75 // Controls LED color
ampembeng 15:6f2798e45099 76 unsigned char ledColor = COLOR_OFF;
ampembeng 15:6f2798e45099 77
ampembeng 15:6f2798e45099 78 // Color cycle array (used with SW3 button presses)
ampembeng 15:6f2798e45099 79 unsigned char colorCycle[NUM_COLORS] = {COLOR_OFF, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_WHITE};
Janos Follath 0:fc70c47eecb4 80
ampembeng 15:6f2798e45099 81 // Button interrupts
ampembeng 15:6f2798e45099 82 bool buttonOverride = false;
ampembeng 15:6f2798e45099 83 InterruptIn Interrupt(SW3);
ampembeng 15:6f2798e45099 84
ampembeng 18:6370da1de572 85 // These defines are pulled from aws_iot_config.h
ampembeng 15:6f2798e45099 86 char HostAddress[255] = AWS_IOT_MQTT_HOST;
ampembeng 18:6370da1de572 87 char MqttClientID[32] = AWS_IOT_MQTT_CLIENT_ID;
ampembeng 18:6370da1de572 88 char ThingName[32] = AWS_IOT_MY_THING_NAME;
ampembeng 18:6370da1de572 89 char PortString[5] = "8883";
ampembeng 15:6f2798e45099 90 uint32_t port = AWS_IOT_MQTT_PORT;
Janos Follath 0:fc70c47eecb4 91
ampembeng 15:6f2798e45099 92 //=====================================================================================================================
ampembeng 15:6f2798e45099 93 //
ampembeng 15:6f2798e45099 94 // Devices
ampembeng 15:6f2798e45099 95 //
ampembeng 15:6f2798e45099 96 //=====================================================================================================================
ampembeng 15:6f2798e45099 97 // GPIOs for RGB LED
ampembeng 15:6f2798e45099 98 DigitalOut led_green(LED_GREEN);
ampembeng 15:6f2798e45099 99 DigitalOut led_red(LED_RED);
ampembeng 15:6f2798e45099 100 DigitalOut led_blue(LED_BLUE);
Janos Follath 0:fc70c47eecb4 101
ampembeng 15:6f2798e45099 102 // USB Serial port (to PC)
ampembeng 15:6f2798e45099 103 MODSERIAL pc(USBTX,USBRX,256,256);
Janos Follath 0:fc70c47eecb4 104
ampembeng 18:6370da1de572 105 // SD card access (MOSI, MISO, SCK, CS)
ampembeng 18:6370da1de572 106 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
ampembeng 18:6370da1de572 107
ampembeng 15:6f2798e45099 108 //=====================================================================================================================
ampembeng 15:6f2798e45099 109 //
ampembeng 15:6f2798e45099 110 // Functions
ampembeng 15:6f2798e45099 111 //
ampembeng 15:6f2798e45099 112 //=====================================================================================================================
ampembeng 15:6f2798e45099 113 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 114 //* Prints the given format to the PC serial port. Exposed to all files via aws_iot_log.h
ampembeng 15:6f2798e45099 115 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 116 void pc_print(const char * format, ...)
ampembeng 15:6f2798e45099 117 {
ampembeng 15:6f2798e45099 118 va_list vl;
ampembeng 15:6f2798e45099 119 va_start(vl, format);
ampembeng 15:6f2798e45099 120 pc.vprintf(format, vl);
ampembeng 15:6f2798e45099 121 va_end(vl);
ampembeng 15:6f2798e45099 122 }
Janos Follath 0:fc70c47eecb4 123
ampembeng 15:6f2798e45099 124 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 125 //* Set the RGB LED's Color
ampembeng 15:6f2798e45099 126 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
ampembeng 15:6f2798e45099 127 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 128 void SetLedColor(unsigned char ucColor)
ampembeng 18:6370da1de572 129 {
ampembeng 15:6f2798e45099 130 //Note that when an LED is on, you write a 0 to it:
ampembeng 15:6f2798e45099 131 led_red = !(ucColor & 0x1); //bit 0
ampembeng 15:6f2798e45099 132 led_green = !(ucColor & 0x2); //bit 1
ampembeng 15:6f2798e45099 133 led_blue = !(ucColor & 0x4); //bit 2
ampembeng 15:6f2798e45099 134 }
Janos Follath 0:fc70c47eecb4 135
ampembeng 15:6f2798e45099 136 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 137 //* SW3 Button handler. Finds the current LED color and sets the button to the next color in colorCycle[]
ampembeng 15:6f2798e45099 138 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 139 void sw3ButtonHandler()
ampembeng 15:6f2798e45099 140 {
ampembeng 15:6f2798e45099 141 int i;
ampembeng 15:6f2798e45099 142 for(i=0; i < NUM_COLORS; i++) {
ampembeng 15:6f2798e45099 143 if (ledColor == colorCycle[i])
ampembeng 15:6f2798e45099 144 break;
ampembeng 15:6f2798e45099 145 }
ampembeng 15:6f2798e45099 146
ampembeng 15:6f2798e45099 147 // (circular-queue)
ampembeng 15:6f2798e45099 148 if (++i == NUM_COLORS)
ampembeng 15:6f2798e45099 149 i = 0;
ampembeng 15:6f2798e45099 150
ampembeng 15:6f2798e45099 151 ledColor = colorCycle[i];
ampembeng 15:6f2798e45099 152 SetLedColor(ledColor);
ampembeng 15:6f2798e45099 153 buttonOverride = true;
ampembeng 15:6f2798e45099 154 }
Janos Follath 0:fc70c47eecb4 155
ampembeng 15:6f2798e45099 156 //=====================================================================================================================
ampembeng 15:6f2798e45099 157 //
ampembeng 15:6f2798e45099 158 // AWS Shadow Callbacks
ampembeng 15:6f2798e45099 159 //
ampembeng 15:6f2798e45099 160 //=====================================================================================================================
ampembeng 15:6f2798e45099 161 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 162 //* This is the callback function that fires when an update is sent. It will print the update response status.
ampembeng 15:6f2798e45099 163 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 164 void ShadowUpdateStatusCallback(const char *pThingName, ShadowActions_t action, Shadow_Ack_Status_t status,
ampembeng 15:6f2798e45099 165 const char *pReceivedJsonDocument, void *pContextData) {
Janos Follath 0:fc70c47eecb4 166
ampembeng 15:6f2798e45099 167 INFO("Shadow Update Status Callback");
ampembeng 15:6f2798e45099 168
ampembeng 15:6f2798e45099 169 if (status == SHADOW_ACK_TIMEOUT) {
ampembeng 15:6f2798e45099 170 INFO("Update Timeout--");
ampembeng 15:6f2798e45099 171 } else if (status == SHADOW_ACK_REJECTED) {
ampembeng 15:6f2798e45099 172 INFO("Update RejectedXX");
ampembeng 15:6f2798e45099 173 } else if (status == SHADOW_ACK_ACCEPTED) {
ampembeng 15:6f2798e45099 174 INFO("Update Accepted!!"); // Good
ampembeng 15:6f2798e45099 175 }
ampembeng 15:6f2798e45099 176 }
Janos Follath 0:fc70c47eecb4 177
ampembeng 15:6f2798e45099 178 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 179 //* This is the callback function that fires when AWS has sends out a shadow update.
ampembeng 15:6f2798e45099 180 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 181 void ledControl_Callback(const char *pJsonString, uint32_t JsonStringDataLen, jsonStruct_t *pContext) {
ampembeng 15:6f2798e45099 182
ampembeng 15:6f2798e45099 183 INFO("LED Callback Detected.");
ampembeng 15:6f2798e45099 184
ampembeng 15:6f2798e45099 185 if (pContext != NULL) {
ampembeng 15:6f2798e45099 186 switch (*(unsigned char *)(pContext->pData)){
ampembeng 15:6f2798e45099 187 case COLOR_OFF:
ampembeng 15:6f2798e45099 188 INFO("LED -> OFF (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 189 break;
ampembeng 15:6f2798e45099 190 case COLOR_RED:
ampembeng 15:6f2798e45099 191 INFO("LED -> RED (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 192 break;
ampembeng 15:6f2798e45099 193 case COLOR_GREEN:
ampembeng 15:6f2798e45099 194 INFO("LED -> GREEN (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 195 break;
ampembeng 15:6f2798e45099 196 case COLOR_BLUE:
ampembeng 15:6f2798e45099 197 INFO("LED -> BLUE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 198 break;
ampembeng 15:6f2798e45099 199 case COLOR_WHITE:
ampembeng 15:6f2798e45099 200 INFO("LED -> WHITE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 201 break;
Janos Follath 0:fc70c47eecb4 202 }
ampembeng 15:6f2798e45099 203 }
ampembeng 15:6f2798e45099 204 else {
ampembeng 15:6f2798e45099 205 INFO("pContext was detected as NULL");
Janos Follath 0:fc70c47eecb4 206 }
ampembeng 15:6f2798e45099 207 }
ampembeng 15:6f2798e45099 208
ampembeng 15:6f2798e45099 209 //=====================================================================================================================
ampembeng 15:6f2798e45099 210 //
ampembeng 15:6f2798e45099 211 // Main
ampembeng 15:6f2798e45099 212 //
ampembeng 15:6f2798e45099 213 //=====================================================================================================================
ampembeng 15:6f2798e45099 214 int main() {
ampembeng 15:6f2798e45099 215
ampembeng 15:6f2798e45099 216 // Set baud rate for PC Serial
ampembeng 15:6f2798e45099 217 pc.baud(115200);
ampembeng 15:6f2798e45099 218 INFO("Hello World from AT&T IoT Start Kit demo!");
ampembeng 15:6f2798e45099 219
ampembeng 15:6f2798e45099 220 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 221 char JsonDocumentBuffer[MAX_LENGTH_OF_UPDATE_JSON_BUFFER];
ampembeng 15:6f2798e45099 222 size_t sizeOfJsonDocumentBuffer = sizeof(JsonDocumentBuffer) / sizeof(JsonDocumentBuffer[0]);
ampembeng 15:6f2798e45099 223
ampembeng 15:6f2798e45099 224 // JSON struct for LED control
ampembeng 15:6f2798e45099 225 jsonStruct_t ledController;
ampembeng 15:6f2798e45099 226 ledController.cb = ledControl_Callback;
ampembeng 15:6f2798e45099 227 ledController.pData = &ledColor;
ampembeng 15:6f2798e45099 228 ledController.pKey = "ledColor";
ampembeng 15:6f2798e45099 229 ledController.type = SHADOW_JSON_UINT8;
ampembeng 15:6f2798e45099 230
ampembeng 15:6f2798e45099 231 // TODO Add FRDM temperature reading
ampembeng 15:6f2798e45099 232 /*
ampembeng 15:6f2798e45099 233 float temperature = 0.0;
ampembeng 15:6f2798e45099 234 jsonStruct_t temperatureHandler;
ampembeng 15:6f2798e45099 235 temperatureHandler.cb = NULL;
ampembeng 15:6f2798e45099 236 temperatureHandler.pKey = "temperature";
ampembeng 15:6f2798e45099 237 temperatureHandler.pData = &temperature;
ampembeng 15:6f2798e45099 238 temperatureHandler.type = SHADOW_JSON_FLOAT;
ampembeng 15:6f2798e45099 239 */
ampembeng 15:6f2798e45099 240
ampembeng 15:6f2798e45099 241 INFO("AWS IoT SDK Version(dev) %d.%d.%d-%s", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_TAG);
ampembeng 15:6f2798e45099 242
ampembeng 18:6370da1de572 243 #ifdef USING_SD_CARD
ampembeng 18:6370da1de572 244 // Paths for certs from SD card
ampembeng 18:6370da1de572 245 INFO("Using SD card files for AWS config.");
ampembeng 18:6370da1de572 246 DEBUG("- mqtt config path: %s", AWS_MQTT_CONFIG_FILENAME);
ampembeng 18:6370da1de572 247 DEBUG("- rootCA path: %s", AWS_IOT_ROOT_CA_FILENAME);
ampembeng 18:6370da1de572 248 DEBUG("- clientCRT path: %s", AWS_IOT_CERTIFICATE_FILENAME);
ampembeng 18:6370da1de572 249 DEBUG("- clientKey path: %s", AWS_IOT_PRIVATE_KEY_FILENAME);
ampembeng 18:6370da1de572 250 #else
ampembeng 18:6370da1de572 251 INFO("Using #defines in aws_iot_config.h and certs from certs.cpp for AWS config.");
ampembeng 18:6370da1de572 252 #endif
ampembeng 15:6f2798e45099 253
ampembeng 16:02008a2a2569 254 // Startup signal - blinks through RGBW then turns off
ampembeng 15:6f2798e45099 255 SetLedColor(COLOR_RED);
ampembeng 15:6f2798e45099 256 wait(.5);
ampembeng 15:6f2798e45099 257 SetLedColor(COLOR_GREEN);
ampembeng 15:6f2798e45099 258 wait(.5);
ampembeng 15:6f2798e45099 259 SetLedColor(COLOR_BLUE);
ampembeng 15:6f2798e45099 260 wait(.5);
ampembeng 16:02008a2a2569 261 SetLedColor(COLOR_WHITE);
ampembeng 16:02008a2a2569 262 wait(.5);
ampembeng 16:02008a2a2569 263 SetLedColor(COLOR_OFF);
ampembeng 18:6370da1de572 264
ampembeng 15:6f2798e45099 265 // Setup SW3 button to falling edge interrupt
ampembeng 15:6f2798e45099 266 Interrupt.fall(&sw3ButtonHandler);
ampembeng 15:6f2798e45099 267
ampembeng 15:6f2798e45099 268 // Boot the Avnet Shield before any other operations
ampembeng 15:6f2798e45099 269 net_modem_boot();
ampembeng 15:6f2798e45099 270
ampembeng 18:6370da1de572 271 // Intialize MQTT/Cert parameters
ampembeng 15:6f2798e45099 272 ShadowParameters_t sp = ShadowParametersDefault;
ampembeng 18:6370da1de572 273 #ifdef USING_SD_CARD
ampembeng 18:6370da1de572 274 rc = (IoT_Error_t)mbedtls_mqtt_config_parse_file(&sp, AWS_MQTT_CONFIG_FILENAME);
ampembeng 18:6370da1de572 275 if (NONE_ERROR != rc) {
ampembeng 18:6370da1de572 276 ERROR("Failed to initialize mqtt parameters %d", rc);
ampembeng 18:6370da1de572 277 return rc;
ampembeng 18:6370da1de572 278 }
ampembeng 18:6370da1de572 279 sp.pClientCRT = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 18:6370da1de572 280 sp.pClientKey = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 18:6370da1de572 281 sp.pRootCA = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 18:6370da1de572 282 #else
ampembeng 15:6f2798e45099 283 sp.pMyThingName = AWS_IOT_MY_THING_NAME;
ampembeng 15:6f2798e45099 284 sp.pMqttClientId = AWS_IOT_MQTT_CLIENT_ID;
ampembeng 15:6f2798e45099 285 sp.pHost = HostAddress;
ampembeng 15:6f2798e45099 286 sp.port = port;
ampembeng 18:6370da1de572 287 #endif
ampembeng 18:6370da1de572 288
ampembeng 18:6370da1de572 289 INFO("Initialize the MQTT client...");
ampembeng 18:6370da1de572 290 MQTTClient_t mqttClient;
ampembeng 18:6370da1de572 291 aws_iot_mqtt_init(&mqttClient);
ampembeng 15:6f2798e45099 292
ampembeng 15:6f2798e45099 293 INFO("Shadow Init...");
ampembeng 15:6f2798e45099 294 rc = aws_iot_shadow_init(&mqttClient);
ampembeng 15:6f2798e45099 295 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 296 ERROR("Shadow Init Error %d", rc);
ampembeng 15:6f2798e45099 297 return rc;
Janos Follath 0:fc70c47eecb4 298 }
ampembeng 15:6f2798e45099 299
ampembeng 15:6f2798e45099 300 INFO("Shadow Connect...");
ampembeng 15:6f2798e45099 301 rc = aws_iot_shadow_connect(&mqttClient, &sp);
ampembeng 15:6f2798e45099 302 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 303 ERROR("Shadow Connection Error %d", rc);
ampembeng 15:6f2798e45099 304 return rc;
Janos Follath 0:fc70c47eecb4 305 }
Janos Follath 0:fc70c47eecb4 306
ampembeng 15:6f2798e45099 307 // Enable Auto Reconnect functionality. Minimum and Maximum time of Exponential backoff are set in aws_iot_config.h
ampembeng 15:6f2798e45099 308 // #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL
ampembeng 15:6f2798e45099 309 // #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL
ampembeng 15:6f2798e45099 310 rc = mqttClient.setAutoReconnectStatus(true);
ampembeng 15:6f2798e45099 311 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 312 ERROR("Unable to set Auto Reconnect to true - %d", rc);
ampembeng 15:6f2798e45099 313 return rc;
ampembeng 15:6f2798e45099 314 }
ampembeng 15:6f2798e45099 315
ampembeng 15:6f2798e45099 316 // Example line of how to delete a shadow (not used in this demo)
ampembeng 15:6f2798e45099 317 //aws_iot_shadow_delete(&mqttClient, AWS_IOT_MY_THING_NAME, ShadowUpdateStatusCallback, NULL, 8, true);
Janos Follath 0:fc70c47eecb4 318
ampembeng 15:6f2798e45099 319 INFO("Shadow Register Delta...");
ampembeng 15:6f2798e45099 320 rc = aws_iot_shadow_register_delta(&mqttClient, &ledController);
ampembeng 15:6f2798e45099 321 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 322 ERROR("Shadow Register Delta Error");
ampembeng 15:6f2798e45099 323 return rc;
ampembeng 15:6f2798e45099 324 }
ampembeng 15:6f2798e45099 325
ampembeng 15:6f2798e45099 326 INFO("Will attempt to sync with device shadow every %f seconds.", SHADOW_SYNC_INTERVAL);
ampembeng 15:6f2798e45099 327 // Loop and publish changes from the FRDM board
ampembeng 15:6f2798e45099 328 while (NETWORK_ATTEMPTING_RECONNECT == rc || RECONNECT_SUCCESSFUL == rc || NONE_ERROR == rc) {
ampembeng 15:6f2798e45099 329
ampembeng 15:6f2798e45099 330 // Looks for incoming socket messages
ampembeng 15:6f2798e45099 331 rc = aws_iot_shadow_yield(&mqttClient, 200);
ampembeng 15:6f2798e45099 332 if (NETWORK_ATTEMPTING_RECONNECT == rc) {
ampembeng 15:6f2798e45099 333 // If the client is attempting to reconnect we will skip the rest of the loop.
ampembeng 15:6f2798e45099 334 INFO("Attempting to reconnect...");
ampembeng 15:6f2798e45099 335 wait(1);
ampembeng 15:6f2798e45099 336 continue;
ampembeng 15:6f2798e45099 337 }
ampembeng 15:6f2798e45099 338
ampembeng 15:6f2798e45099 339 INFO("\n=======================================================================================\n");
ampembeng 15:6f2798e45099 340 // Initialize JSON shadow document
ampembeng 15:6f2798e45099 341 rc = aws_iot_shadow_init_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
ampembeng 15:6f2798e45099 342 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 343
ampembeng 15:6f2798e45099 344 // If there has been a SW3 button press update the 'desired' color
ampembeng 15:6f2798e45099 345 if (buttonOverride) {
ampembeng 15:6f2798e45099 346 rc = aws_iot_shadow_add_desired(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 1, &ledController);
ampembeng 15:6f2798e45099 347 buttonOverride = false;
Janos Follath 0:fc70c47eecb4 348 }
ampembeng 15:6f2798e45099 349
ampembeng 15:6f2798e45099 350 // Updates the 'reported' color
ampembeng 15:6f2798e45099 351 rc = aws_iot_shadow_add_reported(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 1, &ledController);
ampembeng 15:6f2798e45099 352
ampembeng 15:6f2798e45099 353 // TODO: format for adding temperature
ampembeng 15:6f2798e45099 354 //rc = aws_iot_shadow_add_reported(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 2, &ledController, &temperatureHandler);
ampembeng 15:6f2798e45099 355
ampembeng 15:6f2798e45099 356 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 357 rc = aws_iot_finalize_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
ampembeng 15:6f2798e45099 358
ampembeng 15:6f2798e45099 359 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 360 INFO("Update Shadow: %s", JsonDocumentBuffer);
ampembeng 18:6370da1de572 361 rc = aws_iot_shadow_update(&mqttClient, sp.pMyThingName, JsonDocumentBuffer,
ampembeng 15:6f2798e45099 362 ShadowUpdateStatusCallback, NULL, 8, true);
ampembeng 15:6f2798e45099 363 }
ampembeng 15:6f2798e45099 364 }
ampembeng 15:6f2798e45099 365 }
ampembeng 18:6370da1de572 366
ampembeng 18:6370da1de572 367 // Set LED color then wait an loop again
ampembeng 18:6370da1de572 368 switch (ledColor) {
ampembeng 18:6370da1de572 369 case COLOR_OFF:
ampembeng 18:6370da1de572 370 INFO("LED: OFF");
ampembeng 18:6370da1de572 371 break;
ampembeng 18:6370da1de572 372 case COLOR_RED:
ampembeng 18:6370da1de572 373 INFO("LED: RED");
ampembeng 18:6370da1de572 374 break;
ampembeng 18:6370da1de572 375 case COLOR_GREEN:
ampembeng 18:6370da1de572 376 INFO("LED: GREEN");
ampembeng 18:6370da1de572 377 break;
ampembeng 18:6370da1de572 378 case COLOR_BLUE:
ampembeng 18:6370da1de572 379 INFO("LED: BLUE");
ampembeng 18:6370da1de572 380 break;
ampembeng 18:6370da1de572 381 case COLOR_WHITE:
ampembeng 18:6370da1de572 382 INFO("LED: WHITE");
ampembeng 18:6370da1de572 383 break;
ampembeng 18:6370da1de572 384 }
ampembeng 18:6370da1de572 385 INFO("*****************************************************************************************");
ampembeng 18:6370da1de572 386
ampembeng 15:6f2798e45099 387 SetLedColor(ledColor);
ampembeng 15:6f2798e45099 388 wait(SHADOW_SYNC_INTERVAL);
Janos Follath 0:fc70c47eecb4 389 }
Janos Follath 0:fc70c47eecb4 390
ampembeng 15:6f2798e45099 391 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 392 ERROR("An error occurred in the loop %d", rc);
Janos Follath 0:fc70c47eecb4 393 }
Janos Follath 0:fc70c47eecb4 394
ampembeng 15:6f2798e45099 395 INFO("Disconnecting");
ampembeng 15:6f2798e45099 396 rc = aws_iot_shadow_disconnect(&mqttClient);
ampembeng 15:6f2798e45099 397
ampembeng 15:6f2798e45099 398 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 399 ERROR("Disconnect error %d", rc);
Janos Follath 0:fc70c47eecb4 400 }
Janos Follath 0:fc70c47eecb4 401
ampembeng 15:6f2798e45099 402 return rc;
ampembeng 15:6f2798e45099 403 }