Demo application for using the AT&T IoT Starter Kit Powered by AWS.
Dependencies: SDFileSystem
Fork of ATT_AWS_IoT_demo by
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.
AWS_openssl/aws_iot_src/protocol/mqtt/aws_iot_embedded_client_wrapper/aws_iot_mqtt_embedded_client_wrapper.cpp@27:2f486c766854, 2017-02-07 (annotated)
- 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?
User | Revision | Line number | New 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 |