source/include/azure_iot_hub_client_properties.h (42 lines of code) (raw):
/* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License. */
/**
* @file azure_iot_hub_client_properties.h
*
* @brief The middleware IoT Hub Client property functions used for Azure IoT Plug and Play.
*
* @note You MUST NOT use any symbols (macros, functions, structures, enums, etc.)
* prefixed with an underscore ('_') directly in your application code. These symbols
* are part of Azure SDK's internal implementation; we do not document these symbols
* and they are subject to change in future versions of the SDK which would break your code.
*
*/
#ifndef AZURE_IOT_HUB_CLIENT_PROPERTIES_H
#define AZURE_IOT_HUB_CLIENT_PROPERTIES_H
#include <stdbool.h>
#include <stdint.h>
#include "azure_iot_hub_client.h"
#include "azure_iot_json_reader.h"
#include "azure_iot_json_writer.h"
/* Azure SDK for Embedded C includes */
#include "azure/iot/az_iot_hub_client_properties.h"
#include "azure/core/_az_cfg_prefix.h"
/**
* @brief Append the necessary characters to a reported properties JSON payload belonging to a
* component.
*
* The payload will be of the form:
*
* @code
* "reported": {
* "<pucComponentName>": {
* "__t": "c",
* "temperature": 23
* }
* }
* @endcode
*
* @note This API only builds the metadata for a component's properties. The
* application itself must specify the payload contents between calls
* to this API and AzureIoTHubClientProperties_BuilderEndComponent() using
* \p pxJSONWriter to specify the JSON payload.
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONWriter The #AzureIoTJSONWriter_t to append the necessary characters for an IoT
* Plug and Play component.
* @param[in] pucComponentName The component name associated with the reported properties.
* @param[in] usComponentNameLength The length of \p pucComponentName.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONWriter must not be `NULL`.
* @pre \p pucComponentName must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The JSON payload was prefixed successfully.
*/
AzureIoTResult_t AzureIoTHubClientProperties_BuilderBeginComponent( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONWriter_t * pxJSONWriter,
const uint8_t * pucComponentName,
uint16_t usComponentNameLength );
/**
* @brief Append the necessary characters to end a reported properties JSON payload belonging to a
* component.
*
* @note This API should be used in conjunction with
* AzureIoTHubClientProperties_BuilderBeginComponent().
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONWriter The #AzureIoTJSONWriter_t to append the necessary characters for an IoT
* Plug and Play component.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONWriter must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The JSON payload was suffixed successfully.
*/
AzureIoTResult_t AzureIoTHubClientProperties_BuilderEndComponent( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONWriter_t * pxJSONWriter );
/**
* @brief Begin a property response to a writable property request from the service.
*
* This API should be used in response to an incoming writable properties. More details can be
* found here:
*
* https://docs.microsoft.com/en-us/azure/iot-pnp/concepts-convention#writable-properties
*
* The payload will be of the form:
*
* **Without component**
* @code
* {
* "<pucPropertyName>":{
* "ac": <lAckCode>,
* "av": <lAckVersion>,
* "ad": "<pucAckDescription>",
* "value": <user_value>
* }
* }
* @endcode
*
* **With component**
* @code
* {
* "<pucComponentName>": {
* "__t": "c",
* "<pucPropertyName>": {
* "ac": <lAckCode>,
* "av": <lAckVersion>,
* "ad": "<pucAckDescription>",
* "value": <user_value>
* }
* }
* }
* @endcode
*
* To send a status for properties belonging to a component, first call the
* AzureIoTHubClientProperties_BuilderBeginComponent() API to prefix the payload with the
* necessary identification. The API call flow would look like the following with the listed JSON
* payload being generated.
*
* @code
* AzureIoTHubClientProperties_BuilderBeginComponent()
* AzureIoTHubClientProperties_BuilderBeginResponseStatus()
* // Append user value here (<user_value>) using pxJSONWriter directly.
* AzureIoTHubClientProperties_BuilderEndResponseStatus()
* AzureIoTHubClientProperties_BuilderEndComponent()
* @endcode
*
* @note This API only builds the metadata for the properties response. The
* application itself must specify the payload contents between calls
* to this API and AzureIoTHubClientProperties_BuilderEndResponseStatus() using
* \p pxJSONWriter to specify the JSON payload.
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONWriter The initialized #AzureIoTJSONWriter_t to append data to.
* @param[in] pucPropertyName The name of the property to build a response payload for.
* @param[in] usPropertyNameLength The length of \p pucPropertyName.
* @param[in] lAckCode The HTTP-like status code to respond with. See #AzureIoTHubMessageStatus_t for
* possible supported values.
* @param[in] lAckVersion The version of the property the application is acknowledging.
* This can be retrieved from the service request by
* calling az_iot_hub_client_properties_get_properties_version.
* @param[in] pucAckDescription An optional description detailing the context or any details about
* the acknowledgement. This can be `NULL`.
* @param[in] usAckDescriptionLength The length of \p pucAckDescription.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONWriter must not be `NULL`.
* @pre \p pucPropertyName must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The JSON payload was prefixed successfully.
*/
AzureIoTResult_t AzureIoTHubClientProperties_BuilderBeginResponseStatus( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONWriter_t * pxJSONWriter,
const uint8_t * pucPropertyName,
uint16_t usPropertyNameLength,
int32_t lAckCode,
int32_t lAckVersion,
const uint8_t * pucAckDescription,
uint16_t usAckDescriptionLength );
/**
* @brief End a properties response payload with confirmation status.
*
* @note This API should be used in conjunction with
* AzureIoTHubClientProperties_BuilderBeginResponseStatus().
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONWriter The initialized #AzureIoTJSONWriter_t to append data to.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONWriter must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess The JSON payload was suffixed successfully.
*/
AzureIoTResult_t AzureIoTHubClientProperties_BuilderEndResponseStatus( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONWriter_t * pxJSONWriter );
/**
* @brief Read the Azure IoT Plug and Play property version.
*
* @warning This modifies the state of the json reader. To then use the same json reader
* with AzureIoTHubClientProperties_GetNextComponentProperty(), you must call
* AzureIoTJSONReader_Init() again after this call and before the call to
* AzureIoTHubClientProperties_GetNextComponentProperty() or make an additional copy before
* calling this API.
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONReader The pointer to the #AzureIoTJSONReader_t used to parse through the JSON
* payload.
* @param[in] xResponseType The #AzureIoTHubMessageType_t representing the message
* type associated with the payload.
* @param[out] pulVersion The numeric version of the properties in the JSON payload.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONReader must not be `NULL`.
* @pre \p xResponseType must be #eAzureIoTHubPropertiesRequestedMessage or #eAzureIoTHubPropertiesWritablePropertyMessage.
* @pre \p pulVersion must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess If the function returned a valid version.
*/
AzureIoTResult_t AzureIoTHubClientProperties_GetPropertiesVersion( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONReader_t * pxJSONReader,
AzureIoTHubMessageType_t xResponseType,
uint32_t * pulVersion );
/**
* @brief Property type
*
*/
typedef enum AzureIoTHubClientPropertyType_t
{
/** @brief Property was originally reported from the device. */
eAzureIoTHubClientReportedFromDevice = AZ_IOT_HUB_CLIENT_PROPERTY_REPORTED_FROM_DEVICE,
/** @brief Property was received from the service. */
eAzureIoTHubClientPropertyWritable = AZ_IOT_HUB_CLIENT_PROPERTY_WRITABLE
} AzureIoTHubClientPropertyType_t;
/**
* @brief Iteratively read the Azure IoT Plug and Play component properties.
*
* @note If you are creating a multi-component application, component names must first be registered
* via the `pxHubClientOptions->pxComponentList` and `pxHubClientOptions->ulComponentListLength` in
* AzureIoTHubClient_Init().
*
* Note that between calls, the uint8_t* pointed to by \p ppucComponentName shall not be modified,
* only checked and compared. Internally, the pointer is only changed if the component name changes
* in the JSON document and is not necessarily set every invocation of the function.
*
* On success, the `pxJSONReader` will be set on a valid property name. After checking the
* property name, the reader can be advanced to the property value by calling
* AzureIoTJSONReader_NextToken(). Note that on the subsequent call to this API, it is expected that
* the json reader will be placed AFTER the read property name and value. That means that after
* reading the property value (including single values or complex objects), the user must call
* AzureIoTJSONReader_NextToken().
*
* Below is a code snippet which you can use as a starting point:
*
* @code
*
* while (az_result_succeeded(AzureIoTHubClientProperties_GetNextComponentProperty(
* &xHubClient, &jr, xResponseType, AZ_IOT_HUB_CLIENT_PROPERTY_WRITABLE, &pucComponentName, &pusComponentNameLength)))
* {
* // Check if property is of interest (substitute user_property for your own property name)
* if (AzureIoTJSONReader_TokenIsTextEqual(&jr, user_property, user_property_length))
* {
* AzureIoTJSONReader_NextToken(&jr);
*
* // Get the property value here
* // Example: AzureIoTJSONReader_GetTokenInt32(&jr.token, &user_int);
*
* // Skip to next property value
* AzureIoTJSONReader_NextToken(&jr);
* }
* else
* {
* // The JSON reader must be advanced regardless of whether the property
* // is of interest or not.
* AzureIoTJSONReader_NextToken(&jr);
*
* // Skip children in case the property value is an object
* AzureIoTJSONReader_SkipChildren(&jr);
* AzureIoTJSONReader_NextToken(&jr);
* }
* }
*
* @endcode
*
* @warning If you need to retrieve more than one \p xPropertyType, you should first complete the
* scan of all components for the first property type (until the API returns
* eAzureIoTErrorEndOfProperties). Then you must call AzureIoTJSONReader_Init() again after this call
* and before the next call to `AzureIoTHubClientProperties_GetNextComponentProperty` with the
* different \p xPropertyType.
*
* @param[in] pxAzureIoTHubClient The #AzureIoTHubClient_t to use for this call.
* @param[in,out] pxJSONReader The #AzureIoTJSONReader_t to parse through. The ownership of iterating
* through this json reader is shared between the user and this API.
* @param[in] xResponseType The #AzureIoTHubMessageType_t representing the message
* type associated with the payload.
* @param[in] xPropertyType The #AzureIoTHubClientPropertyType_t to scan for.
* @param[out] ppucComponentName The output component name for the property returned.
* @param[out] pulComponentNameLength The length of the output \p ppucComponentName.
*
* @pre \p pxAzureIoTHubClient must not be `NULL`.
* @pre \p pxJSONReader must not be `NULL`.
* @pre \p xResponseType must be #eAzureIoTHubPropertiesRequestedMessage or #eAzureIoTHubPropertiesWritablePropertyMessage.
* If eAzureIoTHubClientReportedFromDevice is specified in \p xPropertyType,
* then \p xResponseType must be #eAzureIoTHubPropertiesRequestedMessage.
* @pre \p ppucComponentName must not be `NULL`.
*
* @return An #AzureIoTResult_t value indicating the result of the operation.
* @retval eAzureIoTSuccess If the function returned a valid #AzureIoTJSONReader_t pointing to the property name and
* the component name.
* @retval eAzureIoTErrorFailed If the json reader is passed in at an unexpected location.
* @retval eAzureIoTErrorEndOfProperties If there are no more properties left for the component.
*/
AzureIoTResult_t AzureIoTHubClientProperties_GetNextComponentProperty( AzureIoTHubClient_t * pxAzureIoTHubClient,
AzureIoTJSONReader_t * pxJSONReader,
AzureIoTHubMessageType_t xResponseType,
AzureIoTHubClientPropertyType_t xPropertyType,
const uint8_t ** ppucComponentName,
uint32_t * pulComponentNameLength );
#include "azure/core/_az_cfg_suffix.h"
#endif /*AZURE_IOT_HUB_CLIENT_PROPERTIES_H */