Raghu Tirumala / Mbed OS ATT_IoT_Project

Dependencies:   BufferedSoftSerial SDFileSystem

Fork of ATT_AWS_IoT_demo by AT&T IoT

Committer:
RaghuT
Date:
Mon Jul 17 12:03:23 2017 +0000
Revision:
28:d549de7c3aad
Parent:
24:224c07ec3bd0
Child:
29:319446cd2880
Working copy week 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RaghuT 28:d549de7c3aad 1 #include <cstdlib>
ampembeng 15:6f2798e45099 2 #include "mbed.h"
ampembeng 15:6f2798e45099 3
ampembeng 15:6f2798e45099 4 // Serial extension
ampembeng 15:6f2798e45099 5 #include "MODSERIAL.h"
RaghuT 28:d549de7c3aad 6 #include "SoftSerial.h"
RaghuT 28:d549de7c3aad 7 #include "BufferedSoftSerial.h"
Janos Follath 0:fc70c47eecb4 8
ampembeng 15:6f2798e45099 9 // Network includes
ampembeng 15:6f2798e45099 10 #include "WNCInterface.h"
ampembeng 15:6f2798e45099 11 #include "network_interface.h"
RaghuT 28:d549de7c3aad 12 #include "WncControllerK64F/WncController/WncController.h"
Janos Follath 0:fc70c47eecb4 13
ampembeng 15:6f2798e45099 14 // AWS includes
ampembeng 15:6f2798e45099 15 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 16 #include "aws_iot_version.h"
ampembeng 15:6f2798e45099 17 #include "aws_iot_shadow_interface.h"
ampembeng 15:6f2798e45099 18 #include "aws_iot_shadow_json_data.h"
ampembeng 15:6f2798e45099 19 #include "aws_iot_config.h"
ampembeng 15:6f2798e45099 20 #include "aws_iot_mqtt_interface.h"
mbed_official 12:1ae41c231014 21
Janos Follath 0:fc70c47eecb4 22 #if DEBUG_LEVEL > 0
Janos Follath 0:fc70c47eecb4 23 #include "mbedtls/debug.h"
Janos Follath 0:fc70c47eecb4 24 #endif
Janos Follath 0:fc70c47eecb4 25
ampembeng 15:6f2798e45099 26 //=====================================================================================================================
ampembeng 15:6f2798e45099 27 //
ampembeng 15:6f2798e45099 28 // Defines
ampembeng 15:6f2798e45099 29 //
ampembeng 15:6f2798e45099 30 //=====================================================================================================================
ampembeng 15:6f2798e45099 31 // LED Colors
ampembeng 15:6f2798e45099 32 #define COLOR_OFF 0x00
ampembeng 15:6f2798e45099 33 #define COLOR_RED 0x01
ampembeng 15:6f2798e45099 34 #define COLOR_GREEN 0x02
ampembeng 15:6f2798e45099 35 #define COLOR_BLUE 0x04
ampembeng 15:6f2798e45099 36 #define COLOR_WHITE 0x07
ampembeng 15:6f2798e45099 37 #define NUM_COLORS 5
Janos Follath 0:fc70c47eecb4 38
ampembeng 15:6f2798e45099 39 // AWS defines
ampembeng 18:6370da1de572 40 #define PATH_MAX 1024
RaghuT 28:d549de7c3aad 41 #define MAX_LENGTH_OF_UPDATE_JSON_BUFFER 500 // NOTE: Be wary of this if your JSON doc grows
ampembeng 15:6f2798e45099 42 #define SHADOW_SYNC_INTERVAL 3.0 // How often we sync with AWS Shadow (in seconds)
Janos Follath 0:fc70c47eecb4 43
ampembeng 15:6f2798e45099 44 // Comment out the following line if color is not supported on the terminal
ampembeng 15:6f2798e45099 45 //#define USE_COLOR
ampembeng 15:6f2798e45099 46 #ifdef USE_COLOR
ampembeng 15:6f2798e45099 47 #define BLK "\033[30m"
ampembeng 15:6f2798e45099 48 #define RED "\033[31m"
ampembeng 15:6f2798e45099 49 #define GRN "\033[32m"
ampembeng 15:6f2798e45099 50 #define YEL "\033[33m"
ampembeng 15:6f2798e45099 51 #define BLU "\033[34m"
ampembeng 15:6f2798e45099 52 #define MAG "\033[35m"
ampembeng 15:6f2798e45099 53 #define CYN "\033[36m"
ampembeng 15:6f2798e45099 54 #define WHT "\033[37m"
ampembeng 15:6f2798e45099 55 #define DEF "\033[39m"
ampembeng 15:6f2798e45099 56 #else
ampembeng 15:6f2798e45099 57 #define BLK
ampembeng 15:6f2798e45099 58 #define RED
ampembeng 15:6f2798e45099 59 #define GRN
ampembeng 15:6f2798e45099 60 #define YEL
ampembeng 15:6f2798e45099 61 #define BLU
ampembeng 15:6f2798e45099 62 #define MAG
ampembeng 15:6f2798e45099 63 #define CYN
ampembeng 15:6f2798e45099 64 #define WHT
ampembeng 15:6f2798e45099 65 #define DEF
Janos Follath 0:fc70c47eecb4 66 #endif
Janos Follath 0:fc70c47eecb4 67
ampembeng 20:ee34856ae510 68 // Sensor defines
ampembeng 20:ee34856ae510 69 #define CTOF(x) ((x)*1.8+32) // Temperature
ampembeng 20:ee34856ae510 70
ampembeng 15:6f2798e45099 71 //=====================================================================================================================
ampembeng 15:6f2798e45099 72 //
ampembeng 15:6f2798e45099 73 // Globals
ampembeng 15:6f2798e45099 74 //
ampembeng 15:6f2798e45099 75 //=====================================================================================================================
ampembeng 15:6f2798e45099 76 // Controls LED color
ampembeng 15:6f2798e45099 77 unsigned char ledColor = COLOR_OFF;
ampembeng 15:6f2798e45099 78
RaghuT 28:d549de7c3aad 79 //Controls LCD message
RaghuT 28:d549de7c3aad 80 string lcdMessage = "hola";
ampembeng 15:6f2798e45099 81
ampembeng 18:6370da1de572 82 // These defines are pulled from aws_iot_config.h
ampembeng 15:6f2798e45099 83 char HostAddress[255] = AWS_IOT_MQTT_HOST;
ampembeng 18:6370da1de572 84 char MqttClientID[32] = AWS_IOT_MQTT_CLIENT_ID;
ampembeng 18:6370da1de572 85 char ThingName[32] = AWS_IOT_MY_THING_NAME;
ampembeng 18:6370da1de572 86 char PortString[5] = "8883";
ampembeng 15:6f2798e45099 87 uint32_t port = AWS_IOT_MQTT_PORT;
ampembeng 23:b9ff83dc965f 88 char iccidName[21] = "12345678901234567890";
Janos Follath 0:fc70c47eecb4 89
ampembeng 20:ee34856ae510 90 // Sensor data
ampembeng 20:ee34856ae510 91 float temperature = 0.0;
RaghuT 28:d549de7c3aad 92 float humidity = 0.0;
ampembeng 20:ee34856ae510 93
RaghuT 28:d549de7c3aad 94 //Cell signal
RaghuT 28:d549de7c3aad 95 int signalQuality = 0;
RaghuT 28:d549de7c3aad 96
RaghuT 28:d549de7c3aad 97 //Variable to store data usage
RaghuT 28:d549de7c3aad 98 int dataUsage = 0;
ampembeng 23:b9ff83dc965f 99
ampembeng 15:6f2798e45099 100 //=====================================================================================================================
ampembeng 15:6f2798e45099 101 //
ampembeng 15:6f2798e45099 102 // Devices
ampembeng 15:6f2798e45099 103 //
ampembeng 15:6f2798e45099 104 //=====================================================================================================================
ampembeng 15:6f2798e45099 105 // GPIOs for RGB LED
ampembeng 15:6f2798e45099 106 DigitalOut led_green(LED_GREEN);
ampembeng 15:6f2798e45099 107 DigitalOut led_red(LED_RED);
ampembeng 15:6f2798e45099 108 DigitalOut led_blue(LED_BLUE);
Janos Follath 0:fc70c47eecb4 109
ampembeng 15:6f2798e45099 110 // USB Serial port (to PC)
ampembeng 15:6f2798e45099 111 MODSERIAL pc(USBTX,USBRX,256,256);
Janos Follath 0:fc70c47eecb4 112
RaghuT 28:d549de7c3aad 113 // Bluetooth serial
RaghuT 28:d549de7c3aad 114 BufferedSoftSerial bluetooth(PTC4, PTA2);
ampembeng 18:6370da1de572 115
ampembeng 20:ee34856ae510 116 // I2C bus (SDA, SCL)
ampembeng 20:ee34856ae510 117 I2C i2c(PTC11, PTC10);
ampembeng 20:ee34856ae510 118
ampembeng 15:6f2798e45099 119 //=====================================================================================================================
ampembeng 15:6f2798e45099 120 //
ampembeng 15:6f2798e45099 121 // Functions
ampembeng 15:6f2798e45099 122 //
ampembeng 15:6f2798e45099 123 //=====================================================================================================================
ampembeng 15:6f2798e45099 124 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 125 //* Prints the given format to the PC serial port. Exposed to all files via aws_iot_log.h
ampembeng 15:6f2798e45099 126 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 127 void pc_print(const char * format, ...)
ampembeng 15:6f2798e45099 128 {
ampembeng 15:6f2798e45099 129 va_list vl;
ampembeng 15:6f2798e45099 130 va_start(vl, format);
ampembeng 15:6f2798e45099 131 pc.vprintf(format, vl);
ampembeng 15:6f2798e45099 132 va_end(vl);
ampembeng 15:6f2798e45099 133 }
Janos Follath 0:fc70c47eecb4 134
ampembeng 15:6f2798e45099 135 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 136 //* Set the RGB LED's Color
ampembeng 15:6f2798e45099 137 //* LED Color 0=Off to 7=White. 3 bits represent BGR (bit0=Red, bit1=Green, bit2=Blue)
ampembeng 15:6f2798e45099 138 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 139 void SetLedColor(unsigned char ucColor)
ampembeng 18:6370da1de572 140 {
ampembeng 15:6f2798e45099 141 //Note that when an LED is on, you write a 0 to it:
ampembeng 15:6f2798e45099 142 led_red = !(ucColor & 0x1); //bit 0
ampembeng 15:6f2798e45099 143 led_green = !(ucColor & 0x2); //bit 1
ampembeng 15:6f2798e45099 144 led_blue = !(ucColor & 0x4); //bit 2
ampembeng 15:6f2798e45099 145 }
Janos Follath 0:fc70c47eecb4 146
ampembeng 15:6f2798e45099 147 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 148 //* Print LED and sensor data
ampembeng 23:b9ff83dc965f 149 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 150 void printData()
ampembeng 23:b9ff83dc965f 151 {
ampembeng 23:b9ff83dc965f 152 INFO("Temperature is: %0.2f F", temperature);
RaghuT 28:d549de7c3aad 153 INFO("Humidity is: %0.2f %", humidity);
ampembeng 23:b9ff83dc965f 154 switch (ledColor) {
ampembeng 23:b9ff83dc965f 155 case COLOR_OFF:
ampembeng 23:b9ff83dc965f 156 INFO("LED: Off");
ampembeng 23:b9ff83dc965f 157 break;
ampembeng 23:b9ff83dc965f 158 case COLOR_RED:
ampembeng 23:b9ff83dc965f 159 INFO("LED: Red");
ampembeng 23:b9ff83dc965f 160 break;
ampembeng 23:b9ff83dc965f 161 case COLOR_GREEN:
ampembeng 23:b9ff83dc965f 162 INFO("LED: Green");
ampembeng 23:b9ff83dc965f 163 break;
ampembeng 23:b9ff83dc965f 164 case COLOR_BLUE:
ampembeng 23:b9ff83dc965f 165 INFO("LED: Blue");
ampembeng 23:b9ff83dc965f 166 break;
ampembeng 23:b9ff83dc965f 167 case COLOR_WHITE:
ampembeng 23:b9ff83dc965f 168 INFO("LED: White");
ampembeng 23:b9ff83dc965f 169 break;
ampembeng 23:b9ff83dc965f 170 }
ampembeng 23:b9ff83dc965f 171 }
ampembeng 23:b9ff83dc965f 172
ampembeng 15:6f2798e45099 173 //=====================================================================================================================
ampembeng 15:6f2798e45099 174 //
ampembeng 15:6f2798e45099 175 // AWS Shadow Callbacks
ampembeng 15:6f2798e45099 176 //
ampembeng 15:6f2798e45099 177 //=====================================================================================================================
ampembeng 15:6f2798e45099 178 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 179 //* This is the callback function that fires when an update is sent. It will print the update response status.
ampembeng 15:6f2798e45099 180 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 181 void ShadowUpdateStatusCallback(const char *pThingName, ShadowActions_t action, Shadow_Ack_Status_t status,
ampembeng 15:6f2798e45099 182 const char *pReceivedJsonDocument, void *pContextData) {
Janos Follath 0:fc70c47eecb4 183
ampembeng 15:6f2798e45099 184 INFO("Shadow Update Status Callback");
ampembeng 15:6f2798e45099 185
ampembeng 15:6f2798e45099 186 if (status == SHADOW_ACK_TIMEOUT) {
ampembeng 15:6f2798e45099 187 INFO("Update Timeout--");
ampembeng 15:6f2798e45099 188 } else if (status == SHADOW_ACK_REJECTED) {
ampembeng 15:6f2798e45099 189 INFO("Update RejectedXX");
ampembeng 15:6f2798e45099 190 } else if (status == SHADOW_ACK_ACCEPTED) {
ampembeng 15:6f2798e45099 191 INFO("Update Accepted!!"); // Good
ampembeng 15:6f2798e45099 192 }
ampembeng 15:6f2798e45099 193 }
Janos Follath 0:fc70c47eecb4 194
ampembeng 15:6f2798e45099 195 //*********************************************************************************************************************
RaghuT 28:d549de7c3aad 196 //* These are the callback functions that fire when AWS has sends out a shadow update.
ampembeng 15:6f2798e45099 197 //*********************************************************************************************************************
ampembeng 15:6f2798e45099 198 void ledControl_Callback(const char *pJsonString, uint32_t JsonStringDataLen, jsonStruct_t *pContext) {
ampembeng 15:6f2798e45099 199
ampembeng 15:6f2798e45099 200 INFO("LED Callback Detected.");
ampembeng 15:6f2798e45099 201
ampembeng 15:6f2798e45099 202 if (pContext != NULL) {
ampembeng 15:6f2798e45099 203 switch (*(unsigned char *)(pContext->pData)){
ampembeng 15:6f2798e45099 204 case COLOR_OFF:
ampembeng 15:6f2798e45099 205 INFO("LED -> OFF (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 206 break;
ampembeng 15:6f2798e45099 207 case COLOR_RED:
ampembeng 15:6f2798e45099 208 INFO("LED -> RED (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 209 break;
ampembeng 15:6f2798e45099 210 case COLOR_GREEN:
ampembeng 15:6f2798e45099 211 INFO("LED -> GREEN (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 212 break;
ampembeng 15:6f2798e45099 213 case COLOR_BLUE:
ampembeng 15:6f2798e45099 214 INFO("LED -> BLUE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 215 break;
ampembeng 15:6f2798e45099 216 case COLOR_WHITE:
ampembeng 15:6f2798e45099 217 INFO("LED -> WHITE (%d)", *(unsigned char *)(pContext->pData));
ampembeng 15:6f2798e45099 218 break;
Janos Follath 0:fc70c47eecb4 219 }
ampembeng 15:6f2798e45099 220 }
ampembeng 15:6f2798e45099 221 else {
ampembeng 15:6f2798e45099 222 INFO("pContext was detected as NULL");
Janos Follath 0:fc70c47eecb4 223 }
ampembeng 15:6f2798e45099 224 }
RaghuT 28:d549de7c3aad 225
RaghuT 28:d549de7c3aad 226 //This callback handles changing the lcdMEssage field that is sent to the slave device
RaghuT 28:d549de7c3aad 227 void lcdControl_Callback(const char *pJsonString, uint32_t JsonStringDataLen, jsonStruct_t *pContext) {
RaghuT 28:d549de7c3aad 228 INFO("LCD Callback detected");
RaghuT 28:d549de7c3aad 229 INFO("LCD String is %s", (char *) (pContext->pData));
RaghuT 28:d549de7c3aad 230 if(pJsonString != NULL) {
RaghuT 28:d549de7c3aad 231 int index = 0;
RaghuT 28:d549de7c3aad 232 while(pJsonString != NULL && pJsonString[index] != '"') {
RaghuT 28:d549de7c3aad 233 index++;
RaghuT 28:d549de7c3aad 234 }
RaghuT 28:d549de7c3aad 235 string tempString(pJsonString, pJsonString + index);
RaghuT 28:d549de7c3aad 236 lcdMessage.assign(tempString);
RaghuT 28:d549de7c3aad 237 }
RaghuT 28:d549de7c3aad 238 }
RaghuT 28:d549de7c3aad 239
RaghuT 28:d549de7c3aad 240 //Callback when dataUsage stats are updated
RaghuT 28:d549de7c3aad 241 void dataUsageCallback(const char *pJsonString, uint32_t JsonStringDataLen, jsonStruct_t *pContext) {
RaghuT 28:d549de7c3aad 242 INFO("Data usage callback detected");
RaghuT 28:d549de7c3aad 243 }
ampembeng 23:b9ff83dc965f 244 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 245 //* Subscribe callback (used with alternate demo)
ampembeng 23:b9ff83dc965f 246 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 247 int MQTTcallbackHandler(MQTTCallbackParams params) {
ampembeng 23:b9ff83dc965f 248
ampembeng 23:b9ff83dc965f 249 INFO("Subscribe callback");
ampembeng 23:b9ff83dc965f 250 INFO("%.*s\t%.*s",
ampembeng 23:b9ff83dc965f 251 (int)params.TopicNameLen, params.pTopicName,
ampembeng 23:b9ff83dc965f 252 (int)params.MessageParams.PayloadLen, (char*)params.MessageParams.pPayload);
ampembeng 23:b9ff83dc965f 253
ampembeng 23:b9ff83dc965f 254 return 0;
ampembeng 23:b9ff83dc965f 255 }
ampembeng 23:b9ff83dc965f 256
ampembeng 23:b9ff83dc965f 257 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 258 //* Disconnect handling (used with alternate demo)
ampembeng 23:b9ff83dc965f 259 //*********************************************************************************************************************
ampembeng 23:b9ff83dc965f 260 void disconnectCallbackHandler(void) {
ampembeng 23:b9ff83dc965f 261 WARN("MQTT Disconnect");
ampembeng 23:b9ff83dc965f 262 IoT_Error_t rc = NONE_ERROR;
ampembeng 23:b9ff83dc965f 263 if(aws_iot_is_autoreconnect_enabled()){
ampembeng 23:b9ff83dc965f 264 INFO("Auto Reconnect is enabled, Reconnecting attempt will start now");
ampembeng 23:b9ff83dc965f 265 }else{
ampembeng 23:b9ff83dc965f 266 WARN("Auto Reconnect not enabled. Starting manual reconnect...");
ampembeng 23:b9ff83dc965f 267 rc = aws_iot_mqtt_attempt_reconnect();
ampembeng 23:b9ff83dc965f 268 if(RECONNECT_SUCCESSFUL == rc){
ampembeng 23:b9ff83dc965f 269 WARN("Manual Reconnect Successful");
ampembeng 23:b9ff83dc965f 270 }else{
ampembeng 23:b9ff83dc965f 271 WARN("Manual Reconnect Failed - %d", rc);
ampembeng 23:b9ff83dc965f 272 }
ampembeng 23:b9ff83dc965f 273 }
ampembeng 23:b9ff83dc965f 274 }
ampembeng 23:b9ff83dc965f 275
RaghuT 28:d549de7c3aad 276 //*********************************************************************************************************************
RaghuT 28:d549de7c3aad 277 //* Send LCD message over bluetooth interface
RaghuT 28:d549de7c3aad 278 //*********************************************************************************************************************
RaghuT 28:d549de7c3aad 279 void setLCDMessage(string str) {
RaghuT 28:d549de7c3aad 280 bluetooth.putc('*');
RaghuT 28:d549de7c3aad 281 for(int i = 0; i < str.length(); i++) {
RaghuT 28:d549de7c3aad 282 bluetooth.putc(str.at(i));
RaghuT 28:d549de7c3aad 283 }
RaghuT 28:d549de7c3aad 284 bluetooth.putc('\n');
ampembeng 23:b9ff83dc965f 285 }
ampembeng 15:6f2798e45099 286
ampembeng 15:6f2798e45099 287 //=====================================================================================================================
ampembeng 15:6f2798e45099 288 //
ampembeng 15:6f2798e45099 289 // Main
ampembeng 15:6f2798e45099 290 //
ampembeng 15:6f2798e45099 291 //=====================================================================================================================
ampembeng 15:6f2798e45099 292 int main() {
ampembeng 15:6f2798e45099 293 // Set baud rate for PC Serial
ampembeng 15:6f2798e45099 294 pc.baud(115200);
RaghuT 28:d549de7c3aad 295 bluetooth.baud(9600);
RaghuT 28:d549de7c3aad 296 INFO("Program Start");
RaghuT 28:d549de7c3aad 297
ampembeng 23:b9ff83dc965f 298 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 299 char JsonDocumentBuffer[MAX_LENGTH_OF_UPDATE_JSON_BUFFER];
ampembeng 15:6f2798e45099 300 size_t sizeOfJsonDocumentBuffer = sizeof(JsonDocumentBuffer) / sizeof(JsonDocumentBuffer[0]);
ampembeng 15:6f2798e45099 301
ampembeng 15:6f2798e45099 302 // JSON struct for LED control
ampembeng 15:6f2798e45099 303 jsonStruct_t ledController;
ampembeng 15:6f2798e45099 304 ledController.cb = ledControl_Callback;
ampembeng 15:6f2798e45099 305 ledController.pData = &ledColor;
ampembeng 15:6f2798e45099 306 ledController.pKey = "ledColor";
ampembeng 15:6f2798e45099 307 ledController.type = SHADOW_JSON_UINT8;
RaghuT 28:d549de7c3aad 308
RaghuT 28:d549de7c3aad 309 // JSON struct for LCD control
RaghuT 28:d549de7c3aad 310 jsonStruct_t lcdController;
RaghuT 28:d549de7c3aad 311 lcdController.cb = lcdControl_Callback;
RaghuT 28:d549de7c3aad 312 lcdController.pData = &lcdMessage[0u];
RaghuT 28:d549de7c3aad 313 lcdController.pKey = "lcdMessage";
RaghuT 28:d549de7c3aad 314 lcdController.type = SHADOW_JSON_STRING;
RaghuT 28:d549de7c3aad 315
ampembeng 20:ee34856ae510 316 // JSON struct for temperature\humidity readings
ampembeng 15:6f2798e45099 317 jsonStruct_t temperatureHandler;
ampembeng 15:6f2798e45099 318 temperatureHandler.cb = NULL;
ampembeng 15:6f2798e45099 319 temperatureHandler.pKey = "temperature";
ampembeng 15:6f2798e45099 320 temperatureHandler.pData = &temperature;
ampembeng 15:6f2798e45099 321 temperatureHandler.type = SHADOW_JSON_FLOAT;
ampembeng 20:ee34856ae510 322
ampembeng 20:ee34856ae510 323 jsonStruct_t humidityHandler;
ampembeng 20:ee34856ae510 324 humidityHandler.cb = NULL;
ampembeng 20:ee34856ae510 325 humidityHandler.pKey = "humidity";
ampembeng 20:ee34856ae510 326 humidityHandler.pData = &humidity;
RaghuT 28:d549de7c3aad 327 humidityHandler.type = SHADOW_JSON_FLOAT;
RaghuT 28:d549de7c3aad 328
RaghuT 28:d549de7c3aad 329 //JSON struct for signal strength readings
RaghuT 28:d549de7c3aad 330 jsonStruct_t signalStrengthHandler;
RaghuT 28:d549de7c3aad 331 signalStrengthHandler.cb = NULL;
RaghuT 28:d549de7c3aad 332 signalStrengthHandler.pKey = "Signal Strength";
RaghuT 28:d549de7c3aad 333 signalStrengthHandler.pData = &signalQuality;
RaghuT 28:d549de7c3aad 334 signalStrengthHandler.type = SHADOW_JSON_INT16;
RaghuT 28:d549de7c3aad 335
RaghuT 28:d549de7c3aad 336 //JSON struct for data usage
RaghuT 28:d549de7c3aad 337 jsonStruct_t dataUsageHandler;
RaghuT 28:d549de7c3aad 338 dataUsageHandler.cb = dataUsageCallback;
RaghuT 28:d549de7c3aad 339 dataUsageHandler.pKey = "Data Usage";
RaghuT 28:d549de7c3aad 340 dataUsageHandler.pData = &dataUsage;
RaghuT 28:d549de7c3aad 341 dataUsageHandler.type = SHADOW_JSON_UINT32;
ampembeng 15:6f2798e45099 342
ampembeng 15:6f2798e45099 343 INFO("AWS IoT SDK Version(dev) %d.%d.%d-%s", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, VERSION_TAG);
ampembeng 15:6f2798e45099 344
RaghuT 28:d549de7c3aad 345
ampembeng 18:6370da1de572 346 INFO("Using #defines in aws_iot_config.h and certs from certs.cpp for AWS config.");
ampembeng 15:6f2798e45099 347
ampembeng 16:02008a2a2569 348 // Startup signal - blinks through RGBW then turns off
ampembeng 15:6f2798e45099 349 SetLedColor(COLOR_RED);
ampembeng 15:6f2798e45099 350 wait(.5);
ampembeng 15:6f2798e45099 351 SetLedColor(COLOR_GREEN);
ampembeng 15:6f2798e45099 352 wait(.5);
ampembeng 15:6f2798e45099 353 SetLedColor(COLOR_BLUE);
ampembeng 15:6f2798e45099 354 wait(.5);
ampembeng 16:02008a2a2569 355 SetLedColor(COLOR_WHITE);
ampembeng 16:02008a2a2569 356 wait(.5);
ampembeng 16:02008a2a2569 357 SetLedColor(COLOR_OFF);
ampembeng 15:6f2798e45099 358
ampembeng 15:6f2798e45099 359 // Boot the Avnet Shield before any other operations
ampembeng 23:b9ff83dc965f 360 INFO("Net Boot...");
ampembeng 15:6f2798e45099 361 net_modem_boot();
RaghuT 28:d549de7c3aad 362
ampembeng 18:6370da1de572 363 // Intialize MQTT/Cert parameters
ampembeng 15:6f2798e45099 364 ShadowParameters_t sp = ShadowParametersDefault;
ampembeng 18:6370da1de572 365 #ifdef USING_SD_CARD
ampembeng 18:6370da1de572 366 rc = (IoT_Error_t)mbedtls_mqtt_config_parse_file(&sp, AWS_MQTT_CONFIG_FILENAME);
ampembeng 18:6370da1de572 367 if (NONE_ERROR != rc) {
ampembeng 18:6370da1de572 368 ERROR("Failed to initialize mqtt parameters %d", rc);
ampembeng 18:6370da1de572 369 return rc;
ampembeng 18:6370da1de572 370 }
ampembeng 18:6370da1de572 371 sp.pClientCRT = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 18:6370da1de572 372 sp.pClientKey = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 18:6370da1de572 373 sp.pRootCA = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 18:6370da1de572 374 #else
ampembeng 15:6f2798e45099 375 sp.pMyThingName = AWS_IOT_MY_THING_NAME;
ampembeng 15:6f2798e45099 376 sp.pMqttClientId = AWS_IOT_MQTT_CLIENT_ID;
ampembeng 15:6f2798e45099 377 sp.pHost = HostAddress;
ampembeng 15:6f2798e45099 378 sp.port = port;
ampembeng 23:b9ff83dc965f 379
ampembeng 23:b9ff83dc965f 380 sp.pClientCRT = AWS_IOT_CERTIFICATE_FILENAME;
ampembeng 23:b9ff83dc965f 381 sp.pClientKey = AWS_IOT_PRIVATE_KEY_FILENAME;
ampembeng 23:b9ff83dc965f 382 sp.pRootCA = AWS_IOT_ROOT_CA_FILENAME;
ampembeng 18:6370da1de572 383 #endif
RaghuT 28:d549de7c3aad 384
ampembeng 18:6370da1de572 385 INFO("Initialize the MQTT client...");
ampembeng 18:6370da1de572 386 MQTTClient_t mqttClient;
ampembeng 18:6370da1de572 387 aws_iot_mqtt_init(&mqttClient);
RaghuT 28:d549de7c3aad 388
ampembeng 15:6f2798e45099 389 INFO("Shadow Init...");
ampembeng 15:6f2798e45099 390 rc = aws_iot_shadow_init(&mqttClient);
ampembeng 15:6f2798e45099 391 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 392 ERROR("Shadow Init Error %d", rc);
ampembeng 15:6f2798e45099 393 return rc;
Janos Follath 0:fc70c47eecb4 394 }
ampembeng 15:6f2798e45099 395
ampembeng 15:6f2798e45099 396 INFO("Shadow Connect...");
ampembeng 15:6f2798e45099 397 rc = aws_iot_shadow_connect(&mqttClient, &sp);
ampembeng 15:6f2798e45099 398 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 399 ERROR("Shadow Connection Error %d", rc);
ampembeng 15:6f2798e45099 400 return rc;
Janos Follath 0:fc70c47eecb4 401 }
Janos Follath 0:fc70c47eecb4 402
ampembeng 15:6f2798e45099 403 // Enable Auto Reconnect functionality. Minimum and Maximum time of Exponential backoff are set in aws_iot_config.h
ampembeng 15:6f2798e45099 404 // #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL
ampembeng 15:6f2798e45099 405 // #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL
RaghuT 28:d549de7c3aad 406
ampembeng 15:6f2798e45099 407 rc = mqttClient.setAutoReconnectStatus(true);
ampembeng 15:6f2798e45099 408 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 409 ERROR("Unable to set Auto Reconnect to true - %d", rc);
ampembeng 15:6f2798e45099 410 return rc;
ampembeng 15:6f2798e45099 411 }
RaghuT 28:d549de7c3aad 412
ampembeng 15:6f2798e45099 413 INFO("Shadow Register Delta...");
ampembeng 15:6f2798e45099 414 rc = aws_iot_shadow_register_delta(&mqttClient, &ledController);
ampembeng 15:6f2798e45099 415 if (NONE_ERROR != rc) {
RaghuT 28:d549de7c3aad 416 ERROR("Shadow Register Delta led Error");
ampembeng 15:6f2798e45099 417 return rc;
ampembeng 15:6f2798e45099 418 }
RaghuT 28:d549de7c3aad 419 rc = aws_iot_shadow_register_delta(&mqttClient, &lcdController);
RaghuT 28:d549de7c3aad 420 if (NONE_ERROR != rc) {
RaghuT 28:d549de7c3aad 421 ERROR("Shadow Register Delta lcd Error");
RaghuT 28:d549de7c3aad 422 return rc;
RaghuT 28:d549de7c3aad 423 }
RaghuT 28:d549de7c3aad 424 rc = aws_iot_shadow_register_delta(&mqttClient, &dataUsageHandler);
RaghuT 28:d549de7c3aad 425 if (NONE_ERROR != rc) {
RaghuT 28:d549de7c3aad 426 ERROR("Shadow Register Delta dataUsage Error");
RaghuT 28:d549de7c3aad 427 return rc;
RaghuT 28:d549de7c3aad 428 }
RaghuT 28:d549de7c3aad 429
ampembeng 15:6f2798e45099 430 INFO("Will attempt to sync with device shadow every %f seconds.", SHADOW_SYNC_INTERVAL);
ampembeng 15:6f2798e45099 431 // Loop and publish changes from the FRDM board
ampembeng 15:6f2798e45099 432 while (NETWORK_ATTEMPTING_RECONNECT == rc || RECONNECT_SUCCESSFUL == rc || NONE_ERROR == rc) {
ampembeng 15:6f2798e45099 433 // Looks for incoming socket messages
ampembeng 15:6f2798e45099 434 rc = aws_iot_shadow_yield(&mqttClient, 200);
ampembeng 15:6f2798e45099 435 if (NETWORK_ATTEMPTING_RECONNECT == rc) {
ampembeng 15:6f2798e45099 436 // If the client is attempting to reconnect we will skip the rest of the loop.
ampembeng 15:6f2798e45099 437 INFO("Attempting to reconnect...");
ampembeng 15:6f2798e45099 438 wait(1);
ampembeng 15:6f2798e45099 439 continue;
ampembeng 15:6f2798e45099 440 }
RaghuT 28:d549de7c3aad 441 //Read signal quality
RaghuT 28:d549de7c3aad 442 signalQuality = WNCInterface::_pwnc->getDbmRssi();
ampembeng 20:ee34856ae510 443
ampembeng 20:ee34856ae510 444 // Read sensor data
RaghuT 28:d549de7c3aad 445 if(bluetooth.writeable()) {
RaghuT 28:d549de7c3aad 446 bluetooth.putc('t'); //request for sensor data
RaghuT 28:d549de7c3aad 447 } else {
RaghuT 28:d549de7c3aad 448 INFO("Can't write to bluetooth");
RaghuT 28:d549de7c3aad 449 }
RaghuT 28:d549de7c3aad 450
RaghuT 28:d549de7c3aad 451 //parse incoming sensor data
RaghuT 28:d549de7c3aad 452 string resultTemp = "";
RaghuT 28:d549de7c3aad 453 string resultHum = "";
RaghuT 28:d549de7c3aad 454 string * result = &resultTemp;
RaghuT 28:d549de7c3aad 455 while(bluetooth.readable()) {
RaghuT 28:d549de7c3aad 456 int c = bluetooth.getc();
RaghuT 28:d549de7c3aad 457 char ch = static_cast<char>(c);
RaghuT 28:d549de7c3aad 458 if(ch == '\n') {
RaghuT 28:d549de7c3aad 459 result = &resultHum;
RaghuT 28:d549de7c3aad 460 }
RaghuT 28:d549de7c3aad 461 *result += ch;
RaghuT 28:d549de7c3aad 462 }
RaghuT 28:d549de7c3aad 463
RaghuT 28:d549de7c3aad 464 temperature = CTOF(atof(resultTemp.c_str()));
RaghuT 28:d549de7c3aad 465 humidity = atof(resultHum.c_str());
RaghuT 28:d549de7c3aad 466
ampembeng 15:6f2798e45099 467 INFO("\n=======================================================================================\n");
ampembeng 15:6f2798e45099 468 // Initialize JSON shadow document
ampembeng 15:6f2798e45099 469 rc = aws_iot_shadow_init_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
ampembeng 15:6f2798e45099 470 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 471
ampembeng 23:b9ff83dc965f 472 // Updates the 'reported' color/temp/humidity
RaghuT 28:d549de7c3aad 473 rc = aws_iot_shadow_add_reported(JsonDocumentBuffer, sizeOfJsonDocumentBuffer, 4, &ledController,
RaghuT 28:d549de7c3aad 474 &lcdController,
RaghuT 28:d549de7c3aad 475 &signalStrengthHandler,
RaghuT 28:d549de7c3aad 476 &dataUsageHandler);
ampembeng 15:6f2798e45099 477
ampembeng 15:6f2798e45099 478 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 479 rc = aws_iot_finalize_json_document(JsonDocumentBuffer, sizeOfJsonDocumentBuffer);
ampembeng 15:6f2798e45099 480
ampembeng 15:6f2798e45099 481 if (rc == NONE_ERROR) {
ampembeng 15:6f2798e45099 482 INFO("Update Shadow: %s", JsonDocumentBuffer);
ampembeng 18:6370da1de572 483 rc = aws_iot_shadow_update(&mqttClient, sp.pMyThingName, JsonDocumentBuffer,
RaghuT 28:d549de7c3aad 484 ShadowUpdateStatusCallback, NULL, 15, true);
ampembeng 15:6f2798e45099 485 }
ampembeng 15:6f2798e45099 486 }
ampembeng 20:ee34856ae510 487 }
RaghuT 28:d549de7c3aad 488 /*
RaghuT 28:d549de7c3aad 489 // Loading data into JSON format
RaghuT 28:d549de7c3aad 490 sprintf(cPayload, "{\"color\":\"%s\",\"temperature\":%f,\"humidity\":%f}", colorStrings[ledColor], temperature, humidity);
RaghuT 28:d549de7c3aad 491 Msg.PayloadLen = strlen(cPayload) + 1;
RaghuT 28:d549de7c3aad 492 Params.MessageParams = Msg;
RaghuT 28:d549de7c3aad 493
RaghuT 28:d549de7c3aad 494 // Publish
RaghuT 28:d549de7c3aad 495 rc = aws_iot_mqtt_publish(&Params);
RaghuT 28:d549de7c3aad 496 if (publishCount > 0) {
RaghuT 28:d549de7c3aad 497 publishCount--;
RaghuT 28:d549de7c3aad 498 }
RaghuT 28:d549de7c3aad 499 */
ampembeng 20:ee34856ae510 500 // Print data
ampembeng 23:b9ff83dc965f 501 printData();
ampembeng 18:6370da1de572 502 INFO("*****************************************************************************************");
ampembeng 20:ee34856ae510 503
ampembeng 20:ee34856ae510 504 // Set the LED color
ampembeng 15:6f2798e45099 505 SetLedColor(ledColor);
RaghuT 28:d549de7c3aad 506
RaghuT 28:d549de7c3aad 507 //Set lcd message
RaghuT 28:d549de7c3aad 508 setLCDMessage(lcdMessage);
ampembeng 15:6f2798e45099 509 wait(SHADOW_SYNC_INTERVAL);
Janos Follath 0:fc70c47eecb4 510 }
Janos Follath 0:fc70c47eecb4 511
ampembeng 15:6f2798e45099 512 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 513 ERROR("An error occurred in the loop %d", rc);
Janos Follath 0:fc70c47eecb4 514 }
Janos Follath 0:fc70c47eecb4 515
ampembeng 15:6f2798e45099 516 INFO("Disconnecting");
ampembeng 15:6f2798e45099 517 rc = aws_iot_shadow_disconnect(&mqttClient);
ampembeng 15:6f2798e45099 518
ampembeng 15:6f2798e45099 519 if (NONE_ERROR != rc) {
ampembeng 15:6f2798e45099 520 ERROR("Disconnect error %d", rc);
Janos Follath 0:fc70c47eecb4 521 }
Janos Follath 0:fc70c47eecb4 522
ampembeng 15:6f2798e45099 523 return rc;
ampembeng 15:6f2798e45099 524 }