A small footprint MQTT library

Dependents:   STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more

Revision:
19:e283dcf26037
Parent:
18:6d13ad04e8a0
Child:
23:80794cfb3565
--- a/mqtt_client.c	Fri Aug 11 14:02:56 2017 -0700
+++ b/mqtt_client.c	Mon Sep 11 09:23:23 2017 -0700
@@ -44,6 +44,8 @@
     void* ctx;
     ON_MQTT_ERROR_CALLBACK fnOnErrorCallBack;
     void* errorCBCtx;
+    ON_MQTT_DISCONNECTED_CALLBACK disconnect_cb;
+    void* disconnect_ctx;
     QOS_VALUE qosValue;
     uint16_t keepAliveInterval;
     MQTT_CLIENT_OPTIONS mqttOptions;
@@ -57,24 +59,31 @@
 
 static void on_connection_closed(void* context)
 {
-    size_t* close_complete = (size_t*)context;
-    *close_complete = 1;
+    MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)context;
+    if (mqtt_client != NULL)
+    {
+        mqtt_client->socketConnected = false;
+        mqtt_client->clientConnected = false;
+        if (mqtt_client->disconnect_cb)
+        {
+            mqtt_client->disconnect_cb(mqtt_client->disconnect_ctx);
+        }
+    }
 }
 
 static void close_connection(MQTT_CLIENT* mqtt_client)
 {
-    size_t close_complete = 0;
-    (void)xio_close(mqtt_client->xioHandle, on_connection_closed, &close_complete);
-
-    size_t counter = 0;
-    do
+    (void)xio_close(mqtt_client->xioHandle, on_connection_closed, mqtt_client);
+    if (mqtt_client->disconnect_cb == NULL)
     {
-        xio_dowork(mqtt_client->xioHandle);
-        counter++;
-        ThreadAPI_Sleep(10);
-    } while (close_complete == 0 && counter < MAX_CLOSE_RETRIES);
-    mqtt_client->socketConnected = false;
-    mqtt_client->clientConnected = false;
+        size_t counter = 0;
+        do
+        {
+            xio_dowork(mqtt_client->xioHandle);
+            counter++;
+            ThreadAPI_Sleep(2);
+        } while (mqtt_client->clientConnected && counter < MAX_CLOSE_RETRIES);
+    }
 }
 
 static void set_error_callback(MQTT_CLIENT* mqtt_client, MQTT_CLIENT_EVENT_ERROR error_type)
@@ -876,28 +885,16 @@
         }
         else
         {
+            memset(result, 0, sizeof(MQTT_CLIENT));
             /*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->packetSendTimeMs = 0;
             result->fnOperationCallback = opCallback;
             result->ctx = opCallbackCtx;
             result->fnMessageRecv = msgRecv;
             result->fnOnErrorCallBack = onErrorCallBack;
             result->errorCBCtx = errorCBCtx;
             result->qosValue = DELIVER_AT_MOST_ONCE;
-            result->keepAliveInterval = 0;
             result->packetTickCntr = tickcounter_create();
-            result->mqttOptions.clientId = NULL;
-            result->mqttOptions.willTopic = NULL;
-            result->mqttOptions.willMessage = NULL;
-            result->mqttOptions.username = NULL;
-            result->mqttOptions.password = NULL;
-            result->socketConnected = false;
-            result->clientConnected = false;
-            result->logTrace = false;
-            result->rawBytesTrace = false;
-            result->timeSincePing = 0;
             result->maxPingRespTime = DEFAULT_MAX_PING_RESPONSE_TIME;
             if (result->packetTickCntr == NULL)
             {
@@ -1145,7 +1142,7 @@
     return result;
 }
 
-int mqtt_client_disconnect(MQTT_CLIENT_HANDLE handle)
+int mqtt_client_disconnect(MQTT_CLIENT_HANDLE handle, ON_MQTT_DISCONNECTED_CALLBACK callback, void* ctx)
 {
     int result;
     MQTT_CLIENT* mqtt_client = (MQTT_CLIENT*)handle;
@@ -1166,6 +1163,9 @@
         }
         else
         {
+            /* Codes_SRS_MQTT_CLIENT_07_037: [ if callback is not NULL callback shall be called once the mqtt connection has been disconnected ] */
+            mqtt_client->disconnect_cb = callback;
+            mqtt_client->disconnect_ctx = ctx;
             mqtt_client->packetState = DISCONNECT_TYPE;
 
             size_t size = BUFFER_length(disconnectPacket);