A small footprint MQTT library

Dependents:   STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more

Committer:
AzureIoTClient
Date:
Fri Feb 24 14:01:11 2017 -0800
Revision:
15:ec5a36121959
Parent:
13:3c202001e4ba
Child:
18:6d13ad04e8a0
1.1.8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:ef4901974abc 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:ef4901974abc 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:ef4901974abc 3
Azure.IoT Build 0:ef4901974abc 4 #include <stdlib.h>
Azure.IoT Build 0:ef4901974abc 5 #include "azure_umqtt_c/mqtt_message.h"
AzureIoTClient 15:ec5a36121959 6 #include "azure_c_shared_utility/optimize_size.h"
Azure.IoT Build 0:ef4901974abc 7 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:ef4901974abc 8
Azure.IoT Build 0:ef4901974abc 9 typedef struct MQTT_MESSAGE_TAG
Azure.IoT Build 0:ef4901974abc 10 {
Azure.IoT Build 0:ef4901974abc 11 uint16_t packetId;
Azure.IoT Build 0:ef4901974abc 12 char* topicName;
Azure.IoT Build 0:ef4901974abc 13 QOS_VALUE qosInfo;
Azure.IoT Build 0:ef4901974abc 14 APP_PAYLOAD appPayload;
Azure.IoT Build 0:ef4901974abc 15 bool isDuplicateMsg;
Azure.IoT Build 0:ef4901974abc 16 bool isMessageRetained;
Azure.IoT Build 0:ef4901974abc 17 } MQTT_MESSAGE;
Azure.IoT Build 0:ef4901974abc 18
Azure.IoT Build 0:ef4901974abc 19 MQTT_MESSAGE_HANDLE mqttmessage_create(uint16_t packetId, const char* topicName, QOS_VALUE qosValue, const uint8_t* appMsg, size_t appMsgLength)
Azure.IoT Build 0:ef4901974abc 20 {
Azure.IoT Build 0:ef4901974abc 21 /* Codes_SRS_MQTTMESSAGE_07_001:[If the parameters topicName is NULL is zero then mqttmessage_create shall return NULL.] */
Azure.IoT Build 0:ef4901974abc 22 MQTT_MESSAGE* result;
Azure.IoT Build 0:ef4901974abc 23 if (topicName == NULL)
Azure.IoT Build 0:ef4901974abc 24 {
Azure.IoT Build 0:ef4901974abc 25 result = NULL;
Azure.IoT Build 0:ef4901974abc 26 }
Azure.IoT Build 0:ef4901974abc 27 else
Azure.IoT Build 0:ef4901974abc 28 {
Azure.IoT Build 0:ef4901974abc 29 /* Codes_SRS_MQTTMESSAGE_07_002: [mqttmessage_create shall allocate and copy the topicName and appMsg parameters.] */
Azure.IoT Build 0:ef4901974abc 30 result = malloc(sizeof(MQTT_MESSAGE));
Azure.IoT Build 0:ef4901974abc 31 if (result != NULL)
Azure.IoT Build 0:ef4901974abc 32 {
Azure.IoT Build 0:ef4901974abc 33 if (mallocAndStrcpy_s(&result->topicName, topicName) != 0)
Azure.IoT Build 0:ef4901974abc 34 {
Azure.IoT Build 0:ef4901974abc 35 /* Codes_SRS_MQTTMESSAGE_07_003: [If any memory allocation fails mqttmessage_create shall free any allocated memory and return NULL.] */
Azure.IoT Build 0:ef4901974abc 36 free(result);
Azure.IoT Build 0:ef4901974abc 37 result = NULL;
Azure.IoT Build 0:ef4901974abc 38 }
Azure.IoT Build 0:ef4901974abc 39 else
Azure.IoT Build 0:ef4901974abc 40 {
Azure.IoT Build 0:ef4901974abc 41 result->packetId = packetId;
Azure.IoT Build 0:ef4901974abc 42 result->isDuplicateMsg = false;
Azure.IoT Build 0:ef4901974abc 43 result->isMessageRetained = false;
Azure.IoT Build 0:ef4901974abc 44 result->qosInfo = qosValue;
Azure.IoT Build 0:ef4901974abc 45
Azure.IoT Build 0:ef4901974abc 46 /* Codes_SRS_MQTTMESSAGE_07_002: [mqttmessage_create shall allocate and copy the topicName and appMsg parameters.] */
Azure.IoT Build 0:ef4901974abc 47 result->appPayload.length = appMsgLength;
Azure.IoT Build 0:ef4901974abc 48 if (result->appPayload.length > 0)
Azure.IoT Build 0:ef4901974abc 49 {
Azure.IoT Build 0:ef4901974abc 50 result->appPayload.message = malloc(appMsgLength);
Azure.IoT Build 0:ef4901974abc 51 if (result->appPayload.message == NULL)
Azure.IoT Build 0:ef4901974abc 52 {
Azure.IoT Build 0:ef4901974abc 53 /* Codes_SRS_MQTTMESSAGE_07_003: [If any memory allocation fails mqttmessage_create shall free any allocated memory and return NULL.] */
Azure.IoT Build 0:ef4901974abc 54 free(result->topicName);
Azure.IoT Build 0:ef4901974abc 55 free(result);
Azure.IoT Build 0:ef4901974abc 56 result = NULL;
Azure.IoT Build 0:ef4901974abc 57 }
Azure.IoT Build 0:ef4901974abc 58 else
Azure.IoT Build 0:ef4901974abc 59 {
AzureIoTClient 13:3c202001e4ba 60 (void)memcpy(result->appPayload.message, appMsg, appMsgLength);
Azure.IoT Build 0:ef4901974abc 61 }
Azure.IoT Build 0:ef4901974abc 62 }
Azure.IoT Build 0:ef4901974abc 63 else
Azure.IoT Build 0:ef4901974abc 64 {
Azure.IoT Build 0:ef4901974abc 65 result->appPayload.message = NULL;
Azure.IoT Build 0:ef4901974abc 66 }
Azure.IoT Build 0:ef4901974abc 67 }
Azure.IoT Build 0:ef4901974abc 68 }
Azure.IoT Build 0:ef4901974abc 69 }
Azure.IoT Build 0:ef4901974abc 70 /* Codes_SRS_MQTTMESSAGE_07_004: [If mqttmessage_createMessage succeeds the it shall return a NON-NULL MQTT_MESSAGE_HANDLE value.] */
Azure.IoT Build 0:ef4901974abc 71 return result;
Azure.IoT Build 0:ef4901974abc 72 }
Azure.IoT Build 0:ef4901974abc 73
Azure.IoT Build 0:ef4901974abc 74 void mqttmessage_destroy(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 75 {
Azure.IoT Build 0:ef4901974abc 76 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 77 /* Codes_SRS_MQTTMESSAGE_07_005: [If the handle parameter is NULL then mqttmessage_destroyMessage shall do nothing] */
Azure.IoT Build 0:ef4901974abc 78 if (msgInfo != NULL)
Azure.IoT Build 0:ef4901974abc 79 {
Azure.IoT Build 0:ef4901974abc 80 /* Codes_SRS_MQTTMESSAGE_07_006: [mqttmessage_destroyMessage shall free all resources associated with the MQTT_MESSAGE_HANDLE value] */
Azure.IoT Build 0:ef4901974abc 81 free(msgInfo->topicName);
Azure.IoT Build 0:ef4901974abc 82 if (msgInfo->appPayload.message != NULL)
Azure.IoT Build 0:ef4901974abc 83 {
Azure.IoT Build 0:ef4901974abc 84 free(msgInfo->appPayload.message);
Azure.IoT Build 0:ef4901974abc 85 }
Azure.IoT Build 0:ef4901974abc 86 free(msgInfo);
Azure.IoT Build 0:ef4901974abc 87 }
Azure.IoT Build 0:ef4901974abc 88 }
Azure.IoT Build 0:ef4901974abc 89
Azure.IoT Build 0:ef4901974abc 90 MQTT_MESSAGE_HANDLE mqttmessage_clone(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 91 {
Azure.IoT Build 0:ef4901974abc 92 MQTT_MESSAGE_HANDLE result;
Azure.IoT Build 0:ef4901974abc 93 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 94 {
Azure.IoT Build 0:ef4901974abc 95 /* Codes_SRS_MQTTMESSAGE_07_007: [If handle parameter is NULL then mqttmessage_clone shall return NULL.] */
Azure.IoT Build 0:ef4901974abc 96 result = NULL;
Azure.IoT Build 0:ef4901974abc 97 }
Azure.IoT Build 0:ef4901974abc 98 else
Azure.IoT Build 0:ef4901974abc 99 {
Azure.IoT Build 0:ef4901974abc 100 /* Codes_SRS_MQTTMESSAGE_07_008: [mqttmessage_clone shall create a new MQTT_MESSAGE_HANDLE with data content identical of the handle value.] */
Azure.IoT Build 0:ef4901974abc 101 MQTT_MESSAGE* mqtt_message = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 102 result = mqttmessage_create(mqtt_message->packetId, mqtt_message->topicName, mqtt_message->qosInfo, mqtt_message->appPayload.message, mqtt_message->appPayload.length);
Azure.IoT Build 0:ef4901974abc 103 if (result != NULL)
Azure.IoT Build 0:ef4901974abc 104 {
Azure.IoT Build 0:ef4901974abc 105 (void)mqttmessage_setIsDuplicateMsg(result, mqtt_message->isDuplicateMsg);
Azure.IoT Build 0:ef4901974abc 106 (void)mqttmessage_setIsRetained(result, mqtt_message->isMessageRetained);
Azure.IoT Build 0:ef4901974abc 107 }
Azure.IoT Build 0:ef4901974abc 108 }
Azure.IoT Build 0:ef4901974abc 109 return result;
Azure.IoT Build 0:ef4901974abc 110 }
Azure.IoT Build 0:ef4901974abc 111
Azure.IoT Build 0:ef4901974abc 112 uint16_t mqttmessage_getPacketId(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 113 {
Azure.IoT Build 0:ef4901974abc 114 uint16_t result;
Azure.IoT Build 0:ef4901974abc 115 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 116 {
Azure.IoT Build 0:ef4901974abc 117 /* Codes_SRS_MQTTMESSAGE_07_010: [If handle is NULL then mqttmessage_getPacketId shall return 0.] */
Azure.IoT Build 0:ef4901974abc 118 result = 0;
Azure.IoT Build 0:ef4901974abc 119 }
Azure.IoT Build 0:ef4901974abc 120 else
Azure.IoT Build 0:ef4901974abc 121 {
Azure.IoT Build 0:ef4901974abc 122 /* Codes_SRS_MQTTMESSAGE_07_011: [mqttmessage_getPacketId shall return the packetId value contained in MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 123 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 124 result = msgInfo->packetId;
Azure.IoT Build 0:ef4901974abc 125 }
Azure.IoT Build 0:ef4901974abc 126 return result;
Azure.IoT Build 0:ef4901974abc 127 }
Azure.IoT Build 0:ef4901974abc 128
Azure.IoT Build 0:ef4901974abc 129 const char* mqttmessage_getTopicName(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 130 {
Azure.IoT Build 0:ef4901974abc 131 const char* result;
Azure.IoT Build 0:ef4901974abc 132 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 133 {
Azure.IoT Build 0:ef4901974abc 134 /* Codes_SRS_MQTTMESSAGE_07_012: [If handle is NULL then mqttmessage_getTopicName shall return a NULL string.] */
Azure.IoT Build 0:ef4901974abc 135 result = NULL;
Azure.IoT Build 0:ef4901974abc 136 }
Azure.IoT Build 0:ef4901974abc 137 else
Azure.IoT Build 0:ef4901974abc 138 {
Azure.IoT Build 0:ef4901974abc 139 /* Codes_SRS_MQTTMESSAGE_07_013: [mqttmessage_getTopicName shall return the topicName contained in MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 140 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 141 result = msgInfo->topicName;
Azure.IoT Build 0:ef4901974abc 142 }
Azure.IoT Build 0:ef4901974abc 143 return result;
Azure.IoT Build 0:ef4901974abc 144 }
Azure.IoT Build 0:ef4901974abc 145
Azure.IoT Build 0:ef4901974abc 146 QOS_VALUE mqttmessage_getQosType(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 147 {
Azure.IoT Build 0:ef4901974abc 148 QOS_VALUE result;
Azure.IoT Build 0:ef4901974abc 149 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 150 {
Azure.IoT Build 0:ef4901974abc 151 /* Codes_SRS_MQTTMESSAGE_07_014: [If handle is NULL then mqttmessage_getQosType shall return the default DELIVER_AT_MOST_ONCE value.] */
Azure.IoT Build 0:ef4901974abc 152 result = DELIVER_AT_MOST_ONCE;
Azure.IoT Build 0:ef4901974abc 153 }
Azure.IoT Build 0:ef4901974abc 154 else
Azure.IoT Build 0:ef4901974abc 155 {
Azure.IoT Build 0:ef4901974abc 156 /* Codes_SRS_MQTTMESSAGE_07_015: [mqttmessage_getQosType shall return the QOS Type value contained in MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 157 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 158 result = msgInfo->qosInfo;
Azure.IoT Build 0:ef4901974abc 159 }
Azure.IoT Build 0:ef4901974abc 160 return result;
Azure.IoT Build 0:ef4901974abc 161 }
Azure.IoT Build 0:ef4901974abc 162
Azure.IoT Build 0:ef4901974abc 163 bool mqttmessage_getIsDuplicateMsg(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 164 {
Azure.IoT Build 0:ef4901974abc 165 bool result;
Azure.IoT Build 0:ef4901974abc 166 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 167 {
Azure.IoT Build 0:ef4901974abc 168 /* Codes_SRS_MQTTMESSAGE_07_016: [If handle is NULL then mqttmessage_getIsDuplicateMsg shall return false.] */
Azure.IoT Build 0:ef4901974abc 169 result = false;
Azure.IoT Build 0:ef4901974abc 170 }
Azure.IoT Build 0:ef4901974abc 171 else
Azure.IoT Build 0:ef4901974abc 172 {
Azure.IoT Build 0:ef4901974abc 173 /* Codes_SRS_MQTTMESSAGE_07_017: [mqttmessage_getIsDuplicateMsg shall return the isDuplicateMsg value contained in MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 174 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 175 result = msgInfo->isDuplicateMsg;
Azure.IoT Build 0:ef4901974abc 176 }
Azure.IoT Build 0:ef4901974abc 177 return result;
Azure.IoT Build 0:ef4901974abc 178 }
Azure.IoT Build 0:ef4901974abc 179
Azure.IoT Build 0:ef4901974abc 180 bool mqttmessage_getIsRetained(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 181 {
Azure.IoT Build 0:ef4901974abc 182 bool result;
Azure.IoT Build 0:ef4901974abc 183 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 184 {
Azure.IoT Build 0:ef4901974abc 185 /* Codes_SRS_MQTTMESSAGE_07_018: [If handle is NULL then mqttmessage_getIsRetained shall return false.] */
Azure.IoT Build 0:ef4901974abc 186 result = false;
Azure.IoT Build 0:ef4901974abc 187 }
Azure.IoT Build 0:ef4901974abc 188 else
Azure.IoT Build 0:ef4901974abc 189 {
Azure.IoT Build 0:ef4901974abc 190 /* Codes_SRS_MQTTMESSAGE_07_019: [mqttmessage_getIsRetained shall return the isRetained value contained in MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 191 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 192 result = msgInfo->isMessageRetained;
Azure.IoT Build 0:ef4901974abc 193 }
Azure.IoT Build 0:ef4901974abc 194 return result;
Azure.IoT Build 0:ef4901974abc 195 }
Azure.IoT Build 0:ef4901974abc 196
Azure.IoT Build 0:ef4901974abc 197 int mqttmessage_setIsDuplicateMsg(MQTT_MESSAGE_HANDLE handle, bool duplicateMsg)
Azure.IoT Build 0:ef4901974abc 198 {
Azure.IoT Build 0:ef4901974abc 199 int result;
Azure.IoT Build 0:ef4901974abc 200 /* Codes_SRS_MQTTMESSAGE_07_022: [If handle is NULL then mqttmessage_setIsDuplicateMsg shall return a non-zero value.] */
Azure.IoT Build 0:ef4901974abc 201 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 202 {
AzureIoTClient 15:ec5a36121959 203 result = __FAILURE__;
Azure.IoT Build 0:ef4901974abc 204 }
Azure.IoT Build 0:ef4901974abc 205 else
Azure.IoT Build 0:ef4901974abc 206 {
Azure.IoT Build 0:ef4901974abc 207 /* Codes_SRS_MQTTMESSAGE_07_023: [mqttmessage_setIsDuplicateMsg shall store the duplicateMsg value in the MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 208 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 209 msgInfo->isDuplicateMsg = duplicateMsg;
Azure.IoT Build 0:ef4901974abc 210 result = 0;
Azure.IoT Build 0:ef4901974abc 211 }
Azure.IoT Build 0:ef4901974abc 212 return result;
Azure.IoT Build 0:ef4901974abc 213 }
Azure.IoT Build 0:ef4901974abc 214
Azure.IoT Build 0:ef4901974abc 215 int mqttmessage_setIsRetained(MQTT_MESSAGE_HANDLE handle, bool retainMsg)
Azure.IoT Build 0:ef4901974abc 216 {
Azure.IoT Build 0:ef4901974abc 217 int result;
Azure.IoT Build 0:ef4901974abc 218 /* Codes_SRS_MQTTMESSAGE_07_024: [If handle is NULL then mqttmessage_setIsRetained shall return a non-zero value.] */
Azure.IoT Build 0:ef4901974abc 219 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 220 {
AzureIoTClient 15:ec5a36121959 221 result = __FAILURE__;
Azure.IoT Build 0:ef4901974abc 222 }
Azure.IoT Build 0:ef4901974abc 223 else
Azure.IoT Build 0:ef4901974abc 224 {
Azure.IoT Build 0:ef4901974abc 225 /* Codes_SRS_MQTTMESSAGE_07_025: [mqttmessage_setIsRetained shall store the retainMsg value in the MQTT_MESSAGE_HANDLE handle.] */
Azure.IoT Build 0:ef4901974abc 226 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 227 msgInfo->isMessageRetained = retainMsg;
Azure.IoT Build 0:ef4901974abc 228 result = 0;
Azure.IoT Build 0:ef4901974abc 229 }
Azure.IoT Build 0:ef4901974abc 230 return result;
Azure.IoT Build 0:ef4901974abc 231 }
Azure.IoT Build 0:ef4901974abc 232
Azure.IoT Build 0:ef4901974abc 233 const APP_PAYLOAD* mqttmessage_getApplicationMsg(MQTT_MESSAGE_HANDLE handle)
Azure.IoT Build 0:ef4901974abc 234 {
Azure.IoT Build 0:ef4901974abc 235 const APP_PAYLOAD* result;
Azure.IoT Build 0:ef4901974abc 236 if (handle == NULL)
Azure.IoT Build 0:ef4901974abc 237 {
Azure.IoT Build 0:ef4901974abc 238 /* Codes_SRS_MQTTMESSAGE_07_020: [If handle is NULL or if msgLen is 0 then mqttmessage_getApplicationMsg shall return NULL.] */
Azure.IoT Build 0:ef4901974abc 239 result = NULL;
Azure.IoT Build 0:ef4901974abc 240 }
Azure.IoT Build 0:ef4901974abc 241 else
Azure.IoT Build 0:ef4901974abc 242 {
Azure.IoT Build 0:ef4901974abc 243 /* Codes_SRS_MQTTMESSAGE_07_021: [mqttmessage_getApplicationMsg shall return the applicationMsg value contained in MQTT_MESSAGE_HANDLE handle and the length of the appMsg in the msgLen parameter.] */
Azure.IoT Build 0:ef4901974abc 244 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
Azure.IoT Build 0:ef4901974abc 245 result = &msgInfo->appPayload;
Azure.IoT Build 0:ef4901974abc 246 }
Azure.IoT Build 0:ef4901974abc 247 return result;
Azure.IoT Build 0:ef4901974abc 248 }