mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-08-30 06:58:33 -04:00
Add the Labs projects provided in the V10.2.1_191129 zip file.
This commit is contained in:
parent
46e5937529
commit
e5708b38e9
801 changed files with 356576 additions and 0 deletions
|
@ -0,0 +1,859 @@
|
|||
/*
|
||||
* IoT MQTT V2.1.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file iot_mqtt.h
|
||||
* @brief User-facing functions of the MQTT 3.1.1 library.
|
||||
*/
|
||||
|
||||
#ifndef IOT_MQTT_H_
|
||||
#define IOT_MQTT_H_
|
||||
|
||||
/* The config header is always included first. */
|
||||
#include "iot_config.h"
|
||||
|
||||
/* MQTT types include. */
|
||||
#include "types/iot_mqtt_types.h"
|
||||
|
||||
/*------------------------- MQTT library functions --------------------------*/
|
||||
|
||||
/**
|
||||
* @functionspage{mqtt,MQTT library}
|
||||
* - @functionname{mqtt_function_init}
|
||||
* - @functionname{mqtt_function_cleanup}
|
||||
* - @functionname{mqtt_function_receivecallback}
|
||||
* - @functionname{mqtt_function_connect}
|
||||
* - @functionname{mqtt_function_disconnect}
|
||||
* - @functionname{mqtt_function_subscribeasync}
|
||||
* - @functionname{mqtt_function_subscribesync}
|
||||
* - @functionname{mqtt_function_unsubscribeasync}
|
||||
* - @functionname{mqtt_function_unsubscribesync}
|
||||
* - @functionname{mqtt_function_publishasync}
|
||||
* - @functionname{mqtt_function_publishsync}
|
||||
* - @functionname{mqtt_function_wait}
|
||||
* - @functionname{mqtt_function_strerror}
|
||||
* - @functionname{mqtt_function_operationtype}
|
||||
* - @functionname{mqtt_function_issubscribed}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @functionpage{IotMqtt_Init,mqtt,init}
|
||||
* @functionpage{IotMqtt_Cleanup,mqtt,cleanup}
|
||||
* @functionpage{IotMqtt_ReceiveCallback,mqtt,receivecallback}
|
||||
* @functionpage{IotMqtt_Connect,mqtt,connect}
|
||||
* @functionpage{IotMqtt_Disconnect,mqtt,disconnect}
|
||||
* @functionpage{IotMqtt_SubscribeAsync,mqtt,subscribeasync}
|
||||
* @functionpage{IotMqtt_SubscribeSync,mqtt,subscribesync}
|
||||
* @functionpage{IotMqtt_UnsubscribeAsync,mqtt,unsubscribeasync}
|
||||
* @functionpage{IotMqtt_UnsubscribeSync,mqtt,unsubscribesync}
|
||||
* @functionpage{IotMqtt_PublishAsync,mqtt,publishasync}
|
||||
* @functionpage{IotMqtt_PublishSync,mqtt,publishsync}
|
||||
* @functionpage{IotMqtt_Wait,mqtt,wait}
|
||||
* @functionpage{IotMqtt_strerror,mqtt,strerror}
|
||||
* @functionpage{IotMqtt_OperationType,mqtt,operationtype}
|
||||
* @functionpage{IotMqtt_IsSubscribed,mqtt,issubscribed}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief One-time initialization function for the MQTT library.
|
||||
*
|
||||
* This function performs setup of the MQTT library. <b>It must be called
|
||||
* once (and only once) before calling any other MQTT function.</b> Calling this
|
||||
* function more than once without first calling @ref mqtt_function_cleanup
|
||||
* may result in a crash.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
*
|
||||
* @warning No thread-safety guarantees are provided for this function.
|
||||
*
|
||||
* @see @ref mqtt_function_cleanup
|
||||
*/
|
||||
/* @[declare_mqtt_init] */
|
||||
IotMqttError_t IotMqtt_Init( void );
|
||||
/* @[declare_mqtt_init] */
|
||||
|
||||
/**
|
||||
* @brief One-time deinitialization function for the MQTT library.
|
||||
*
|
||||
* This function frees resources taken in @ref mqtt_function_init. It should be
|
||||
* called after [closing all MQTT connections](@ref mqtt_function_disconnect) to
|
||||
* clean up the MQTT library. After this function returns, @ref mqtt_function_init
|
||||
* must be called again before calling any other MQTT function.
|
||||
*
|
||||
* @warning No thread-safety guarantees are provided for this function. Do not
|
||||
* call this function if any MQTT connections are open!
|
||||
*
|
||||
* @see @ref mqtt_function_init
|
||||
*/
|
||||
/* @[declare_mqtt_cleanup] */
|
||||
void IotMqtt_Cleanup( void );
|
||||
/* @[declare_mqtt_cleanup] */
|
||||
|
||||
/**
|
||||
* @brief Network receive callback for the MQTT library.
|
||||
*
|
||||
* This function should be called by the system whenever data is available for
|
||||
* the MQTT library.
|
||||
*
|
||||
* @param[in] pNetworkConnection The network connection associated with the MQTT
|
||||
* connection, passed by the network stack.
|
||||
* @param[in] pReceiveContext A pointer to the MQTT connection handle for which
|
||||
* the packet was received.
|
||||
*/
|
||||
/* @[declare_mqtt_receivecallback] */
|
||||
void IotMqtt_ReceiveCallback( IotNetworkConnection_t pNetworkConnection,
|
||||
void * pReceiveContext );
|
||||
/* @[declare_mqtt_receivecallback] */
|
||||
|
||||
/**
|
||||
* @brief Establish a new MQTT connection.
|
||||
*
|
||||
* This function opens a connection between a new MQTT client and an MQTT server
|
||||
* (also called a <i>broker</i>). MQTT connections are established on top of transport
|
||||
* layer protocols (such as TCP/IP), and optionally, application layer security
|
||||
* protocols (such as TLS). The MQTT packet that establishes a connection is called
|
||||
* the MQTT CONNECT packet. After @ref mqtt_function_init, this function must be
|
||||
* called before any other MQTT library function.
|
||||
*
|
||||
* If [pConnectInfo->cleanSession](@ref IotMqttConnectInfo_t.cleanSession) is `true`,
|
||||
* this function establishes a clean MQTT session. Subscriptions and unacknowledged
|
||||
* PUBLISH messages will be discarded when the connection is closed.
|
||||
*
|
||||
* If [pConnectInfo->cleanSession](@ref IotMqttConnectInfo_t.cleanSession) is `false`,
|
||||
* this function establishes (or re-establishes) a persistent MQTT session. The parameters
|
||||
* [pConnectInfo->pPreviousSubscriptions](@ref IotMqttConnectInfo_t.pPreviousSubscriptions)
|
||||
* and [pConnectInfo->previousSubscriptionCount](@ref IotMqttConnectInfo_t.previousSubscriptionCount)
|
||||
* may be used to restore subscriptions present in a re-established persistent session.
|
||||
* Any restored subscriptions <b>MUST</b> have been present in the persistent session;
|
||||
* <b>this function does not send an MQTT SUBSCRIBE packet!</b>
|
||||
*
|
||||
* [pConnectInfo->pPreviousSubscriptions](@ref IotMqttConnectInfo_t.pPreviousSubscriptions)
|
||||
* and [pConnectInfo->previousSubscriptionCount](@ref IotMqttConnectInfo_t.previousSubscriptionCount) can
|
||||
* also be used to pass a list of subscriptions to be stored locally without a SUBSCRIBE packet being
|
||||
* sent to the broker. These subscriptions are useful to invoke application level callbacks for messages received
|
||||
* on unsolicited topics from the broker.
|
||||
*
|
||||
* This MQTT library is network agnostic, meaning it has no knowledge of the
|
||||
* underlying network protocol carrying the MQTT packets. It interacts with the
|
||||
* network through a network abstraction layer, allowing it to be used with many
|
||||
* different network stacks. The network abstraction layer is established
|
||||
* per-connection, allowing every #IotMqttConnection_t to use a different network
|
||||
* stack. The parameter `pNetworkInterface` sets up the network abstraction layer
|
||||
* for an MQTT connection; see the documentation on #IotMqttNetworkInfo_t for details
|
||||
* on its members.
|
||||
*
|
||||
* The `pConnectInfo` parameter provides the contents of the MQTT CONNECT packet.
|
||||
* Most members [are defined by the MQTT spec.](@ref IotMqttConnectInfo_t). The
|
||||
* [pConnectInfo->pWillInfo](@ref IotMqttConnectInfo_t.pWillInfo) member provides
|
||||
* information on a Last Will and Testament (LWT) message to be published if the
|
||||
* MQTT connection is closed without [sending a DISCONNECT packet]
|
||||
* (@ref mqtt_function_disconnect). Unlike other PUBLISH
|
||||
* messages, a LWT message payload is limited to 65535 bytes in length. Additionally,
|
||||
* the retry [interval](@ref IotMqttPublishInfo_t.retryMs) and [limit]
|
||||
* (@ref IotMqttPublishInfo_t.retryLimit) members of #IotMqttPublishInfo_t
|
||||
* are ignored for LWT messages. The LWT message is optional; `pWillInfo` may be NULL.
|
||||
*
|
||||
* Unlike @ref mqtt_function_publishasync, @ref mqtt_function_subscribeasync, and
|
||||
* @ref mqtt_function_unsubscribeasync, this function is always blocking. Additionally,
|
||||
* because the MQTT connection acknowledgement packet (CONNACK packet) does not
|
||||
* contain any information on <i>which</i> CONNECT packet it acknowledges, only one
|
||||
* CONNECT operation may be in progress at any time. This means that parallel
|
||||
* threads making calls to @ref mqtt_function_connect will be serialized to send
|
||||
* their CONNECT packets one-by-one.
|
||||
*
|
||||
* @param[in] pNetworkInfo Information on the transport-layer network connection
|
||||
* to use with the MQTT connection.
|
||||
* @param[in] pConnectInfo MQTT connection setup parameters.
|
||||
* @param[in] timeoutMs If the MQTT server does not accept the connection within
|
||||
* this timeout in milliseconds, this function returns #IOT_MQTT_TIMEOUT.
|
||||
* @param[out] pMqttConnection Set to a newly-initialized MQTT connection handle
|
||||
* if this function succeeds.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_TIMEOUT
|
||||
* - #IOT_MQTT_SERVER_REFUSED
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
*
|
||||
* // Callback function to receive messages from the broker on an unsolicited topic.
|
||||
* void unsolicitedMessageCallback( void * pArgument, IotMqttCallbackParam_t * pPublish );
|
||||
*
|
||||
* // Parameters to MQTT connect.
|
||||
* IotMqttConnection_t mqttConnection = IOT_MQTT_CONNECTION_INITIALIZER;
|
||||
* IotMqttNetworkInfo_t networkInfo = IOT_MQTT_NETWORK_INFO_INITIALIZER;
|
||||
* IotMqttConnectInfo_t connectInfo = IOT_MQTT_CONNECT_INFO_INITIALIZER;
|
||||
* IotMqttPublishInfo_t willInfo = IOT_MQTT_PUBLISH_INFO_INITIALIZER;
|
||||
*
|
||||
* // A local subscription to receive messages from the broker on an unsolicited topic.
|
||||
* IotMqttSubscription_t subscription = IOT_MQTT_SUBSCRIPTION_INITIALIZER;
|
||||
*
|
||||
* // Example network abstraction types.
|
||||
* IotNetworkServerInfo_t serverInfo = { ... };
|
||||
* IotNetworkCredentials_t credentialInfo = { ... };
|
||||
* IotNetworkInterface_t networkInterface = { ... };
|
||||
*
|
||||
* // Example using a generic network implementation.
|
||||
* networkInfo.createNetworkConnection = true;
|
||||
* networkInfo.u.setup.pNetworkServerInfo = &serverInfo;
|
||||
* networkInfo.u.setup.pNetworkCredentialInfo = &credentialInfo;
|
||||
* networkInfo.pNetworkInterface = &networkInterface;
|
||||
*
|
||||
* // Set the members of the connection info (password and username not used).
|
||||
* connectInfo.cleanSession = true;
|
||||
* connectInfo.keepAliveSeconds = 30;
|
||||
* connectInfo.pClientIdentifier = "uniqueclientidentifier";
|
||||
* connectInfo.clientIdentifierLength = 22;
|
||||
*
|
||||
* // Set the members of the will info (retain and retry not used).
|
||||
* willInfo.qos = IOT_MQTT_QOS_1;
|
||||
* willInfo.pTopicName = "will/topic/name";
|
||||
* willInfo.topicNameLength = ( uint16_t ) strlen( willInfo.pTopicName );
|
||||
* willInfo.pPayload = "MQTT client unexpectedly disconnected.";
|
||||
* willInfo.payloadLength = strlen( willInfo.pPayload );
|
||||
*
|
||||
* // Set the pointer to the will info.
|
||||
* connectInfo.pWillInfo = &willInfo;
|
||||
*
|
||||
* // [Optional] Set a local subscription to receive the broker messages on an unsolicited topic.
|
||||
* subscription.qos = IOT_MQTT_QOS_0;
|
||||
* subscription.pTopicFilter = "some/unsolicited/topic";
|
||||
* subscription.topicLength = ( uint16_t ) strlen( subscription.pTopicFilter );
|
||||
* subscription.callback.function = unsolicitedMessageCallback;
|
||||
* connectInfo.pPreviousSubscriptions = &subscription;
|
||||
* connectInfo.previousSubscriptionCount = 1;
|
||||
*
|
||||
*
|
||||
* // Call CONNECT with a 5 second block time. Should return
|
||||
* // IOT_MQTT_SUCCESS when successful.
|
||||
* IotMqttError_t result = IotMqtt_Connect( &networkInfo,
|
||||
* &connectInfo,
|
||||
* 5000,
|
||||
* &mqttConnection );
|
||||
*
|
||||
* if( result == IOT_MQTT_SUCCESS )
|
||||
* {
|
||||
* // Do something with the MQTT connection...
|
||||
*
|
||||
* // Clean up and close the MQTT connection once it's no longer needed.
|
||||
* IotMqtt_Disconnect( mqttConnection, 0 );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_connect] */
|
||||
IotMqttError_t IotMqtt_Connect( const IotMqttNetworkInfo_t * pNetworkInfo,
|
||||
const IotMqttConnectInfo_t * pConnectInfo,
|
||||
uint32_t timeoutMs,
|
||||
IotMqttConnection_t * const pMqttConnection );
|
||||
/* @[declare_mqtt_connect] */
|
||||
|
||||
/**
|
||||
* @brief Closes an MQTT connection and frees resources.
|
||||
*
|
||||
* This function closes an MQTT connection and should only be called once
|
||||
* the MQTT connection is no longer needed. Its exact behavior depends on the
|
||||
* `flags` parameter.
|
||||
*
|
||||
* Normally, `flags` should be `0`. This gracefully shuts down an MQTT
|
||||
* connection by sending an MQTT DISCONNECT packet. Any [network close function]
|
||||
* (@ref IotNetworkInterface_t::close) provided [when the connection was established]
|
||||
* (@ref mqtt_function_connect) will also be called. Note that because the MQTT server
|
||||
* will not acknowledge a DISCONNECT packet, the client has no way of knowing if
|
||||
* the server received the DISCONNECT packet. In the case where the DISCONNECT
|
||||
* packet is lost in transport, any Last Will and Testament (LWT) message established
|
||||
* with the connection may be published. However, if the DISCONNECT reaches the
|
||||
* MQTT server, the LWT message will be discarded and not published.
|
||||
*
|
||||
* Should the underlying network connection become unusable, this function should
|
||||
* be called with `flags` set to #IOT_MQTT_FLAG_CLEANUP_ONLY. In this case, no
|
||||
* DISCONNECT packet will be sent, though the [network close function](@ref IotNetworkInterface_t::close)
|
||||
* will still be called. This function will only free the resources used by the MQTT
|
||||
* connection; it still must be called even if the network is offline to avoid leaking
|
||||
* resources.
|
||||
*
|
||||
* @ref mqtt_function_disconnect modifies `mqttConnection`, so it shouldn't
|
||||
* be used after calling this function.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to close and clean up.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
*/
|
||||
/* @[declare_mqtt_disconnect] */
|
||||
void IotMqtt_Disconnect( IotMqttConnection_t mqttConnection,
|
||||
uint32_t flags );
|
||||
/* @[declare_mqtt_disconnect] */
|
||||
|
||||
/**
|
||||
* @brief Subscribes to the given array of topic filters and optionally
|
||||
* receive an asynchronous notification when the subscribe completes.
|
||||
*
|
||||
* This function sends an MQTT SUBSCRIBE packet to the server. A SUBSCRIBE
|
||||
* packet notifies the server to send any matching PUBLISH messages to this client.
|
||||
* A single SUBSCRIBE packet may carry more than one topic filter, hence the
|
||||
* parameters to this function include an array of [subscriptions]
|
||||
* (@ref IotMqttSubscription_t).
|
||||
*
|
||||
* An MQTT subscription has two pieces:
|
||||
* 1. The subscription topic filter registered with the MQTT server. The MQTT
|
||||
* SUBSCRIBE packet sent from this client to server notifies the server to send
|
||||
* messages matching the given topic filters to this client.
|
||||
* 2. The [callback function](@ref IotMqttCallbackInfo_t.function) that this
|
||||
* client will invoke when an incoming message is received. The callback function
|
||||
* notifies applications of an incoming PUBLISH message.
|
||||
*
|
||||
* The helper function @ref mqtt_function_issubscribed can be used to check if a
|
||||
* [callback function](@ref IotMqttCallbackInfo_t.function) is registered for
|
||||
* a particular topic filter.
|
||||
*
|
||||
* To modify an already-registered subscription callback, call this function with
|
||||
* a new `pSubscriptionList`. Any topic filters in `pSubscriptionList` that already
|
||||
* have a registered callback will be replaced with the new values in `pSubscriptionList`.
|
||||
*
|
||||
* @attention QoS 2 subscriptions are currently unsupported. Only 0 or 1 are valid
|
||||
* for subscription QoS.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to use for the subscription.
|
||||
* @param[in] pSubscriptionList Pointer to the first element in the array of
|
||||
* subscriptions.
|
||||
* @param[in] subscriptionCount The number of elements in pSubscriptionList.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* @param[in] pCallbackInfo Asynchronous notification of this function's completion (`NULL` to disable).
|
||||
* @param[out] pSubscribeOperation Set to a handle by which this operation may be
|
||||
* referenced after this function returns. This reference is invalidated once
|
||||
* the subscription operation completes.
|
||||
*
|
||||
* @return This function will return #IOT_MQTT_STATUS_PENDING upon success.
|
||||
* @return Upon completion of the subscription (either through an
|
||||
* #IotMqttCallbackInfo_t or @ref mqtt_function_wait), the status will be one of:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_SERVER_REFUSED
|
||||
* @return If this function fails before queuing a subscribe operation, it will return
|
||||
* one of:
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
*
|
||||
* @see @ref mqtt_function_subscribesync for a blocking variant of this function.
|
||||
* @see @ref mqtt_function_unsubscribeasync for the function that removes subscriptions.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* #define NUMBER_OF_SUBSCRIPTIONS ...
|
||||
*
|
||||
* // Subscription callback function.
|
||||
* void subscriptionCallback( void * pArgument, IotMqttCallbackParam_t * pPublish );
|
||||
*
|
||||
* // An initialized and connected MQTT connection.
|
||||
* IotMqttConnection_t mqttConnection;
|
||||
*
|
||||
* // Subscription information.
|
||||
* pSubscriptions[ NUMBER_OF_SUBSCRIPTIONS ] = { IOT_MQTT_SUBSCRIPTION_INITIALIZER };
|
||||
* IotMqttOperation_t lastOperation = IOT_MQTT_OPERATION_INITIALIZER;
|
||||
*
|
||||
* // Set the subscription information.
|
||||
* for( int i = 0; i < NUMBER_OF_SUBSCRIPTIONS; i++ )
|
||||
* {
|
||||
* pSubscriptions[ i ].qos = IOT_MQTT_QOS_1;
|
||||
* pSubscriptions[ i ].pTopicFilter = "some/topic/filter";
|
||||
* pSubscriptions[ i ].topicLength = ( uint16_t ) strlen( pSubscriptions[ i ].pTopicFilter );
|
||||
* pSubscriptions[ i ].callback.function = subscriptionCallback;
|
||||
* }
|
||||
*
|
||||
* IotMqttError_t result = IotMqtt_SubscribeAsync( mqttConnection,
|
||||
* pSubscriptions,
|
||||
* NUMBER_OF_SUBSCRIPTIONS,
|
||||
* IOT_MQTT_FLAG_WAITABLE,
|
||||
* NULL,
|
||||
* &lastOperation );
|
||||
*
|
||||
* // Subscribe returns IOT_MQTT_STATUS_PENDING when successful. Wait up to
|
||||
* // 5 seconds for the operation to complete.
|
||||
* if( result == IOT_MQTT_STATUS_PENDING )
|
||||
* {
|
||||
* result = IotMqtt_Wait( subscriptionRef, 5000 );
|
||||
* }
|
||||
*
|
||||
* // Check that the subscriptions were successful.
|
||||
* if( result == IOT_MQTT_SUCCESS )
|
||||
* {
|
||||
* // Wait for messages on the subscription topic filters...
|
||||
*
|
||||
* // Unsubscribe once the subscriptions are no longer needed.
|
||||
* result = IotMqtt_UnsubscribeAsync( mqttConnection,
|
||||
* pSubscriptions,
|
||||
* NUMBER_OF_SUBSCRIPTIONS,
|
||||
* IOT_MQTT_FLAG_WAITABLE,
|
||||
* NULL,
|
||||
* &lastOperation );
|
||||
*
|
||||
* // UNSUBSCRIBE returns IOT_MQTT_STATUS_PENDING when successful.
|
||||
* // Wait up to 5 seconds for the operation to complete.
|
||||
* if( result == IOT_MQTT_STATUS_PENDING )
|
||||
* {
|
||||
* result = IotMqtt_Wait( lastOperation, 5000 );
|
||||
* }
|
||||
* }
|
||||
* // Check which subscriptions were rejected by the server.
|
||||
* else if( result == IOT_MQTT_SERVER_REFUSED )
|
||||
* {
|
||||
* for( int i = 0; i < NUMBER_OF_SUBSCRIPTIONS; i++ )
|
||||
* {
|
||||
* if( IotMqtt_IsSubscribed( mqttConnection,
|
||||
* pSubscriptions[ i ].pTopicFilter,
|
||||
* pSubscriptions[ i ].topicFilterLength,
|
||||
* NULL ) == false )
|
||||
* {
|
||||
* // This subscription was rejected.
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_subscribeasync] */
|
||||
IotMqttError_t IotMqtt_SubscribeAsync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
uint32_t flags,
|
||||
const IotMqttCallbackInfo_t * pCallbackInfo,
|
||||
IotMqttOperation_t * const pSubscribeOperation );
|
||||
/* @[declare_mqtt_subscribeasync] */
|
||||
|
||||
/**
|
||||
* @brief Subscribes to the given array of topic filters with a timeout.
|
||||
*
|
||||
* This function sends an MQTT SUBSCRIBE packet to the server, then waits for
|
||||
* a server response to the packet. Internally, this function is a call to @ref
|
||||
* mqtt_function_subscribeasync followed by @ref mqtt_function_wait. See @ref
|
||||
* mqtt_function_subscribeasync for more information about the MQTT SUBSCRIBE operation.
|
||||
*
|
||||
* @attention QoS 2 subscriptions are currently unsupported. Only 0 or 1 are valid
|
||||
* for subscription QoS.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to use for the subscription.
|
||||
* @param[in] pSubscriptionList Pointer to the first element in the array of
|
||||
* subscriptions.
|
||||
* @param[in] subscriptionCount The number of elements in pSubscriptionList.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* Currently, flags are ignored by this function; this parameter is for
|
||||
* future-compatibility.
|
||||
* @param[in] timeoutMs If the MQTT server does not acknowledge the subscriptions within
|
||||
* this timeout in milliseconds, this function returns #IOT_MQTT_TIMEOUT.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_TIMEOUT
|
||||
* - #IOT_MQTT_SERVER_REFUSED
|
||||
*/
|
||||
/* @[declare_mqtt_subscribesync] */
|
||||
IotMqttError_t IotMqtt_SubscribeSync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
uint32_t flags,
|
||||
uint32_t timeoutMs );
|
||||
/* @[declare_mqtt_subscribesync] */
|
||||
|
||||
/**
|
||||
* @brief Unsubscribes from the given array of topic filters and optionally
|
||||
* receive an asynchronous notification when the unsubscribe completes.
|
||||
*
|
||||
* This function sends an MQTT UNSUBSCRIBE packet to the server. An UNSUBSCRIBE
|
||||
* packet removes registered topic filters from the server. After unsubscribing,
|
||||
* the server will no longer send messages on these topic filters to the client.
|
||||
*
|
||||
* Corresponding [subscription callback functions](@ref IotMqttCallbackInfo_t.function)
|
||||
* are also removed from the MQTT connection. These subscription callback functions
|
||||
* will be removed even if the MQTT UNSUBSCRIBE packet fails to send.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection used for the subscription.
|
||||
* @param[in] pSubscriptionList Pointer to the first element in the array of
|
||||
* subscriptions.
|
||||
* @param[in] subscriptionCount The number of elements in pSubscriptionList.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* @param[in] pCallbackInfo Asynchronous notification of this function's completion (`NULL` to disable).
|
||||
* @param[out] pUnsubscribeOperation Set to a handle by which this operation may be
|
||||
* referenced after this function returns. This reference is invalidated once
|
||||
* the unsubscribe operation completes.
|
||||
*
|
||||
* @return This function will return #IOT_MQTT_STATUS_PENDING upon success.
|
||||
* @return Upon completion of the unsubscribe (either through an
|
||||
* #IotMqttCallbackInfo_t or @ref mqtt_function_wait), the status will be one of:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* @return If this function fails before queuing an unsubscribe operation, it will return
|
||||
* one of:
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
*
|
||||
* @see @ref mqtt_function_unsubscribesync for a blocking variant of this function.
|
||||
* @see @ref mqtt_function_subscribeasync for the function that adds subscriptions.
|
||||
*/
|
||||
/* @[declare_mqtt_unsubscribeasync] */
|
||||
IotMqttError_t IotMqtt_UnsubscribeAsync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
uint32_t flags,
|
||||
const IotMqttCallbackInfo_t * pCallbackInfo,
|
||||
IotMqttOperation_t * const pUnsubscribeOperation );
|
||||
/* @[declare_mqtt_unsubscribeasync] */
|
||||
|
||||
/**
|
||||
* @brief Unsubscribes from a given array of topic filters with a timeout.
|
||||
*
|
||||
* This function sends an MQTT UNSUBSCRIBE packet to the server, then waits
|
||||
* for a server response to the packet. Internally, this function is a call to
|
||||
* @ref mqtt_function_unsubscribeasync followed by @ref mqtt_function_wait. See @ref
|
||||
* mqtt_function_unsubscribeasync for more information about the MQTT UNSUBSCRIBE
|
||||
* operation.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection used for the subscription.
|
||||
* @param[in] pSubscriptionList Pointer to the first element in the array of
|
||||
* subscriptions.
|
||||
* @param[in] subscriptionCount The number of elements in pSubscriptionList.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* Flags are currently ignored but reserved for future use.
|
||||
* @param[in] timeoutMs If the MQTT server does not acknowledge the UNSUBSCRIBE within
|
||||
* this timeout in milliseconds, this function returns #IOT_MQTT_TIMEOUT.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
*/
|
||||
/* @[declare_mqtt_unsubscribesync] */
|
||||
IotMqttError_t IotMqtt_UnsubscribeSync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
uint32_t flags,
|
||||
uint32_t timeoutMs );
|
||||
/* @[declare_mqtt_unsubscribesync] */
|
||||
|
||||
/**
|
||||
* @brief Publishes a message to the given topic name and optionally
|
||||
* receive an asynchronous notification when the publish completes.
|
||||
*
|
||||
* This function sends an MQTT PUBLISH packet to the server. A PUBLISH packet
|
||||
* contains a payload and a topic name. Any clients with a subscription on a
|
||||
* topic filter matching the PUBLISH topic name will receive a copy of the
|
||||
* PUBLISH packet from the server.
|
||||
*
|
||||
* If a PUBLISH packet fails to reach the server and it is not a QoS 0 message,
|
||||
* it will be retransmitted. See #IotMqttPublishInfo_t for a description
|
||||
* of the retransmission strategy.
|
||||
*
|
||||
* @attention QoS 2 messages are currently unsupported. Only 0 or 1 are valid
|
||||
* for message QoS.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to use for the publish.
|
||||
* @param[in] pPublishInfo MQTT publish parameters.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* @param[in] pCallbackInfo Asynchronous notification of this function's completion (`NULL` to disable).
|
||||
* @param[out] pPublishOperation Set to a handle by which this operation may be
|
||||
* referenced after this function returns. This reference is invalidated once
|
||||
* the publish operation completes.
|
||||
*
|
||||
* @return This function will return #IOT_MQTT_STATUS_PENDING upon success for
|
||||
* QoS 1 publishes. For a QoS 0 publish it returns #IOT_MQTT_SUCCESS upon
|
||||
* success.
|
||||
* @return Upon completion of a QoS 1 publish (either through an
|
||||
* #IotMqttCallbackInfo_t or @ref mqtt_function_wait), the status will be one of:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_RETRY_NO_RESPONSE (if [pPublishInfo->retryMs](@ref IotMqttPublishInfo_t.retryMs)
|
||||
* and [pPublishInfo->retryLimit](@ref IotMqttPublishInfo_t.retryLimit) were set).
|
||||
* @return If this function fails before queuing an publish operation (regardless
|
||||
* of QoS), it will return one of:
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
*
|
||||
* @note The parameters `pCallbackInfo` and `pPublishOperation` should only be used for QoS
|
||||
* 1 publishes. For QoS 0, they should both be `NULL`.
|
||||
*
|
||||
* @see @ref mqtt_function_publishsync for a blocking variant of this function.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // An initialized and connected MQTT connection.
|
||||
* IotMqttConnection_t mqttConnection;
|
||||
*
|
||||
* // Publish information.
|
||||
* IotMqttPublishInfo_t publishInfo = IOT_MQTT_PUBLISH_INFO_INITIALIZER;
|
||||
*
|
||||
* // Set the publish information. QoS 0 example (retain not used):
|
||||
* publishInfo.qos = IOT_MQTT_QOS_0;
|
||||
* publishInfo.pTopicName = "some/topic/name";
|
||||
* publishInfo.topicNameLength = ( uint16_t ) strlen( publishInfo.pTopicName );
|
||||
* publishInfo.pPayload = "payload";
|
||||
* publishInfo.payloadLength = strlen( publishInfo.pPayload );
|
||||
*
|
||||
* // QoS 0 publish should return IOT_MQTT_SUCCESS upon success.
|
||||
* IotMqttError_t qos0Result = IotMqtt_PublishAsync( mqttConnection,
|
||||
* &publishInfo,
|
||||
* 0,
|
||||
* NULL,
|
||||
* NULL );
|
||||
*
|
||||
* // QoS 1 with retry example (using same topic name and payload as QoS 0 example):
|
||||
* IotMqttOperation_t qos1Operation = IOT_MQTT_OPERATION_INITIALIZER;
|
||||
* publishInfo.qos = IOT_MQTT_QOS_1;
|
||||
* publishInfo.retryMs = 1000; // Retry if no response is received in 1 second.
|
||||
* publishInfo.retryLimit = 5; // Retry up to 5 times.
|
||||
*
|
||||
* // QoS 1 publish should return IOT_MQTT_STATUS_PENDING upon success.
|
||||
* IotMqttError_t qos1Result = IotMqtt_PublishAsync( mqttConnection,
|
||||
* &publishInfo,
|
||||
* IOT_MQTT_FLAG_WAITABLE,
|
||||
* NULL,
|
||||
* &qos1Operation );
|
||||
*
|
||||
* // Wait up to 5 seconds for the publish to complete.
|
||||
* if( qos1Result == IOT_MQTT_STATUS_PENDING )
|
||||
* {
|
||||
* qos1Result = IotMqtt_Wait( qos1Operation, 5000 );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_publishasync] */
|
||||
IotMqttError_t IotMqtt_PublishAsync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttPublishInfo_t * pPublishInfo,
|
||||
uint32_t flags,
|
||||
const IotMqttCallbackInfo_t * pCallbackInfo,
|
||||
IotMqttOperation_t * const pPublishOperation );
|
||||
/* @[declare_mqtt_publishasync] */
|
||||
|
||||
/**
|
||||
* @brief Publish a message to the given topic name with a timeout.
|
||||
*
|
||||
* This function sends an MQTT PUBLISH packet to the server, then waits for
|
||||
* a server response to the packet. Internally, this function is a call to @ref
|
||||
* mqtt_function_publishasync followed by @ref mqtt_function_wait. See @ref
|
||||
* mqtt_function_publishasync for more information about the MQTT PUBLISH operation.
|
||||
*
|
||||
* @attention QoS 2 messages are currently unsupported. Only 0 or 1 are valid
|
||||
* for message QoS.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to use for the publish.
|
||||
* @param[in] pPublishInfo MQTT publish parameters.
|
||||
* @param[in] flags Flags which modify the behavior of this function. See @ref mqtt_constants_flags.
|
||||
* Currently, flags are ignored by this function; this parameter is for
|
||||
* future-compatibility.
|
||||
* @param[in] timeoutMs If the MQTT server does not acknowledge a QoS 1 PUBLISH
|
||||
* within this timeout in milliseconds, this function returns #IOT_MQTT_TIMEOUT.
|
||||
* This parameter is ignored for QoS 0 PUBLISH messages.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_NOT_INITIALIZED
|
||||
* - #IOT_MQTT_BAD_PARAMETER
|
||||
* - #IOT_MQTT_NO_MEMORY
|
||||
* - #IOT_MQTT_NETWORK_ERROR
|
||||
* - #IOT_MQTT_SCHEDULING_ERROR
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_RETRY_NO_RESPONSE (if [pPublishInfo->retryMs](@ref IotMqttPublishInfo_t.retryMs)
|
||||
* and [pPublishInfo->retryLimit](@ref IotMqttPublishInfo_t.retryLimit) were set).
|
||||
*/
|
||||
/* @[declare_mqtt_publishsync] */
|
||||
IotMqttError_t IotMqtt_PublishSync( IotMqttConnection_t mqttConnection,
|
||||
const IotMqttPublishInfo_t * pPublishInfo,
|
||||
uint32_t flags,
|
||||
uint32_t timeoutMs );
|
||||
/* @[declare_mqtt_publishsync] */
|
||||
|
||||
/**
|
||||
* @brief Waits for an operation to complete.
|
||||
*
|
||||
* This function blocks to wait for a [subscribe](@ref mqtt_function_subscribeasync),
|
||||
* [unsubscribe](@ref mqtt_function_unsubscribeasync), or [publish]
|
||||
* (@ref mqtt_function_publishasync) to complete. These operations are by default
|
||||
* asynchronous; the function calls queue an operation for processing, and a
|
||||
* callback is invoked once the operation is complete.
|
||||
*
|
||||
* To use this function, the flag #IOT_MQTT_FLAG_WAITABLE must have been
|
||||
* set in the operation's function call. Additionally, this function must always
|
||||
* be called with any waitable operation to clean up resources.
|
||||
*
|
||||
* Regardless of its return value, this function always clean up resources used
|
||||
* by the waitable operation. This means `reference` is invalidated as soon as
|
||||
* this function returns, even if it returns #IOT_MQTT_TIMEOUT or another error.
|
||||
*
|
||||
* @param[in] operation Reference to the operation to wait for. The flag
|
||||
* #IOT_MQTT_FLAG_WAITABLE must have been set for this operation.
|
||||
* @param[in] timeoutMs How many milliseconds to wait before returning
|
||||
* #IOT_MQTT_TIMEOUT.
|
||||
*
|
||||
* @return The return value of this function depends on the MQTT operation associated
|
||||
* with `reference`. See #IotMqttError_t for possible return values.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Operation reference and timeout.
|
||||
* IotMqttOperation_t publishOperation = IOT_MQTT_OPERATION_INITIALIZER;
|
||||
* uint32_t timeoutMs = 5000; // 5 seconds
|
||||
*
|
||||
* // MQTT operation to wait for.
|
||||
* IotMqttError_t result = IotMqtt_PublishAsync( mqttConnection,
|
||||
* &publishInfo,
|
||||
* IOT_MQTT_FLAG_WAITABLE,
|
||||
* NULL,
|
||||
* &publishOperation );
|
||||
*
|
||||
* // Publish should have returned IOT_MQTT_STATUS_PENDING. The call to wait
|
||||
* // returns once the result of the publish is available or the timeout expires.
|
||||
* if( result == IOT_MQTT_STATUS_PENDING )
|
||||
* {
|
||||
* result = IotMqtt_Wait( publishOperation, timeoutMs );
|
||||
*
|
||||
* // After the call to wait, the result of the publish is known
|
||||
* // (not IOT_MQTT_STATUS_PENDING).
|
||||
* assert( result != IOT_MQTT_STATUS_PENDING );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_wait] */
|
||||
IotMqttError_t IotMqtt_Wait( IotMqttOperation_t operation,
|
||||
uint32_t timeoutMs );
|
||||
/* @[declare_mqtt_wait] */
|
||||
|
||||
/*-------------------------- MQTT helper functions --------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Returns a string that describes an #IotMqttError_t.
|
||||
*
|
||||
* Like the POSIX `strerror`, this function returns a string describing a
|
||||
* return code. In this case, the return code is an MQTT library error code,
|
||||
* `status`.
|
||||
*
|
||||
* The string returned by this function <b>MUST</b> be treated as read-only: any
|
||||
* attempt to modify its contents may result in a crash. Therefore, this function
|
||||
* is limited to usage in logging.
|
||||
*
|
||||
* @param[in] status The status to describe.
|
||||
*
|
||||
* @return A read-only string that describes `status`.
|
||||
*
|
||||
* @warning The string returned by this function must never be modified.
|
||||
*/
|
||||
/* @[declare_mqtt_strerror] */
|
||||
const char * IotMqtt_strerror( IotMqttError_t status );
|
||||
/* @[declare_mqtt_strerror] */
|
||||
|
||||
/**
|
||||
* @brief Returns a string that describes an #IotMqttOperationType_t.
|
||||
*
|
||||
* This function returns a string describing an MQTT operation type, `operation`.
|
||||
*
|
||||
* The string returned by this function <b>MUST</b> be treated as read-only: any
|
||||
* attempt to modify its contents may result in a crash. Therefore, this function
|
||||
* is limited to usage in logging.
|
||||
*
|
||||
* @param[in] operation The operation to describe.
|
||||
*
|
||||
* @return A read-only string that describes `operation`.
|
||||
*
|
||||
* @warning The string returned by this function must never be modified.
|
||||
*/
|
||||
/* @[declare_mqtt_operationtype] */
|
||||
const char * IotMqtt_OperationType( IotMqttOperationType_t operation );
|
||||
/* @[declare_mqtt_operationtype] */
|
||||
|
||||
/**
|
||||
* @brief Check if an MQTT connection has a subscription for a topic filter.
|
||||
*
|
||||
* This function checks whether an MQTT connection `mqttConnection` has a
|
||||
* subscription callback registered for a topic filter `pTopicFilter`. If a
|
||||
* subscription callback is found, its details are copied into the output parameter
|
||||
* `pCurrentSubscription`. This subscription callback will be invoked for incoming
|
||||
* PUBLISH messages on `pTopicFilter`.
|
||||
*
|
||||
* <b>The check for a matching subscription is only performed client-side</b>;
|
||||
* therefore, this function should not be relied upon for perfect accuracy. For
|
||||
* example, this function may return an incorrect result if the MQTT server
|
||||
* crashes and drops subscriptions without informing the client.
|
||||
*
|
||||
* Note that an MQTT connection's subscriptions might change between the time this
|
||||
* function checks the subscription list and its caller tests the return value.
|
||||
* This function certainly should not be used concurrently with any pending SUBSCRIBE
|
||||
* or UNSUBSCRIBE operations.
|
||||
*
|
||||
* One suitable use of this function is to check <i>which</i> subscriptions were rejected
|
||||
* if @ref mqtt_function_subscribeasync returns #IOT_MQTT_SERVER_REFUSED; that return
|
||||
* code only means that <i>at least one</i> subscription was rejected.
|
||||
*
|
||||
* @param[in] mqttConnection The MQTT connection to check.
|
||||
* @param[in] pTopicFilter The topic filter to check.
|
||||
* @param[in] topicFilterLength Length of `pTopicFilter`.
|
||||
* @param[out] pCurrentSubscription If a subscription is found, its details are
|
||||
* copied here. This output parameter is only valid if this function returns `true` (`NULL` to disable).
|
||||
*
|
||||
* @return `true` if a subscription was found; `false` otherwise.
|
||||
*
|
||||
* @note The subscription QoS is not stored by the MQTT library; therefore,
|
||||
* `pCurrentSubscription->qos` will always be set to #IOT_MQTT_QOS_0.
|
||||
*/
|
||||
/* @[declare_mqtt_issubscribed] */
|
||||
bool IotMqtt_IsSubscribed( IotMqttConnection_t mqttConnection,
|
||||
const char * pTopicFilter,
|
||||
uint16_t topicFilterLength,
|
||||
IotMqttSubscription_t * const pCurrentSubscription );
|
||||
/* @[declare_mqtt_issubscribed] */
|
||||
|
||||
/**
|
||||
* @cond DOXYGEN_IGNORE
|
||||
* Doxygen should ignore this section.
|
||||
*
|
||||
* Backwards compatibility macros for previous function names.
|
||||
*/
|
||||
#define IotMqtt_Subscribe IotMqtt_SubscribeAsync
|
||||
#define IotMqtt_TimedSubscribe IotMqtt_SubscribeSync
|
||||
#define IotMqtt_Unsubscribe IotMqtt_UnsubscribeAsync
|
||||
#define IotMqtt_TimedUnsubscribe IotMqtt_UnsubscribeSync
|
||||
#define IotMqtt_Publish IotMqtt_PublishAsync
|
||||
#define IotMqtt_TimedPublish IotMqtt_PublishSync
|
||||
/** @endcond */
|
||||
|
||||
#endif /* ifndef IOT_MQTT_H_ */
|
|
@ -0,0 +1,702 @@
|
|||
/*
|
||||
* IoT MQTT V2.1.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file iot_mqtt_serialize.h
|
||||
* @brief User-facing functions for serializing MQTT 3.1.1 packets. This header should
|
||||
* be included for building a single threaded light-weight MQTT client bypassing
|
||||
* stateful CSDK MQTT library.
|
||||
*/
|
||||
|
||||
#ifndef _IOT_MQTT_SERIALIZE_H_
|
||||
#define _IOT_MQTT_SERIALIZE_H_
|
||||
|
||||
/* The config header is always included first. */
|
||||
#include "iot_config.h"
|
||||
|
||||
/* MQTT types include. */
|
||||
#include "types/iot_mqtt_types.h"
|
||||
|
||||
/*------------------------- MQTT library functions --------------------------*/
|
||||
|
||||
/**
|
||||
* @functionspage{mqtt,MQTT library}
|
||||
* - @functionname{mqtt_function_getconnectpacketsize}
|
||||
* - @functionname{mqtt_function_serializeconnect}
|
||||
* - @functionname{mqtt_function_getsubscriptionpacketsize}
|
||||
* - @functionname{mqtt_function_serializesubscribe}
|
||||
* - @functionname{mqtt_function_serializeunsubscribe}
|
||||
* - @functionname{mqtt_function_getpublishpacketsize}
|
||||
* - @functionname{mqtt_function_serializepublish}
|
||||
* - @functionname{mqtt_function_serializedisconnect}
|
||||
* - @functionname{mqtt_function_serializepingreq}
|
||||
* - @functionname{mqtt_function_getincomingmqttpackettypeandlength}
|
||||
* - @functionname{mqtt_function_deserializeresponse}
|
||||
* - @functionname{mqtt_function_deserializepublish}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @functionpage{IotMqtt_GetConnectPacketSize,mqtt,getconnectpacketsize}
|
||||
* @functionpage{IotMqtt_SerializeConnect,mqtt,serializeconnect}
|
||||
* @functionpage{IotMqtt_GetSubscriptionPacketSize,mqtt,getsubscriptionpacketsize}
|
||||
* @functionpage{IotMqtt_SerializeSubscribe,mqtt,serializesubscribe}
|
||||
* @functionpage{IotMqtt_SerializeUnsubscribe,mqtt,serializeunsubscribe}
|
||||
* @functionpage{IotMqtt_GetPublishPacketSize,mqtt,getpublishpacketsize}
|
||||
* @functionpage{IotMqtt_SerializePublish,mqtt,serializepublish}
|
||||
* @functionpage{IotMqtt_SerializeDisconnect,mqtt,serializedisconnect}
|
||||
* @functionpage{IotMqtt_SerializePingreq,mqtt,serializepingreq}
|
||||
* @functionpage{IotMqtt_GetIncomingMQTTPacketTypeAndLength,mqtt,getincomingmqttpackettypeandlength}
|
||||
* @functionpage{IotMqtt_DeserializeResponse,mqtt,deserializeresponse}
|
||||
* @functionpage{IotMqtt_DeserializePublish,mqtt,deserializepublish}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Calculate the size and "Remaining length" of a CONNECT packet generated
|
||||
* from the given parameters.
|
||||
*
|
||||
* @param[in] pConnectInfo User-provided CONNECT information struct.
|
||||
* @param[out] pRemainingLength Output for calculated "Remaining length" field.
|
||||
* @param[out] pPacketSize Output for calculated total packet size.
|
||||
*
|
||||
* @return IOT_MQTT_SUCCESS if the packet is within the length allowed by MQTT 3.1.1 spec;
|
||||
* IOT_MQTT_BAD_PARAMETER otherwise. If this function returns `IOT_MQTT_BAD_PARAMETER`,
|
||||
* the output parameters should be ignored.
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_GetConnectPacketSize() should be used to calculate
|
||||
* // the size of connect request.
|
||||
*
|
||||
* IotMqttConnectInfo_t xConnectInfo;
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
* IotMqttError_t xResult;
|
||||
*
|
||||
* // start with everything set to zero
|
||||
* memset( ( void * ) &xConnectInfo, 0x00, sizeof( xConnectInfo ) );
|
||||
*
|
||||
* // Initialize connection info, details are out of scope for this example.
|
||||
* _initializeConnectInfo( &xConnectInfo );
|
||||
* // Get size requirement for the connect packet
|
||||
* xResult = IotMqtt_GetConnectPacketSize( &xConnectInfo, &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // Application should allocate buffer with size == xPacketSize or use static buffer
|
||||
* // with size >= xPacketSize to serialize connect request.
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_getconnectpacketsize] */
|
||||
IotMqttError_t IotMqtt_GetConnectPacketSize( const IotMqttConnectInfo_t * pConnectInfo,
|
||||
size_t * pRemainingLength,
|
||||
size_t * pPacketSize );
|
||||
/* @[declare_mqtt_getconnectpacketsize] */
|
||||
|
||||
/**
|
||||
* @brief Generate a CONNECT packet from the given parameters.
|
||||
*
|
||||
* @param[in] pConnectInfo User-provided CONNECT information.
|
||||
* @param[in] remainingLength remaining length of the packet to be serialized.
|
||||
* @param[in, out] pBuffer User provided buffer where the CONNECT packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS or #IOT_MQTT_NO_MEMORY.
|
||||
*
|
||||
* @note pBuffer must be allocated by caller. Use @ref mqtt_function_getconnectpacketsize
|
||||
* to determine the required size.
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_SerializeConnect() should be used to serialize
|
||||
* // MQTT connect packet and send it to MQTT broker.
|
||||
* // Example uses static memory but dynamically allocated memory can be used as well.
|
||||
* // Get size requirement for the connect packet.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendConnectPacket( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttConnectInfo_t xConnectInfo;
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
* IotMqttError_t xResult;
|
||||
* size_t xSentBytes = 0;
|
||||
* // Get size requirement for MQTT connect packet.
|
||||
* xResult = IotMqtt_GetConnectPacketSize( &xConnectInfo, &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // Make sure the packet size is less than static buffer size
|
||||
* IotMqtt_Assert( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );
|
||||
* // Serialize MQTT connect packet into provided buffer
|
||||
* xResult = IotMqtt_SerializeConnect( &xConnectInfo, xRemainingLength, ucSharedBuffer, xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentBytes = send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 );
|
||||
* IotMqtt_Assert( xSentBytes == xPacketSize );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializeconnect] */
|
||||
IotMqttError_t IotMqtt_SerializeConnect( const IotMqttConnectInfo_t * pConnectInfo,
|
||||
size_t remainingLength,
|
||||
uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializeconnect] */
|
||||
|
||||
/**
|
||||
* @brief Calculate the size and "Remaining length" of a SUBSCRIBE or UNSUBSCRIBE
|
||||
* packet generated from the given parameters.
|
||||
*
|
||||
* @param[in] type Either IOT_MQTT_SUBSCRIBE or IOT_MQTT_UNSUBSCRIBE.
|
||||
* @param[in] pSubscriptionList User-provided array of subscriptions.
|
||||
* @param[in] subscriptionCount Size of `pSubscriptionList`.
|
||||
* @param[out] pRemainingLength Output for calculated "Remaining length" field.
|
||||
* @param[out] pPacketSize Output for calculated total packet size.
|
||||
*
|
||||
* @return IOT_MQTT_SUCCESS if the packet is within the length allowed by MQTT 3.1.1 spec;
|
||||
* IOT_MQTT_BAD_PARAMETER otherwise. If this function returns IOT_MQTT_BAD_PARAMETER,
|
||||
* the output parameters should be ignored.
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_GetSubscriptionPacketSize() should be used to calculate
|
||||
* // the size of subscribe or unsubscribe request.
|
||||
*
|
||||
* IotMqttError_t xResult;
|
||||
* IotMqttSubscription_t xMQTTSubscription[ 1 ];
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
*
|
||||
* // Initialize Subscribe parameters. Details are out of scope for this example.
|
||||
* // It will involve setting QOS, topic filter and topic filter length.
|
||||
* _initializeSubscribe( xMQTTSubscription );
|
||||
*
|
||||
* xResult = IotMqtt_GetSubscriptionPacketSize( IOT_MQTT_SUBSCRIBE,
|
||||
* xMQTTSubscription,
|
||||
* sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),
|
||||
* &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // Application should allocate buffer with size == xPacketSize or use static buffer
|
||||
* // with size >= xPacketSize to serialize connect request.
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_getsubscriptionpacketsize] */
|
||||
IotMqttError_t IotMqtt_GetSubscriptionPacketSize( IotMqttOperationType_t type,
|
||||
const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
size_t * pRemainingLength,
|
||||
size_t * pPacketSize );
|
||||
/* @[declare_mqtt_getsubscriptionpacketsize] */
|
||||
|
||||
/**
|
||||
* @brief Generate a SUBSCRIBE packet from the given parameters.
|
||||
*
|
||||
* @param[in] pSubscriptionList User-provided array of subscriptions.
|
||||
* @param[in] subscriptionCount Size of `pSubscriptionList`.
|
||||
* @param[in] remainingLength remaining length of the packet to be serialized.
|
||||
* @param[out] pPacketIdentifier The packet identifier generated for this SUBSCRIBE.
|
||||
* @param[in, out] pBuffer User provide buffer where the SUBSCRIBE packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS or #IOT_MQTT_NO_MEMORY.
|
||||
*
|
||||
* @note pBuffer must be allocated by caller.
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_SerializeSubscribe() should be used to serialize
|
||||
* // MQTT Subscribe packet and send it to MQTT broker.
|
||||
* // Example uses static memory, but dynamically allocated memory can be used as well.
|
||||
* // Get size requirement for the MQTT subscribe packet.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendSubscribePacket( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttSubscription_t xMQTTSubscription[ 1 ];
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
* IotMqttError_t xResult;
|
||||
* size_t xSentBytes = 0;
|
||||
*
|
||||
* // Initialize Subscribe parameters. Details are out of scope for this example.
|
||||
* // It will involve setting QOS, topic filter and topic filter length.
|
||||
* _initializeSubscribe( xMQTTSubscription );
|
||||
* // Get size requirement for MQTT Subscribe packet.
|
||||
* xResult = IotMqtt_GetSubscriptionPacketSize( IOT_MQTT_SUBSCRIBE,
|
||||
* xMQTTSubscription,
|
||||
* sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),
|
||||
* &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // Make sure the packet size is less than static buffer size.
|
||||
* IotMqtt_Assert( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );
|
||||
*
|
||||
* // Serialize subscribe into statically allocated ucSharedBuffer.
|
||||
* xResult = IotMqtt_SerializeSubscribe( xMQTTSubscription,
|
||||
* sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),
|
||||
* xRemainingLength,
|
||||
* &usPacketIdentifier,
|
||||
* ucSharedBuffer,
|
||||
* xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentBytes = send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 );
|
||||
* IotMqtt_Assert( xSentBytes == xPacketSize );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializesubscribe] */
|
||||
IotMqttError_t IotMqtt_SerializeSubscribe( const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
size_t remainingLength,
|
||||
uint16_t * pPacketIdentifier,
|
||||
uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializesubscribe] */
|
||||
|
||||
/**
|
||||
* @brief Generate a UNSUBSCRIBE packet from the given parameters.
|
||||
*
|
||||
* @param[in] pSubscriptionList User-provided array of subscriptions to remove.
|
||||
* @param[in] subscriptionCount Size of `pSubscriptionList`.
|
||||
* @param[in] remainingLength remaining length of the packet to be serialized.
|
||||
* @param[out] pPacketIdentifier The packet identifier generated for this UNSUBSCRIBE.
|
||||
* @param[in, out] pBuffer User provide buffer where the UNSUBSCRIBE packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS or #IOT_MQTT_NO_MEMORY.
|
||||
*
|
||||
* @note pBuffer must be allocated by caller.
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_SerializeUnsubscribe() should be used to serialize
|
||||
* // MQTT unsubscribe packet and send it to MQTT broker.
|
||||
* // Example uses static memory, but dynamically allocated memory can be used as well.
|
||||
* // Get size requirement for the Unsubscribe packet.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendUnsubscribePacket( int xMQTTSocket )
|
||||
* {
|
||||
* // Following example shows one topic example.
|
||||
* IotMqttSubscription_t xMQTTSubscription[ 1 ];
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
* IotMqttError_t xResult;
|
||||
* size_t xSentBytes = 0;
|
||||
* // Get size requirement for MQTT unsubscribe packet.
|
||||
* xResult = IotMqtt_GetSubscriptionPacketSize( IOT_MQTT_UNSUBSCRIBE,
|
||||
* xMQTTSubscription,
|
||||
* sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),
|
||||
* &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // Make sure the packet size is less than static buffer size.
|
||||
* IotMqtt_Assert( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );
|
||||
* // Serialize subscribe into statically allocated ucSharedBuffer.
|
||||
* xResult = IotMqtt_SerializeUnsubscribe( xMQTTSubscription,
|
||||
* sizeof( xMQTTSubscription ) / sizeof( IotMqttSubscription_t ),
|
||||
* xRemainingLength,
|
||||
* &usPacketIdentifier,
|
||||
* ucSharedBuffer,
|
||||
* xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentBytes = send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 );
|
||||
* IotMqtt_Assert( xSentBytes == xPacketSize );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializeunsubscribe] */
|
||||
IotMqttError_t IotMqtt_SerializeUnsubscribe( const IotMqttSubscription_t * pSubscriptionList,
|
||||
size_t subscriptionCount,
|
||||
size_t remainingLength,
|
||||
uint16_t * pPacketIdentifier,
|
||||
uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializeunsubscribe] */
|
||||
|
||||
/**
|
||||
* @brief Calculate the size and "Remaining length" of a PUBLISH packet generated
|
||||
* from the given parameters.
|
||||
*
|
||||
* @param[in] pPublishInfo User-provided PUBLISH information struct.
|
||||
* @param[out] pRemainingLength Output for calculated "Remaining length" field.
|
||||
* @param[out] pPacketSize Output for calculated total packet size.
|
||||
*
|
||||
* @return IOT_MQTT_SUCCESS if the packet is within the length allowed by MQTT 3.1.1 spec;
|
||||
* IOT_MQTT_BAD_PARAMETER otherwise. If this function returns IOT_MQTT_BAD_PARAMETER,
|
||||
* the output parameters should be ignored.
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_GetPublishPacketSize() should be used to calculate
|
||||
* // the size of MQTT publish request.
|
||||
*
|
||||
* IotMqttError_t xResult;
|
||||
* IotMqttPublishInfo_t xMQTTPublishInfo;
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
*
|
||||
* // Initialize Publish parameters. Details are out of scope for this example.
|
||||
* // It will involve setting QOS, topic filter, topic filter length, payload
|
||||
* // payload length
|
||||
* _initializePublish( &xMQTTPublishInfo );
|
||||
*
|
||||
* // Find out length of Publish packet size.
|
||||
* xResult = IotMqtt_GetPublishPacketSize( &xMQTTPublishInfo, &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // Application should allocate buffer with size == xPacketSize or use static buffer
|
||||
* // with size >= xPacketSize to serialize connect request.
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_getpublishpacketsize] */
|
||||
IotMqttError_t IotMqtt_GetPublishPacketSize( IotMqttPublishInfo_t * pPublishInfo,
|
||||
size_t * pRemainingLength,
|
||||
size_t * pPacketSize );
|
||||
/* @[declare_mqtt_getpublishpacketsize] */
|
||||
|
||||
/**
|
||||
* @brief Generate a PUBLISH packet from the given parameters.
|
||||
*
|
||||
* @param[in] pPublishInfo User-provided PUBLISH information.
|
||||
* @param[in] remainingLength remaining length of the packet to be serialized.
|
||||
* @param[out] pPacketIdentifier The packet identifier generated for this PUBLISH.
|
||||
* @param[out] pPacketIdentifierHigh Where the high byte of the packet identifier
|
||||
* is written.
|
||||
* @param[in, out] pBuffer User provide buffer where the PUBLISH packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS or #IOT_MQTT_BAD_PARAMETER.
|
||||
*
|
||||
* @note pBuffer must be allocated by caller.
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how IotMqtt_SerializePublish() should be used to serialize
|
||||
* // MQTT Publish packet and send it to broker.
|
||||
* // Example uses static memory, but dynamically allocated memory can be used as well.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendUnsubscribePacket( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttError_t xResult;
|
||||
* IotMqttPublishInfo_t xMQTTPublishInfo;
|
||||
* size_t xRemainingLength = 0;
|
||||
* size_t xPacketSize = 0;
|
||||
* size_t xSentBytes = 0;
|
||||
* uint16_t usPacketIdentifier;
|
||||
* uint8_t * pusPacketIdentifierHigh;
|
||||
*
|
||||
* // Initialize Publish parameters. Details are out of scope for this example.
|
||||
* // It will involve setting QOS, topic filter, topic filter length, payload
|
||||
* // payload length.
|
||||
* _initializePublish( &xMQTTPublishInfo );
|
||||
*
|
||||
* // Find out length of Publish packet size.
|
||||
* xResult = IotMqtt_GetPublishPacketSize( &xMQTTPublishInfo, &xRemainingLength, &xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* // Make sure the packet size is less than static buffer size
|
||||
* IotMqtt_Assert( xPacketSize < mqttexampleSHARED_BUFFER_SIZE );
|
||||
*
|
||||
* xResult = IotMqtt_SerializePublish( &xMQTTPublishInfo,
|
||||
* xRemainingLength,
|
||||
* &usPacketIdentifier,
|
||||
* &pusPacketIdentifierHigh,
|
||||
* ucSharedBuffer,
|
||||
* xPacketSize );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentBytes = send( xMQTTSocket, ( void * ) ucSharedBuffer, xPacketSize, 0 );
|
||||
* IotMqtt_Assert( xSentBytes == xPacketSize );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializepublish] */
|
||||
IotMqttError_t IotMqtt_SerializePublish( IotMqttPublishInfo_t * pPublishInfo,
|
||||
size_t remainingLength,
|
||||
uint16_t * pPacketIdentifier,
|
||||
uint8_t ** pPacketIdentifierHigh,
|
||||
uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializepublish] */
|
||||
|
||||
/**
|
||||
* @brief Generate a DISCONNECT packet
|
||||
*
|
||||
* @param[in, out] pBuffer User provide buffer where the DISCONNECT packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return returns #IOT_MQTT_SUCCESS or #IOT_MQTT_BAD_PARAMETER
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example below shows how IotMqtt_SerializeDisconnect() should be used.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendDisconnectRequest( int xMQTTSocket )
|
||||
* {
|
||||
* size_t xSentBytes = 0;
|
||||
*
|
||||
* // Disconnect is fixed length packet, therefore there is no need to calculate the size,
|
||||
* // just makes sure static buffer can accommodate disconnect request.
|
||||
* IotMqtt_Assert( MQTT_PACKET_DISCONNECT_SIZE <= mqttexampleSHARED_BUFFER_SIZE );
|
||||
*
|
||||
* // Serialize Disconnect packet into static buffer (dynamically allocated buffer can be used as well)
|
||||
* xResult = IotMqtt_SerializeDisconnect( ucSharedBuffer, MQTT_PACKET_DISCONNECT_SIZE );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentByte = send( xMQTTSocket, ( void * ) ucSharedBuffer, MQTT_PACKET_DISCONNECT_SIZE, 0 );
|
||||
* IotMqtt_Assert( xSentByte == MQTT_PACKET_DISCONNECT_SIZE );
|
||||
* }
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializedisconnect] */
|
||||
IotMqttError_t IotMqtt_SerializeDisconnect( uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializedisconnect] */
|
||||
|
||||
/**
|
||||
* @brief Generate a PINGREQ packet.
|
||||
*
|
||||
* @param[in, out] pBuffer User provide buffer where the PINGREQ packet is written.
|
||||
* @param[in] bufferSize Size of the buffer pointed to by pBuffer.
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS or #IOT_MQTT_BAD_PARAMETER.
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example below shows how IotMqtt_SerializePingReq() should be used.
|
||||
*
|
||||
* #define mqttexampleSHARED_BUFFER_SIZE 100
|
||||
* static ucSharedBuffer[mqttexampleSHARED_BUFFER_SIZE];
|
||||
* void sendPingRequest( int xMQTTSocket )
|
||||
* {
|
||||
* size_t xSentBytes = 0;
|
||||
*
|
||||
* // PingReq is fixed length packet, therefore there is no need to calculate the size,
|
||||
* // just makes sure static buffer can accommodate Ping request.
|
||||
* IotMqtt_Assert( MQTT_PACKET_PINGREQ_SIZE <= mqttexampleSHARED_BUFFER_SIZE );
|
||||
*
|
||||
* xResult = IotMqtt_SerializePingreq( ucSharedBuffer, MQTT_PACKET_PINGREQ_SIZE );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
*
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* xSentByte = send( xMQTTSocket, ( void * ) ucSharedBuffer, MQTT_PACKET_DISCONNECT_SIZE, 0 );
|
||||
* IotMqtt_Assert( xSentByte == MQTT_PACKET_PINGREQ_SIZE);
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_serializepingreq] */
|
||||
IotMqttError_t IotMqtt_SerializePingreq( uint8_t * pBuffer,
|
||||
size_t bufferSize );
|
||||
/* @[declare_mqtt_serializepingreq] */
|
||||
|
||||
/**
|
||||
* @brief Extract MQTT packet type and length from incoming packet
|
||||
*
|
||||
* @param[in, out] pIncomingPacket Pointer to IotMqttPacketInfo_t structure
|
||||
* where type, remaining length and packet identifier are stored.
|
||||
* @param[in] getNextByte Pointer to platform specific function which is used
|
||||
* to extract type and length from incoming received stream (see example ).
|
||||
* @param[in] pNetworkConnection Pointer to platform specific network connection
|
||||
* which is used by getNextByte to receive network data
|
||||
*
|
||||
* @return #IOT_MQTT_SUCCESS on successful extraction of type and length,
|
||||
* #IOT_MQTT_BAD_RESPONSE on failure.
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example code below shows how to implement getNetxByte function with posix sockets.
|
||||
* // Note: IotMqttGetNextByte_t typedef IotMqttError_t (* IotMqttGetNextByte_t)( void * pNetworkContext,
|
||||
* // uint8_t * pNextByte );
|
||||
* // Note: It is assumed that socket is already created and connected,
|
||||
*
|
||||
* IotMqttError_t getNextByte( void * pContext,
|
||||
* uint8_t * pNextByte )
|
||||
* {
|
||||
* int socket = ( int ) ( *pvContext );
|
||||
* int receivedBytes;
|
||||
* IotMqttError_t result;
|
||||
*
|
||||
* receivedBytes = recv( socket, ( void * ) pNextByte, sizeof( uint8_t ), 0 );
|
||||
*
|
||||
* if( receivedBytes == sizeof( uint8_t ) )
|
||||
* {
|
||||
* result = IOT_MQTT_SUCCESS;
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* result = IOT_MQTT_TIMEOUT;
|
||||
* }
|
||||
*
|
||||
* return result;
|
||||
* }
|
||||
*
|
||||
* // Example below shows how IotMqtt_GetIncomingMQTTPacketTypeAndLength() is used to extract type
|
||||
* // and length from incoming ping response.
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* void getTypeAndLengthFromIncomingMQTTPingResponse( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttPacketInfo_t xIncomingPacket;
|
||||
* IotMqttError_t xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* IotMqtt_Assert( xIncomingPacket.type == MQTT_PACKET_TYPE_PINGRESP );
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
*/
|
||||
/* @[declare_mqtt_getincomingmqttpackettypeandlength] */
|
||||
IotMqttError_t IotMqtt_GetIncomingMQTTPacketTypeAndLength( IotMqttPacketInfo_t * pIncomingPacket,
|
||||
IotMqttGetNextByte_t getNextByte,
|
||||
void * pNetworkConnection );
|
||||
/* @[declare_mqtt_getincomingmqttpackettypeandlength] */
|
||||
|
||||
/**
|
||||
* @brief Deserialize incoming publish packet.
|
||||
*
|
||||
* @param[in, out] pMqttPacket The caller of this API sets type, remainingLength and pRemainingData.
|
||||
* On success, packetIdentifier and pubInfo will be set by the function.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_SERVER_REFUSED
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example below shows how IotMqtt_DeserializePublish() used to extract contents of incoming
|
||||
* // Publish. xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* void processIncomingPublish( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttError_t xResult;
|
||||
* IotMqttPacketInfo_t xIncomingPacket;
|
||||
*
|
||||
* xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* IotMqtt_Assert( ( xIncomingPacket.type & 0xf0 ) == MQTT_PACKET_TYPE_PUBLISH );
|
||||
* IotMqtt_Assert( xIncomingPacket.remainingLength <= mqttexampleSHARED_BUFFER_SIZE );
|
||||
*
|
||||
* // Receive the remaining bytes.
|
||||
* if( recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 ) == xIncomingPacket.remainingLength )
|
||||
* {
|
||||
* xIncomingPacket.pRemainingData = ucSharedBuffer;
|
||||
*
|
||||
* if( IotMqtt_DeserializePublish( &xIncomingPacket ) != IOT_MQTT_SUCCESS )
|
||||
* {
|
||||
* xResult = IOT_MQTT_BAD_RESPONSE;
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* // Process incoming Publish.
|
||||
* IotLogInfo( "Incoming QOS : %d\n", xIncomingPacket.pubInfo.qos );
|
||||
* IotLogInfo( "Incoming Publish Topic Name: %.*s\n", xIncomingPacket.pubInfo.topicNameLength, xIncomingPacket.pubInfo.pTopicName );
|
||||
* IotLogInfo( "Incoming Publish Message : %.*s\n", xIncomingPacket.pubInfo.payloadLength, xIncomingPacket.pubInfo.pPayload );
|
||||
* }
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* xResult = IOT_MQTT_NETWORK_ERROR;
|
||||
* }
|
||||
*
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_deserializepublish] */
|
||||
IotMqttError_t IotMqtt_DeserializePublish( IotMqttPacketInfo_t * pMqttPacket );
|
||||
/* @[declare_mqtt_deserializepublish] */
|
||||
|
||||
/**
|
||||
* @brief Deserialize incoming ack packets.
|
||||
*
|
||||
* @param[in, out] pMqttPacket The caller of this API sets type, remainingLength and pRemainingData.
|
||||
* On success, packetIdentifier will be set.
|
||||
*
|
||||
* @return One of the following:
|
||||
* - #IOT_MQTT_SUCCESS
|
||||
* - #IOT_MQTT_BAD_RESPONSE
|
||||
* - #IOT_MQTT_SERVER_REFUSED
|
||||
*
|
||||
* @note This call is part of serializer API used for implementing light-weight MQTT client.
|
||||
*
|
||||
* <b>Example</b>
|
||||
* @code{c}
|
||||
* // Example below shows how IotMqtt_DeserializeResponse() is used to process unsubscribe ack.
|
||||
* // xMQTTSocket here is posix socket created and connected to MQTT broker outside of this function.
|
||||
* void processUnsubscribeAck( int xMQTTSocket )
|
||||
* {
|
||||
* IotMqttError_t xResult;
|
||||
* IotMqttPacketInfo_t xIncomingPacket;
|
||||
*
|
||||
* xResult = IotMqtt_GetIncomingMQTTPacketTypeAndLength( &xIncomingPacket, getNextByte, ( void * ) xMQTTSocket );
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* IotMqtt_Assert( xIncomingPacket.type == MQTT_PACKET_TYPE_UNSUBACK );
|
||||
* IotMqtt_Assert( xIncomingPacket.remainingLength <= sizeof( ucSharedBuffer ) );
|
||||
*
|
||||
* // Receive the remaining bytes.
|
||||
* if( recv( xMQTTSocket, ( void * ) ucSharedBuffer, xIncomingPacket.remainingLength, 0 ) == xIncomingPacket.remainingLength )
|
||||
* {
|
||||
* xIncomingPacket.pRemainingData = ucSharedBuffer;
|
||||
*
|
||||
* if( IotMqtt_DeserializeResponse( &xIncomingPacket ) != IOT_MQTT_SUCCESS )
|
||||
* {
|
||||
* xResult = IOT_MQTT_BAD_RESPONSE;
|
||||
* }
|
||||
* }
|
||||
* else
|
||||
* {
|
||||
* xResult = IOT_MQTT_NETWORK_ERROR;
|
||||
* }
|
||||
* IotMqtt_Assert( xResult == IOT_MQTT_SUCCESS );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
/* @[declare_mqtt_deserializeresponse] */
|
||||
IotMqttError_t IotMqtt_DeserializeResponse( IotMqttPacketInfo_t * pMqttPacket );
|
||||
/* @[declare_mqtt_deserializeresponse] */
|
||||
|
||||
|
||||
|
||||
#endif /* ifndef IOT_MQTT_SERIALIZE_H_ */
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue