A small footprint MQTT library

Dependents:   STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more

Revision:
4:e7167dabd6e4
Parent:
3:9b4e7158ca0d
Child:
5:34779607059c
--- a/mqtt_client.c	Fri Jun 17 17:03:06 2016 -0700
+++ b/mqtt_client.c	Fri Jul 01 10:42:59 2016 -0700
@@ -6,6 +6,7 @@
 #include "azure_c_shared_utility/platform.h"
 #include "azure_c_shared_utility/tickcounter.h"
 #include "azure_c_shared_utility/crt_abstractions.h"
+#include "azure_c_shared_utility/xlogging.h"
 
 #include "azure_umqtt_c/mqtt_client.h"
 #include "azure_umqtt_c/mqtt_codec.h"
@@ -28,7 +29,6 @@
     XIO_HANDLE xioHandle;
     MQTTCODEC_HANDLE codec_handle;
     CONTROL_PACKET_TYPE packetState;
-    LOGGER_LOG logFunc;
     TICK_COUNTER_HANDLE packetTickCntr;
     uint64_t packetSendTimeMs;
     ON_MQTT_OPERATION_CALLBACK fnOperationCallback;
@@ -154,12 +154,13 @@
         char tmBuffer[TIME_MAX_BUFFER];
         getLogTime(tmBuffer, TIME_MAX_BUFFER);
 
-        LOG(clientData->logFunc, 0, "-> %s %s: ", tmBuffer, retrievePacketType((unsigned char)data[0]));
+        LOG(LOG_TRACE, 0, "-> %s %s: ", tmBuffer, retrievePacketType((unsigned char)data[0]));
         for (size_t index = 0; index < length; index++)
         {
-            LOG(clientData->logFunc, 0, (char*)FORMAT_HEX_CHAR, data[index]);
+            LOG(LOG_TRACE, 0, (char*)FORMAT_HEX_CHAR, data[index]);
         }
-        LOG(clientData->logFunc, LOG_LINE, "");
+
+        LOG(LOG_TRACE, LOG_LINE, "");
     }
 }
 
@@ -172,41 +173,45 @@
             char tmBuffer[TIME_MAX_BUFFER];
             getLogTime(tmBuffer, TIME_MAX_BUFFER);
 
-            LOG(clientData->logFunc, 0, "<- %s %s: 0x%02x 0x%02x ", tmBuffer, retrievePacketType((unsigned char)packet), (unsigned char)(packet | flags), length);
+            LOG(LOG_TRACE, 0, "<- %s %s: 0x%02x 0x%02x ", tmBuffer, retrievePacketType((CONTROL_PACKET_TYPE)packet), (unsigned char)(packet | flags), length);
             for (size_t index = 0; index < length; index++)
             {
-                LOG(clientData->logFunc, 0, (char*)FORMAT_HEX_CHAR, data[index]);
+                LOG(LOG_TRACE, 0, (char*)FORMAT_HEX_CHAR, data[index]);
             }
-            LOG(clientData->logFunc, LOG_LINE, "");
+
+            LOG(LOG_TRACE, LOG_LINE, "");
         }
         else if (packet == PINGRESP_TYPE)
         {
             char tmBuffer[TIME_MAX_BUFFER];
             getLogTime(tmBuffer, TIME_MAX_BUFFER);
 
-            LOG(clientData->logFunc, LOG_LINE, "<- %s %s: 0x%02x 0x%02x ", tmBuffer, retrievePacketType((unsigned char)packet), (unsigned char)(packet | flags), length);
+            LOG(LOG_TRACE, LOG_LINE, "<- %s %s: 0x%02x 0x%02x ", tmBuffer, retrievePacketType((CONTROL_PACKET_TYPE)packet), (unsigned char)(packet | flags), length);
         }
     }
 }
 
-static int sendPacketItem(MQTT_CLIENT* clientData, const int8_t* data, size_t length)
+static int sendPacketItem(MQTT_CLIENT* clientData, const unsigned char* data, size_t length)
 {
     int result;
-    logOutgoingingMsgTrace(clientData, data, length);
 
     if (tickcounter_get_current_ms(clientData->packetTickCntr, &clientData->packetSendTimeMs) != 0)
     {
-        LOG(clientData->logFunc, LOG_LINE, "Failure getting current ms tickcounter");
+        LOG(LOG_ERROR, LOG_LINE, "Failure getting current ms tickcounter");
         result = __LINE__;
     }
     else
     {
-        result = xio_send(clientData->xioHandle, data, length, sendComplete, clientData);
+        result = xio_send(clientData->xioHandle, (const void*)data, length, sendComplete, clientData);
         if (result != 0)
         {
-            LOG(clientData->logFunc, LOG_LINE, "%d: Failure sending control packet data", result);
+            LOG(LOG_ERROR, LOG_LINE, "%d: Failure sending control packet data", result);
             result = __LINE__;
         }
+        else
+        {
+            logOutgoingingMsgTrace(clientData, (const uint8_t*)data, length);
+        }
     }
     return result;
 }
@@ -225,7 +230,7 @@
             if (connPacket == NULL)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_007: [If any failure is encountered then mqtt_client_connect shall return a non-zero value.]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_codec_connect failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_codec_connect failed");
             }
             else
             {
@@ -233,7 +238,7 @@
                 if (sendPacketItem(mqttData, BUFFER_u_char(connPacket), BUFFER_length(connPacket)) != 0)
                 {
                     /*Codes_SRS_MQTT_CLIENT_07_007: [If any failure is encountered then mqtt_client_connect shall return a non-zero value.]*/
-                    LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_codec_connect failed");
+                    LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_codec_connect failed");
                 }
                 BUFFER_delete(connPacket);
             }
@@ -380,7 +385,7 @@
                         MQTT_MESSAGE_HANDLE msgHandle = mqttmessage_create(packetId, topicName, qosValue, iterator, length);
                         if (msgHandle == NULL)
                         {
-                            LOG(mqttData->logFunc, LOG_LINE, "failure in mqttmessage_create");
+                            LOG(LOG_ERROR, LOG_LINE, "failure in mqttmessage_create");
                         }
                         else
                         {
@@ -491,7 +496,7 @@
     }
 }
 
-MQTT_CLIENT_HANDLE mqtt_client_init(ON_MQTT_MESSAGE_RECV_CALLBACK msgRecv, ON_MQTT_OPERATION_CALLBACK opCallback, void* callbackCtx, LOGGER_LOG logger)
+MQTT_CLIENT_HANDLE mqtt_client_init(ON_MQTT_MESSAGE_RECV_CALLBACK msgRecv, ON_MQTT_OPERATION_CALLBACK opCallback, void* callbackCtx)
 {
     MQTT_CLIENT* result;
     /*Codes_SRS_MQTT_CLIENT_07_001: [If the parameters ON_MQTT_MESSAGE_RECV_CALLBACK is NULL then mqttclient_init shall return NULL.]*/
@@ -505,14 +510,13 @@
         if (result == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_002: [If any failure is encountered then mqttclient_init shall return NULL.]*/
-            LOG(logger, LOG_LINE, "mqtt_client_inti failure: Allocation Failure");
+            LOG(LOG_ERROR, LOG_LINE, "mqtt_client_init failure: Allocation Failure");
         }
         else
         {
             /*Codes_SRS_MQTT_CLIENT_07_003: [mqttclient_init shall allocate MQTTCLIENT_DATA_INSTANCE and return the MQTTCLIENT_HANDLE on success.]*/
             result->xioHandle = NULL;
             result->packetState = UNKNOWN_TYPE;
-            result->logFunc = logger;
             result->packetSendTimeMs = 0;
             result->fnOperationCallback = opCallback;
             result->fnMessageRecv = msgRecv;
@@ -534,7 +538,7 @@
             if (result->packetTickCntr == NULL)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_002: [If any failure is encountered then mqttclient_init shall return NULL.]*/
-                LOG(logger, LOG_LINE, "mqtt_client_init failure: tickcounter_create failure");
+                LOG(LOG_ERROR, LOG_LINE, "mqtt_client_init failure: tickcounter_create failure");
                 free(result);
                 result = NULL;
             }
@@ -544,7 +548,7 @@
                 if (result->codec_handle == NULL)
                 {
                     /*Codes_SRS_MQTT_CLIENT_07_002: [If any failure is encountered then mqttclient_init shall return NULL.]*/
-                    LOG(logger, LOG_LINE, "mqtt_client_init failure: mqtt_codec_create failure");
+                    LOG(LOG_ERROR, LOG_LINE, "mqtt_client_init failure: mqtt_codec_create failure");
                     tickcounter_destroy(result->packetTickCntr);
                     free(result);
                     result = NULL;
@@ -587,7 +591,7 @@
         if (xioHandle == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_007: [If any failure is encountered then mqtt_client_connect shall return a non-zero value.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "Error: mqttcodec_connect failed");
+            LOG(LOG_ERROR, LOG_LINE, "Error: mqttcodec_connect failed");
             result = __LINE__;
         }
         else
@@ -599,14 +603,14 @@
             mqttData->maxPingRespTime = (DEFAULT_MAX_PING_RESPONSE_TIME < mqttOptions->keepAliveInterval/2) ? DEFAULT_MAX_PING_RESPONSE_TIME : mqttOptions->keepAliveInterval/2;
             if (cloneMqttOptions(mqttData, mqttOptions) != 0)
             {
-                LOG(mqttData->logFunc, LOG_LINE, "Error: Clone Mqtt Options failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: Clone Mqtt Options failed");
                 result = __LINE__;
             }
             /*Codes_SRS_MQTT_CLIENT_07_008: [mqtt_client_connect shall open the XIO_HANDLE by calling into the xio_open interface.]*/
             else if (xio_open(xioHandle, onOpenComplete, mqttData, onBytesReceived, mqttData, onIoError, mqttData) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_007: [If any failure is encountered then mqtt_client_connect shall return a non-zero value.]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: io_open failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: io_open failed");
                 result = __LINE__;
             }
             else
@@ -634,7 +638,7 @@
         if (payload == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "Error: mqttmessage_getApplicationMsg failed");
+            LOG(LOG_ERROR, LOG_LINE, "Error: mqttmessage_getApplicationMsg failed");
             result = __LINE__;
         }
         else
@@ -644,7 +648,7 @@
             if (publishPacket == NULL)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_codec_publish failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_codec_publish failed");
                 result = __LINE__;
             }
             else
@@ -655,7 +659,7 @@
                 if (sendPacketItem(mqttData, BUFFER_u_char(publishPacket), BUFFER_length(publishPacket)) != 0)
                 {
                     /*Codes_SRS_MQTT_CLIENT_07_020: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
-                    LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_client_publish send failed");
+                    LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_client_publish send failed");
                     result = __LINE__;
                 }
                 else
@@ -684,7 +688,7 @@
         if (subPacket == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_014: [If any failure is encountered then mqtt_client_subscribe shall return a non-zero value.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_codec_subscribe failed");
+            LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_codec_subscribe failed");
             result = __LINE__;
         }
         else
@@ -695,7 +699,7 @@
             if (sendPacketItem(mqttData, BUFFER_u_char(subPacket), BUFFER_length(subPacket)) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_014: [If any failure is encountered then mqtt_client_subscribe shall return a non-zero value.]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_client_subscribe send failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_client_subscribe send failed");
                 result = __LINE__;
             }
             else
@@ -723,7 +727,7 @@
         if (unsubPacket == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_017: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_codec_unsubscribe failed");
+            LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_codec_unsubscribe failed");
             result = __LINE__;
         }
         else
@@ -731,11 +735,10 @@
             mqttData->packetState = UNSUBSCRIBE_TYPE;
 
             /*Codes_SRS_MQTT_CLIENT_07_018: [On success mqtt_client_unsubscribe shall send the MQTT SUBCRIBE packet to the endpoint.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "MQTT unsubscribe");
             if (sendPacketItem(mqttData, BUFFER_u_char(unsubPacket), BUFFER_length(unsubPacket)) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_017: [If any failure is encountered then mqtt_client_unsubscribe shall return a non-zero value.].]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_client_unsubscribe send failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_client_unsubscribe send failed");
                 result = __LINE__;
             }
             else
@@ -759,12 +762,12 @@
     }
     else
     {
-        mqttData->packetState = DISCONNECT_TYPE;
         BUFFER_HANDLE disconnectPacket = mqtt_codec_disconnect();
         if (disconnectPacket == NULL)
         {
             /*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/
-            LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_client_disconnect failed");
+            LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect failed");
+            mqttData->packetState = PACKET_TYPE_ERROR;
             result = __LINE__;
         }
         else
@@ -775,7 +778,7 @@
             if (sendPacketItem(mqttData, BUFFER_u_char(disconnectPacket), BUFFER_length(disconnectPacket)) != 0)
             {
                 /*Codes_SRS_MQTT_CLIENT_07_011: [If any failure is encountered then mqtt_client_disconnect shall return a non-zero value.]*/
-                LOG(mqttData->logFunc, LOG_LINE, "Error: mqtt_client_disconnect send failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: mqtt_client_disconnect send failed");
                 result = __LINE__;
             }
             else
@@ -803,7 +806,7 @@
             uint64_t current_ms;
             if (tickcounter_get_current_ms(mqttData->packetTickCntr, &current_ms) != 0)
             {
-                LOG(mqttData->logFunc, LOG_LINE, "Error: tickcounter_get_current_ms failed");
+                LOG(LOG_ERROR, LOG_LINE, "Error: tickcounter_get_current_ms failed");
             }
             else
             {