A small footprint MQTT library
Dependents: STM32F746_iothub_client_sample_mqtt FXOS8700CQ_To_Azure_IoT f767zi_mqtt FXOS8700CQ_To_Azure_IoT ... more
Diff: mqtt_client.c
- 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, ¤t_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 {