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 #include "timer_interface.h"
ampembeng 15:6f2798e45099 16 #include "aws_iot_mqtt_interface.h"
ampembeng 15:6f2798e45099 17 #include "MQTTClient.h"
ampembeng 15:6f2798e45099 18 #include "aws_iot_config.h"
ampembeng 15:6f2798e45099 19 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 20
ampembeng 15:6f2798e45099 21 static Client c;
ampembeng 15:6f2798e45099 22
ampembeng 15:6f2798e45099 23 static iot_disconnect_handler clientDisconnectHandler;
ampembeng 15:6f2798e45099 24
ampembeng 15:6f2798e45099 25 static unsigned char writebuf[AWS_IOT_MQTT_TX_BUF_LEN];
ampembeng 15:6f2798e45099 26 static unsigned char readbuf[AWS_IOT_MQTT_RX_BUF_LEN];
ampembeng 15:6f2798e45099 27
ampembeng 15:6f2798e45099 28 const MQTTConnectParams MQTTConnectParamsDefault = {
ampembeng 15:6f2798e45099 29 .enableAutoReconnect = 0,
ampembeng 15:6f2798e45099 30 .pHostURL = AWS_IOT_MQTT_HOST,
ampembeng 15:6f2798e45099 31 .port = AWS_IOT_MQTT_PORT,
ampembeng 15:6f2798e45099 32 .pRootCALocation = NULL,
ampembeng 15:6f2798e45099 33 .pDeviceCertLocation = NULL,
ampembeng 15:6f2798e45099 34 .pDevicePrivateKeyLocation = NULL,
ampembeng 15:6f2798e45099 35 .pClientID = NULL,
ampembeng 15:6f2798e45099 36 .pUserName = NULL,
ampembeng 15:6f2798e45099 37 .pPassword = NULL,
ampembeng 15:6f2798e45099 38 .MQTTVersion = MQTT_3_1_1,
ampembeng 15:6f2798e45099 39 .KeepAliveInterval_sec = 10,
ampembeng 15:6f2798e45099 40 .isCleansession = true,
ampembeng 15:6f2798e45099 41 .isWillMsgPresent = false,
ampembeng 15:6f2798e45099 42 .will={.pTopicName = NULL, .pMessage = NULL, .isRetained = false, .qos = QOS_0},
ampembeng 15:6f2798e45099 43 .mqttCommandTimeout_ms = 1000,
ampembeng 15:6f2798e45099 44 .tlsHandshakeTimeout_ms = 2000,
ampembeng 15:6f2798e45099 45 .isSSLHostnameVerify = true,
ampembeng 15:6f2798e45099 46 .disconnectHandler = NULL
ampembeng 15:6f2798e45099 47 };
ampembeng 15:6f2798e45099 48
ampembeng 15:6f2798e45099 49 const MQTTPublishParams MQTTPublishParamsDefault={
ampembeng 15:6f2798e45099 50 .pTopic = NULL,
ampembeng 15:6f2798e45099 51 .MessageParams = {.qos = QOS_0, .isRetained=false, .isDuplicate = false, .id = 0, .pPayload = NULL, .PayloadLen = 0}
ampembeng 15:6f2798e45099 52 };
ampembeng 15:6f2798e45099 53 const MQTTSubscribeParams MQTTSubscribeParamsDefault={
ampembeng 15:6f2798e45099 54 .pTopic = NULL,
ampembeng 15:6f2798e45099 55 .qos = QOS_0,
ampembeng 15:6f2798e45099 56 .mHandler = NULL
ampembeng 15:6f2798e45099 57 };
ampembeng 15:6f2798e45099 58 const MQTTCallbackParams MQTTCallbackParamsDefault={
ampembeng 15:6f2798e45099 59 .pTopicName = NULL,
ampembeng 15:6f2798e45099 60 .TopicNameLen = 0,
ampembeng 15:6f2798e45099 61 .MessageParams = {.qos = QOS_0, .isRetained=false, .isDuplicate = false, .id = 0, .pPayload = NULL, .PayloadLen = 0}
ampembeng 15:6f2798e45099 62 };
ampembeng 15:6f2798e45099 63 const MQTTMessageParams MQTTMessageParamsDefault={
ampembeng 15:6f2798e45099 64 .qos = QOS_0,
ampembeng 15:6f2798e45099 65 .isRetained=false,
ampembeng 15:6f2798e45099 66 .isDuplicate = false,
ampembeng 15:6f2798e45099 67 .id = 0,
ampembeng 15:6f2798e45099 68 .pPayload = NULL,
ampembeng 15:6f2798e45099 69 .PayloadLen = 0
ampembeng 15:6f2798e45099 70 };
ampembeng 15:6f2798e45099 71 const MQTTwillOptions MQTTwillOptionsDefault={
ampembeng 15:6f2798e45099 72 .pTopicName = NULL,
ampembeng 15:6f2798e45099 73 .pMessage = NULL,
ampembeng 15:6f2798e45099 74 .isRetained = false,
ampembeng 15:6f2798e45099 75 .qos = QOS_0
ampembeng 15:6f2798e45099 76 };
ampembeng 15:6f2798e45099 77
ampembeng 15:6f2798e45099 78 #define GETLOWER4BYTES 0x0FFFFFFFF
ampembeng 15:6f2798e45099 79 void pahoMessageCallback(MessageData* md) {
ampembeng 15:6f2798e45099 80 MQTTMessage* message = md->message;
ampembeng 15:6f2798e45099 81 MQTTCallbackParams params;
ampembeng 15:6f2798e45099 82
ampembeng 15:6f2798e45099 83 // early exit if we do not have a valid callback pointer
ampembeng 15:6f2798e45099 84 if (md->applicationHandler == NULL) {
ampembeng 15:6f2798e45099 85 return;
ampembeng 15:6f2798e45099 86 }
ampembeng 15:6f2798e45099 87
ampembeng 15:6f2798e45099 88 if (NULL != md->topicName->lenstring.data) {
ampembeng 15:6f2798e45099 89 params.pTopicName = md->topicName->lenstring.data;
ampembeng 15:6f2798e45099 90 params.TopicNameLen = (uint16_t)(md->topicName->lenstring.len);
ampembeng 15:6f2798e45099 91 }
ampembeng 15:6f2798e45099 92 if (NULL != message) {
ampembeng 15:6f2798e45099 93 params.MessageParams.PayloadLen = message->payloadlen & GETLOWER4BYTES;
ampembeng 15:6f2798e45099 94 params.MessageParams.pPayload = (char*) message->payload;
ampembeng 15:6f2798e45099 95 params.MessageParams.isDuplicate = message->dup;
ampembeng 15:6f2798e45099 96 params.MessageParams.qos = (QoSLevel)message->qos;
ampembeng 15:6f2798e45099 97 params.MessageParams.isRetained = message->retained;
ampembeng 15:6f2798e45099 98 params.MessageParams.id = message->id;
ampembeng 15:6f2798e45099 99 }
ampembeng 15:6f2798e45099 100
ampembeng 15:6f2798e45099 101 ((iot_message_handler)(md->applicationHandler))(params);
ampembeng 15:6f2798e45099 102 }
ampembeng 15:6f2798e45099 103
ampembeng 15:6f2798e45099 104 void pahoDisconnectHandler(void) {
ampembeng 15:6f2798e45099 105 if(NULL != clientDisconnectHandler) {
ampembeng 15:6f2798e45099 106 clientDisconnectHandler();
ampembeng 15:6f2798e45099 107 }
ampembeng 15:6f2798e45099 108 }
ampembeng 15:6f2798e45099 109
ampembeng 15:6f2798e45099 110 static bool isPowerCycle = true;
ampembeng 15:6f2798e45099 111
ampembeng 15:6f2798e45099 112 IoT_Error_t aws_iot_mqtt_connect(MQTTConnectParams *pParams) {
ampembeng 15:6f2798e45099 113 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 114 MQTTReturnCode pahoRc = SUCCESS;
ampembeng 15:6f2798e45099 115
ampembeng 15:6f2798e45099 116 if(NULL == pParams || NULL == pParams->pClientID || NULL == pParams->pHostURL) {
ampembeng 15:6f2798e45099 117 return NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 118 }
ampembeng 15:6f2798e45099 119
ampembeng 15:6f2798e45099 120 TLSConnectParams TLSParams;
ampembeng 15:6f2798e45099 121 TLSParams.DestinationPort = pParams->port;
ampembeng 15:6f2798e45099 122 TLSParams.pDestinationURL = pParams->pHostURL;
ampembeng 15:6f2798e45099 123 TLSParams.pDeviceCertLocation = pParams->pDeviceCertLocation;
ampembeng 15:6f2798e45099 124 TLSParams.pDevicePrivateKeyLocation = pParams->pDevicePrivateKeyLocation;
ampembeng 15:6f2798e45099 125 TLSParams.pRootCALocation = pParams->pRootCALocation;
ampembeng 15:6f2798e45099 126 TLSParams.timeout_ms = pParams->tlsHandshakeTimeout_ms;
ampembeng 15:6f2798e45099 127 TLSParams.ServerVerificationFlag = pParams->isSSLHostnameVerify;
ampembeng 15:6f2798e45099 128
ampembeng 15:6f2798e45099 129 DEBUG("...subscribe");
ampembeng 15:6f2798e45099 130 // This implementation assumes you are not going to switch between cleansession 1 to 0
ampembeng 15:6f2798e45099 131 // As we don't have a default subscription handler support in the MQTT client every time a device power cycles it has to re-subscribe to let the MQTT client to pass the message up to the application callback.
ampembeng 15:6f2798e45099 132 // The default message handler will be implemented in the future revisions.
ampembeng 15:6f2798e45099 133 if(pParams->isCleansession || isPowerCycle){
ampembeng 15:6f2798e45099 134 pahoRc = MQTTClient(&c, (unsigned int)(pParams->mqttCommandTimeout_ms), writebuf,
ampembeng 15:6f2798e45099 135 AWS_IOT_MQTT_TX_BUF_LEN, readbuf, AWS_IOT_MQTT_RX_BUF_LEN,
ampembeng 15:6f2798e45099 136 pParams->enableAutoReconnect, iot_tls_init, &TLSParams);
ampembeng 15:6f2798e45099 137 if(SUCCESS != pahoRc) {
ampembeng 15:6f2798e45099 138 return CONNECTION_ERROR;
ampembeng 15:6f2798e45099 139 }
ampembeng 15:6f2798e45099 140 isPowerCycle = false;
ampembeng 15:6f2798e45099 141 }
ampembeng 15:6f2798e45099 142
ampembeng 15:6f2798e45099 143 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
ampembeng 15:6f2798e45099 144
ampembeng 15:6f2798e45099 145 DEBUG("...MQTTVersion");
ampembeng 15:6f2798e45099 146 data.willFlag = pParams->isWillMsgPresent;
ampembeng 15:6f2798e45099 147 // compatible type for MQTT_Ver_t
ampembeng 15:6f2798e45099 148 switch (pParams->MQTTVersion) {
ampembeng 15:6f2798e45099 149 case MQTT_3_1:
ampembeng 15:6f2798e45099 150 data.MQTTVersion = (unsigned char) (3);
ampembeng 15:6f2798e45099 151 break;
ampembeng 15:6f2798e45099 152 case MQTT_3_1_1:
ampembeng 15:6f2798e45099 153 data.MQTTVersion = (unsigned char) (4);
ampembeng 15:6f2798e45099 154 break;
ampembeng 15:6f2798e45099 155 default:
ampembeng 15:6f2798e45099 156 data.MQTTVersion = (unsigned char) (4); // default MQTT version = 3.1.1
ampembeng 15:6f2798e45099 157 }
ampembeng 15:6f2798e45099 158
ampembeng 15:6f2798e45099 159 // register our disconnect handler, save customer's handler
ampembeng 15:6f2798e45099 160 setDisconnectHandler(&c, pahoDisconnectHandler);
ampembeng 15:6f2798e45099 161 clientDisconnectHandler = pParams->disconnectHandler;
ampembeng 15:6f2798e45099 162
ampembeng 15:6f2798e45099 163 data.clientID.cstring = pParams->pClientID;
ampembeng 15:6f2798e45099 164 data.username.cstring = pParams->pUserName;
ampembeng 15:6f2798e45099 165 data.password.cstring = pParams->pPassword;
ampembeng 15:6f2798e45099 166 data.will.topicName.cstring = (char*)pParams->will.pTopicName;
ampembeng 15:6f2798e45099 167 data.will.message.cstring = (char*)pParams->will.pMessage;
ampembeng 15:6f2798e45099 168 data.will.qos = (enum QoS)pParams->will.qos;
ampembeng 15:6f2798e45099 169 data.will.retained = pParams->will.isRetained;
ampembeng 15:6f2798e45099 170 data.keepAliveInterval = pParams->KeepAliveInterval_sec;
ampembeng 15:6f2798e45099 171 data.cleansession = pParams->isCleansession;
ampembeng 15:6f2798e45099 172
ampembeng 15:6f2798e45099 173 DEBUG("...MQTTConnect");
ampembeng 15:6f2798e45099 174 pahoRc = MQTTConnect(&c, &data);
ampembeng 15:6f2798e45099 175 if(MQTT_NETWORK_ALREADY_CONNECTED_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 176 rc = NETWORK_ALREADY_CONNECTED;
ampembeng 15:6f2798e45099 177 } else if(SUCCESS != pahoRc) {
ampembeng 15:6f2798e45099 178 rc = CONNECTION_ERROR;
ampembeng 15:6f2798e45099 179 }
ampembeng 15:6f2798e45099 180
ampembeng 15:6f2798e45099 181 return rc;
ampembeng 15:6f2798e45099 182 }
ampembeng 15:6f2798e45099 183
ampembeng 15:6f2798e45099 184 IoT_Error_t aws_iot_mqtt_subscribe(MQTTSubscribeParams *pParams) {
ampembeng 15:6f2798e45099 185 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 186
ampembeng 15:6f2798e45099 187 if (0 != MQTTSubscribe(&c, pParams->pTopic, (enum QoS)pParams->qos, pahoMessageCallback, (void (*)(void))(pParams->mHandler))) {
ampembeng 15:6f2798e45099 188 rc = SUBSCRIBE_ERROR;
ampembeng 15:6f2798e45099 189 }
ampembeng 15:6f2798e45099 190 return rc;
ampembeng 15:6f2798e45099 191 }
ampembeng 15:6f2798e45099 192
ampembeng 15:6f2798e45099 193 IoT_Error_t aws_iot_mqtt_publish(MQTTPublishParams *pParams) {
ampembeng 15:6f2798e45099 194 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 195
ampembeng 15:6f2798e45099 196 MQTTMessage Message;
ampembeng 15:6f2798e45099 197 Message.dup = pParams->MessageParams.isDuplicate;
ampembeng 15:6f2798e45099 198 Message.id = pParams->MessageParams.id;
ampembeng 15:6f2798e45099 199 Message.payload = pParams->MessageParams.pPayload;
ampembeng 15:6f2798e45099 200 Message.payloadlen = pParams->MessageParams.PayloadLen;
ampembeng 15:6f2798e45099 201 Message.qos = (enum QoS)pParams->MessageParams.qos;
ampembeng 15:6f2798e45099 202 Message.retained = pParams->MessageParams.isRetained;
ampembeng 15:6f2798e45099 203
ampembeng 15:6f2798e45099 204 if(0 != MQTTPublish(&c, pParams->pTopic, &Message)){
ampembeng 15:6f2798e45099 205 rc = PUBLISH_ERROR;
ampembeng 15:6f2798e45099 206 }
ampembeng 15:6f2798e45099 207
ampembeng 15:6f2798e45099 208 return rc;
ampembeng 15:6f2798e45099 209 }
ampembeng 15:6f2798e45099 210
ampembeng 15:6f2798e45099 211 IoT_Error_t aws_iot_mqtt_unsubscribe(char *pTopic) {
ampembeng 15:6f2798e45099 212 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 213
ampembeng 15:6f2798e45099 214 if(0 != MQTTUnsubscribe(&c, pTopic)){
ampembeng 15:6f2798e45099 215 rc = UNSUBSCRIBE_ERROR;
ampembeng 15:6f2798e45099 216 }
ampembeng 15:6f2798e45099 217 return rc;
ampembeng 15:6f2798e45099 218 }
ampembeng 15:6f2798e45099 219
ampembeng 15:6f2798e45099 220 IoT_Error_t aws_iot_mqtt_disconnect() {
ampembeng 15:6f2798e45099 221 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 222
ampembeng 15:6f2798e45099 223 if(0 != MQTTDisconnect(&c)){
ampembeng 15:6f2798e45099 224 rc = DISCONNECT_ERROR;
ampembeng 15:6f2798e45099 225 }
ampembeng 15:6f2798e45099 226
ampembeng 15:6f2798e45099 227 return rc;
ampembeng 15:6f2798e45099 228 }
ampembeng 15:6f2798e45099 229
ampembeng 15:6f2798e45099 230 IoT_Error_t aws_iot_mqtt_yield(int timeout) {
ampembeng 15:6f2798e45099 231 MQTTReturnCode pahoRc = MQTTYield(&c, timeout);
ampembeng 15:6f2798e45099 232 IoT_Error_t rc = NONE_ERROR;
ampembeng 15:6f2798e45099 233 if(MQTT_NETWORK_RECONNECTED == pahoRc){
ampembeng 15:6f2798e45099 234 INFO("aws_iot_mqtt_yield() RECONNECT_SUCCESSFUL");
ampembeng 15:6f2798e45099 235 rc = RECONNECT_SUCCESSFUL;
ampembeng 15:6f2798e45099 236 } else if(SUCCESS == pahoRc){
ampembeng 15:6f2798e45099 237 //INFO("aws_iot_mqtt_yield() NONE_ERROR");
ampembeng 15:6f2798e45099 238 rc = NONE_ERROR;
ampembeng 15:6f2798e45099 239 } else if(MQTT_NULL_VALUE_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 240 INFO("aws_iot_mqtt_yield() NULL_VALUE_ERROR");
ampembeng 15:6f2798e45099 241 rc = NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 242 } else if(MQTT_NETWORK_DISCONNECTED_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 243 INFO("aws_iot_mqtt_yield() NETWORK_DISCONNECTED");
ampembeng 15:6f2798e45099 244 rc = NETWORK_DISCONNECTED;
ampembeng 15:6f2798e45099 245 } else if(MQTT_RECONNECT_TIMED_OUT == pahoRc) {
ampembeng 15:6f2798e45099 246 INFO("aws_iot_mqtt_yield() NETWORK_RECONNECT_TIMED_OUT");
ampembeng 15:6f2798e45099 247 rc = NETWORK_RECONNECT_TIMED_OUT;
ampembeng 15:6f2798e45099 248 } else if(MQTT_ATTEMPTING_RECONNECT == pahoRc) {
ampembeng 15:6f2798e45099 249 INFO("aws_iot_mqtt_yield() NETWORK_ATTEMPTING_RECONNECT");
ampembeng 15:6f2798e45099 250 rc = NETWORK_ATTEMPTING_RECONNECT;
ampembeng 15:6f2798e45099 251 } else if(MQTT_BUFFER_RX_MESSAGE_INVALID == pahoRc){
ampembeng 15:6f2798e45099 252 INFO("aws_iot_mqtt_yield() RX_MESSAGE_INVALID");
ampembeng 15:6f2798e45099 253 rc = RX_MESSAGE_INVALID;
ampembeng 15:6f2798e45099 254 } else if(MQTTPACKET_BUFFER_TOO_SHORT == pahoRc){
ampembeng 15:6f2798e45099 255 INFO("aws_iot_mqtt_yield() RX_MESSAGE_BIGGER_THAN_MQTT_RX_BUF");
ampembeng 15:6f2798e45099 256 rc = RX_MESSAGE_BIGGER_THAN_MQTT_RX_BUF;
ampembeng 15:6f2798e45099 257 } else {
ampembeng 15:6f2798e45099 258 INFO("aws_iot_mqtt_yield() YIELD_ERROR");
ampembeng 15:6f2798e45099 259 rc = YIELD_ERROR;
ampembeng 15:6f2798e45099 260 }
ampembeng 15:6f2798e45099 261
ampembeng 15:6f2798e45099 262 return rc;
ampembeng 15:6f2798e45099 263 }
ampembeng 15:6f2798e45099 264
ampembeng 15:6f2798e45099 265 IoT_Error_t aws_iot_mqtt_attempt_reconnect() {
ampembeng 15:6f2798e45099 266 MQTTReturnCode pahoRc = MQTTAttemptReconnect(&c);
ampembeng 15:6f2798e45099 267 IoT_Error_t rc = RECONNECT_SUCCESSFUL;
ampembeng 15:6f2798e45099 268 if(MQTT_NETWORK_RECONNECTED == pahoRc){
ampembeng 15:6f2798e45099 269 rc = RECONNECT_SUCCESSFUL;
ampembeng 15:6f2798e45099 270 } else if(MQTT_NULL_VALUE_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 271 rc = NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 272 } else if(MQTT_NETWORK_DISCONNECTED_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 273 rc = NETWORK_DISCONNECTED;
ampembeng 15:6f2798e45099 274 } else if(MQTT_RECONNECT_TIMED_OUT == pahoRc) {
ampembeng 15:6f2798e45099 275 rc = NETWORK_RECONNECT_TIMED_OUT;
ampembeng 15:6f2798e45099 276 } else if(MQTT_NETWORK_ALREADY_CONNECTED_ERROR == pahoRc) {
ampembeng 15:6f2798e45099 277 rc = NETWORK_ALREADY_CONNECTED;
ampembeng 15:6f2798e45099 278 } else {
ampembeng 15:6f2798e45099 279 rc = GENERIC_ERROR;
ampembeng 15:6f2798e45099 280 }
ampembeng 15:6f2798e45099 281
ampembeng 15:6f2798e45099 282 return rc;
ampembeng 15:6f2798e45099 283 }
ampembeng 15:6f2798e45099 284
ampembeng 15:6f2798e45099 285 IoT_Error_t aws_iot_mqtt_autoreconnect_set_status(bool value) {
ampembeng 15:6f2798e45099 286 MQTTReturnCode rc = setAutoReconnectEnabled(&c, (uint8_t) value);
ampembeng 15:6f2798e45099 287
ampembeng 15:6f2798e45099 288 if(MQTT_NULL_VALUE_ERROR == rc) {
ampembeng 15:6f2798e45099 289 return NULL_VALUE_ERROR;
ampembeng 15:6f2798e45099 290 }
ampembeng 15:6f2798e45099 291
ampembeng 15:6f2798e45099 292 return NONE_ERROR;
ampembeng 15:6f2798e45099 293 }
ampembeng 15:6f2798e45099 294
ampembeng 15:6f2798e45099 295 bool aws_iot_is_mqtt_connected(void) {
ampembeng 15:6f2798e45099 296 return MQTTIsConnected(&c);
ampembeng 15:6f2798e45099 297 }
ampembeng 15:6f2798e45099 298
ampembeng 15:6f2798e45099 299 bool aws_iot_is_autoreconnect_enabled(void) {
ampembeng 15:6f2798e45099 300 return MQTTIsAutoReconnectEnabled(&c);
ampembeng 15:6f2798e45099 301 }
ampembeng 15:6f2798e45099 302
ampembeng 15:6f2798e45099 303 void aws_iot_mqtt_init(MQTTClient_t *pClient){
ampembeng 15:6f2798e45099 304 pClient->connect = aws_iot_mqtt_connect;
ampembeng 15:6f2798e45099 305 pClient->disconnect = aws_iot_mqtt_disconnect;
ampembeng 15:6f2798e45099 306 pClient->isConnected = aws_iot_is_mqtt_connected;
ampembeng 15:6f2798e45099 307 pClient->reconnect = aws_iot_mqtt_attempt_reconnect;
ampembeng 15:6f2798e45099 308 pClient->publish = aws_iot_mqtt_publish;
ampembeng 15:6f2798e45099 309 pClient->subscribe = aws_iot_mqtt_subscribe;
ampembeng 15:6f2798e45099 310 pClient->unsubscribe = aws_iot_mqtt_unsubscribe;
ampembeng 15:6f2798e45099 311 pClient->yield = aws_iot_mqtt_yield;
ampembeng 15:6f2798e45099 312 pClient->isAutoReconnectEnabled = aws_iot_is_autoreconnect_enabled;
ampembeng 15:6f2798e45099 313 pClient->setAutoReconnectStatus = aws_iot_mqtt_autoreconnect_set_status;
ampembeng 15:6f2798e45099 314 }
ampembeng 15:6f2798e45099 315
ampembeng 15:6f2798e45099 316