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:
rfinn
Date:
Tue Feb 07 16:18:57 2017 +0000
Revision:
27:2f486c766854
Parent:
15:6f2798e45099
changed SDFileSystem library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ampembeng 15:6f2798e45099 1 /*
ampembeng 15:6f2798e45099 2 * Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
ampembeng 15:6f2798e45099 3 *
ampembeng 15:6f2798e45099 4 * Licensed under the Apache License, Version 2.0 (the "License").
ampembeng 15:6f2798e45099 5 * You may not use this file except in compliance with the License.
ampembeng 15:6f2798e45099 6 * A copy of the License is located at
ampembeng 15:6f2798e45099 7 *
ampembeng 15:6f2798e45099 8 * http://aws.amazon.com/apache2.0
ampembeng 15:6f2798e45099 9 *
ampembeng 15:6f2798e45099 10 * or in the "license" file accompanying this file. This file is distributed
ampembeng 15:6f2798e45099 11 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
ampembeng 15:6f2798e45099 12 * express or implied. See the License for the specific language governing
ampembeng 15:6f2798e45099 13 * permissions and limitations under the License.
ampembeng 15:6f2798e45099 14 */
ampembeng 15:6f2798e45099 15
ampembeng 15:6f2798e45099 16 #include "aws_iot_error.h"
ampembeng 15:6f2798e45099 17 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 18 #include "aws_iot_shadow_actions.h"
ampembeng 15:6f2798e45099 19 #include "aws_iot_shadow_json.h"
ampembeng 15:6f2798e45099 20 #include "aws_iot_shadow_key.h"
ampembeng 15:6f2798e45099 21 #include "aws_iot_shadow_records.h"
ampembeng 15:6f2798e45099 22
ampembeng 15:6f2798e45099 23 const ShadowParameters_t ShadowParametersDefault = {
ampembeng 15:6f2798e45099 24 .pMyThingName = AWS_IOT_MY_THING_NAME,
ampembeng 15:6f2798e45099 25 .pMqttClientId = AWS_IOT_MQTT_CLIENT_ID,
ampembeng 15:6f2798e45099 26 .pHost = AWS_IOT_MQTT_HOST,
ampembeng 15:6f2798e45099 27 .port = AWS_IOT_MQTT_PORT,
ampembeng 15:6f2798e45099 28 .pRootCA = NULL,
ampembeng 15:6f2798e45099 29 .pClientCRT = NULL,
ampembeng 15:6f2798e45099 30 .pClientKey = NULL
ampembeng 15:6f2798e45099 31 };
ampembeng 15:6f2798e45099 32
ampembeng 15:6f2798e45099 33 void aws_iot_shadow_reset_last_received_version(void) {
ampembeng 15:6f2798e45099 34 shadowJsonVersionNum = 0;
ampembeng 15:6f2798e45099 35 }
ampembeng 15:6f2798e45099 36
ampembeng 15:6f2798e45099 37 uint32_t aws_iot_shadow_get_last_received_version(void) {
ampembeng 15:6f2798e45099 38 return shadowJsonVersionNum;
ampembeng 15:6f2798e45099 39 }
ampembeng 15:6f2798e45099 40
ampembeng 15:6f2798e45099 41 void aws_iot_shadow_enable_discard_old_delta_msgs(void) {
ampembeng 15:6f2798e45099 42 shadowDiscardOldDeltaFlag = true;
ampembeng 15:6f2798e45099 43 }
ampembeng 15:6f2798e45099 44
ampembeng 15:6f2798e45099 45 void aws_iot_shadow_disable_discard_old_delta_msgs(void) {
ampembeng 15:6f2798e45099 46 shadowDiscardOldDeltaFlag = false;
ampembeng 15:6f2798e45099 47 }
ampembeng 15:6f2798e45099 48
ampembeng 15:6f2798e45099 49 IoT_Error_t aws_iot_shadow_init(MQTTClient_t *pClient) {
ampembeng 15:6f2798e45099 50
ampembeng 15:6f2798e45099 51 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 52
ampembeng 15:6f2798e45099 53 if (pClient == NULL) {
ampembeng 15:6f2798e45099 54 return NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 55 }
ampembeng 15:6f2798e45099 56
ampembeng 15:6f2798e45099 57 resetClientTokenSequenceNum();
ampembeng 15:6f2798e45099 58 aws_iot_shadow_reset_last_received_version();
ampembeng 15:6f2798e45099 59 initDeltaTokens();
ampembeng 15:6f2798e45099 60 return NONE_ERROR;
ampembeng 15:6f2798e45099 61 }
ampembeng 15:6f2798e45099 62
ampembeng 15:6f2798e45099 63 IoT_Error_t aws_iot_shadow_connect(MQTTClient_t *pClient, ShadowParameters_t *pParams) {
ampembeng 15:6f2798e45099 64 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 65
ampembeng 15:6f2798e45099 66 MQTTConnectParams ConnectParams = MQTTConnectParamsDefault;
ampembeng 15:6f2798e45099 67 if (pClient == NULL) {
ampembeng 15:6f2798e45099 68 return NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 69 }
ampembeng 15:6f2798e45099 70
ampembeng 15:6f2798e45099 71 if (pClient->connect == NULL) {
ampembeng 15:6f2798e45099 72 return NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 73 }
ampembeng 15:6f2798e45099 74
ampembeng 15:6f2798e45099 75 snprintf(myThingName, MAX_SIZE_OF_THING_NAME, "%s", pParams->pMyThingName );
ampembeng 15:6f2798e45099 76 snprintf(mqttClientID, MAX_SIZE_OF_UNIQUE_CLIENT_ID_BYTES, "%s", pParams->pMqttClientId );
ampembeng 15:6f2798e45099 77
ampembeng 15:6f2798e45099 78 INFO("...Thing Name %s", myThingName);
ampembeng 15:6f2798e45099 79 INFO("...MQTT Client ID %s", mqttClientID);
ampembeng 15:6f2798e45099 80
ampembeng 15:6f2798e45099 81 ConnectParams.KeepAliveInterval_sec = 10;
ampembeng 15:6f2798e45099 82 ConnectParams.MQTTVersion = MQTT_3_1_1;
ampembeng 15:6f2798e45099 83 ConnectParams.mqttCommandTimeout_ms = 10000;//2000;
ampembeng 15:6f2798e45099 84 ConnectParams.tlsHandshakeTimeout_ms = 10000;
ampembeng 15:6f2798e45099 85 ConnectParams.isCleansession = true;
ampembeng 15:6f2798e45099 86 ConnectParams.isSSLHostnameVerify = true;
ampembeng 15:6f2798e45099 87 ConnectParams.isWillMsgPresent = false;
ampembeng 15:6f2798e45099 88 ConnectParams.pClientID = pParams->pMqttClientId;
ampembeng 15:6f2798e45099 89 ConnectParams.pDeviceCertLocation = pParams->pClientCRT;
ampembeng 15:6f2798e45099 90 ConnectParams.pDevicePrivateKeyLocation = pParams->pClientKey;
ampembeng 15:6f2798e45099 91 ConnectParams.pRootCALocation = pParams->pRootCA;
ampembeng 15:6f2798e45099 92 ConnectParams.pPassword = NULL;
ampembeng 15:6f2798e45099 93 ConnectParams.pUserName = NULL;
ampembeng 15:6f2798e45099 94 ConnectParams.pHostURL = pParams->pHost;
ampembeng 15:6f2798e45099 95 ConnectParams.port = pParams->port;
ampembeng 15:6f2798e45099 96 ConnectParams.disconnectHandler = NULL;
ampembeng 15:6f2798e45099 97
ampembeng 15:6f2798e45099 98 rc = pClient->connect(&ConnectParams);
ampembeng 15:6f2798e45099 99
ampembeng 15:6f2798e45099 100 if(rc == NONE_ERROR){
ampembeng 15:6f2798e45099 101 initializeRecords(pClient);
ampembeng 15:6f2798e45099 102 }
ampembeng 15:6f2798e45099 103
ampembeng 15:6f2798e45099 104 return rc;
ampembeng 15:6f2798e45099 105 }
ampembeng 15:6f2798e45099 106
ampembeng 15:6f2798e45099 107 IoT_Error_t aws_iot_shadow_register_delta(MQTTClient_t *pClient, jsonStruct_t *pStruct) {
ampembeng 15:6f2798e45099 108 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 109
ampembeng 15:6f2798e45099 110 if (!(pClient->isConnected())) {
ampembeng 15:6f2798e45099 111 return CONNECTION_ERROR;
ampembeng 15:6f2798e45099 112 }
ampembeng 15:6f2798e45099 113
ampembeng 15:6f2798e45099 114 rc = registerJsonTokenOnDelta(pStruct);
ampembeng 15:6f2798e45099 115
ampembeng 15:6f2798e45099 116 return rc;
ampembeng 15:6f2798e45099 117 }
ampembeng 15:6f2798e45099 118
ampembeng 15:6f2798e45099 119 IoT_Error_t aws_iot_shadow_yield(MQTTClient_t *pClient, int timeout) {
ampembeng 15:6f2798e45099 120 HandleExpiredResponseCallbacks();
ampembeng 15:6f2798e45099 121 return pClient->yield(timeout);
ampembeng 15:6f2798e45099 122 }
ampembeng 15:6f2798e45099 123
ampembeng 15:6f2798e45099 124 IoT_Error_t aws_iot_shadow_disconnect(MQTTClient_t *pClient) {
ampembeng 15:6f2798e45099 125 return pClient->disconnect();
ampembeng 15:6f2798e45099 126 }
ampembeng 15:6f2798e45099 127
ampembeng 15:6f2798e45099 128 IoT_Error_t aws_iot_shadow_update(MQTTClient_t *pClient, const char *pThingName, char *pJsonString,
ampembeng 15:6f2798e45099 129 fpActionCallback_t callback, void *pContextData, uint8_t timeout_seconds, bool isPersistentSubscribe) {
ampembeng 15:6f2798e45099 130
ampembeng 15:6f2798e45099 131 IoT_Error_t ret_val = NONE_ERROR;
ampembeng 15:6f2798e45099 132
ampembeng 15:6f2798e45099 133 if (!(pClient->isConnected())) {
ampembeng 15:6f2798e45099 134 return CONNECTION_ERROR;
ampembeng 15:6f2798e45099 135 }
ampembeng 15:6f2798e45099 136
ampembeng 15:6f2798e45099 137 ret_val = iot_shadow_action(pClient, pThingName, SHADOW_UPDATE, pJsonString, callback, pContextData,
ampembeng 15:6f2798e45099 138 timeout_seconds, isPersistentSubscribe);
ampembeng 15:6f2798e45099 139
ampembeng 15:6f2798e45099 140 return ret_val;
ampembeng 15:6f2798e45099 141 }
ampembeng 15:6f2798e45099 142
ampembeng 15:6f2798e45099 143 IoT_Error_t aws_iot_shadow_delete(MQTTClient_t *pClient, const char *pThingName, fpActionCallback_t callback,
ampembeng 15:6f2798e45099 144 void *pContextData, uint8_t timeout_seconds, bool isPersistentSubscribe) {
ampembeng 15:6f2798e45099 145 IoT_Error_t ret_val = NONE_ERROR;
ampembeng 15:6f2798e45099 146
ampembeng 15:6f2798e45099 147 if (!(pClient->isConnected())) {
ampembeng 15:6f2798e45099 148 return CONNECTION_ERROR;
ampembeng 15:6f2798e45099 149 }
ampembeng 15:6f2798e45099 150
ampembeng 15:6f2798e45099 151 char deleteRequestJsonBuf[MAX_SIZE_CLIENT_TOKEN_CLIENT_SEQUENCE];
ampembeng 15:6f2798e45099 152 iot_shadow_delete_request_json(deleteRequestJsonBuf);
ampembeng 15:6f2798e45099 153 ret_val = iot_shadow_action(pClient, pThingName, SHADOW_DELETE, deleteRequestJsonBuf, callback, pContextData,
ampembeng 15:6f2798e45099 154 timeout_seconds, isPersistentSubscribe);
ampembeng 15:6f2798e45099 155
ampembeng 15:6f2798e45099 156 return ret_val;
ampembeng 15:6f2798e45099 157 }
ampembeng 15:6f2798e45099 158
ampembeng 15:6f2798e45099 159 IoT_Error_t aws_iot_shadow_get(MQTTClient_t *pClient, const char *pThingName, fpActionCallback_t callback,
ampembeng 15:6f2798e45099 160 void *pContextData, uint8_t timeout_seconds, bool isPersistentSubscribe) {
ampembeng 15:6f2798e45099 161
ampembeng 15:6f2798e45099 162 IoT_Error_t ret_val = NONE_ERROR;
ampembeng 15:6f2798e45099 163
ampembeng 15:6f2798e45099 164 if (!(pClient->isConnected())) {
ampembeng 15:6f2798e45099 165 return CONNECTION_ERROR;
ampembeng 15:6f2798e45099 166 }
ampembeng 15:6f2798e45099 167
ampembeng 15:6f2798e45099 168 char getRequestJsonBuf[MAX_SIZE_CLIENT_TOKEN_CLIENT_SEQUENCE];
ampembeng 15:6f2798e45099 169
ampembeng 15:6f2798e45099 170 iot_shadow_get_request_json(getRequestJsonBuf);
ampembeng 15:6f2798e45099 171
ampembeng 15:6f2798e45099 172 ret_val = iot_shadow_action(pClient, pThingName, SHADOW_GET, getRequestJsonBuf, callback, pContextData,
ampembeng 15:6f2798e45099 173 timeout_seconds, isPersistentSubscribe);
ampembeng 15:6f2798e45099 174
ampembeng 15:6f2798e45099 175 return ret_val;
ampembeng 15:6f2798e45099 176 }
ampembeng 15:6f2798e45099 177