9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
379 lines
12 KiB
C
379 lines
12 KiB
C
/*
|
|
* Copyright (C) 2015-2018 Alibaba Group Holding Limited
|
|
*/
|
|
|
|
#ifndef _IOT_EXPORT_MQTT_H_
|
|
#define _IOT_EXPORT_MQTT_H_
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#include "infra_types.h"
|
|
#include "infra_defs.h"
|
|
|
|
#define MUTLI_SUBSCIRBE_MAX (5)
|
|
|
|
/* From mqtt_client.h */
|
|
typedef enum
|
|
{
|
|
IOTX_MQTT_QOS0 = 0,
|
|
IOTX_MQTT_QOS1,
|
|
IOTX_MQTT_QOS2,
|
|
IOTX_MQTT_QOS3_SUB_LOCAL
|
|
} iotx_mqtt_qos_t;
|
|
|
|
typedef enum
|
|
{
|
|
|
|
/* Undefined event */
|
|
IOTX_MQTT_EVENT_UNDEF = 0,
|
|
|
|
/* MQTT disconnect event */
|
|
IOTX_MQTT_EVENT_DISCONNECT = 1,
|
|
|
|
/* MQTT reconnect event */
|
|
IOTX_MQTT_EVENT_RECONNECT = 2,
|
|
|
|
/* A ACK to the specific subscribe which specify by packet-id be received */
|
|
IOTX_MQTT_EVENT_SUBCRIBE_SUCCESS = 3,
|
|
|
|
/* No ACK to the specific subscribe which specify by packet-id be received in timeout period */
|
|
IOTX_MQTT_EVENT_SUBCRIBE_TIMEOUT = 4,
|
|
|
|
/* A failed ACK to the specific subscribe which specify by packet-id be received*/
|
|
IOTX_MQTT_EVENT_SUBCRIBE_NACK = 5,
|
|
|
|
/* A ACK to the specific unsubscribe which specify by packet-id be received */
|
|
IOTX_MQTT_EVENT_UNSUBCRIBE_SUCCESS = 6,
|
|
|
|
/* No ACK to the specific unsubscribe which specify by packet-id be received in timeout period */
|
|
IOTX_MQTT_EVENT_UNSUBCRIBE_TIMEOUT = 7,
|
|
|
|
/* A failed ACK to the specific unsubscribe which specify by packet-id be received*/
|
|
IOTX_MQTT_EVENT_UNSUBCRIBE_NACK = 8,
|
|
|
|
/* A ACK to the specific publish which specify by packet-id be received */
|
|
IOTX_MQTT_EVENT_PUBLISH_SUCCESS = 9,
|
|
|
|
/* No ACK to the specific publish which specify by packet-id be received in timeout period */
|
|
IOTX_MQTT_EVENT_PUBLISH_TIMEOUT = 10,
|
|
|
|
/* A failed ACK to the specific publish which specify by packet-id be received*/
|
|
IOTX_MQTT_EVENT_PUBLISH_NACK = 11,
|
|
|
|
/* MQTT packet published from MQTT remote broker be received */
|
|
IOTX_MQTT_EVENT_PUBLISH_RECEIVED = 12,
|
|
|
|
/* MQTT packet buffer overflow which the remaining space less than to receive byte */
|
|
IOTX_MQTT_EVENT_BUFFER_OVERFLOW = 13,
|
|
} iotx_mqtt_event_type_t;
|
|
|
|
/* topic information */
|
|
typedef struct
|
|
{
|
|
uint16_t packet_id;
|
|
uint8_t qos;
|
|
uint8_t dup;
|
|
uint8_t retain;
|
|
uint16_t topic_len;
|
|
uint32_t payload_len;
|
|
const char *ptopic;
|
|
const char *payload;
|
|
} iotx_mqtt_topic_info_t, *iotx_mqtt_topic_info_pt;
|
|
|
|
typedef struct
|
|
{
|
|
|
|
/* Specify the event type */
|
|
iotx_mqtt_event_type_t event_type;
|
|
|
|
/*
|
|
* Specify the detail event information. @msg means different to different event types:
|
|
*
|
|
* 1) IOTX_MQTT_EVENT_UNKNOWN,
|
|
* IOTX_MQTT_EVENT_DISCONNECT,
|
|
* IOTX_MQTT_EVENT_RECONNECT :
|
|
* Its data type is string and the value is detail information.
|
|
*
|
|
* 2) IOTX_MQTT_EVENT_SUBCRIBE_SUCCESS,
|
|
* IOTX_MQTT_EVENT_SUBCRIBE_TIMEOUT,
|
|
* IOTX_MQTT_EVENT_SUBCRIBE_NACK,
|
|
* IOTX_MQTT_EVENT_UNSUBCRIBE_SUCCESS,
|
|
* IOTX_MQTT_EVENT_UNSUBCRIBE_TIMEOUT,
|
|
* IOTX_MQTT_EVENT_UNSUBCRIBE_NACK
|
|
* IOTX_MQTT_EVENT_PUBLISH_SUCCESS,
|
|
* IOTX_MQTT_EVENT_PUBLISH_TIMEOUT,
|
|
* IOTX_MQTT_EVENT_PUBLISH_NACK :
|
|
* Its data type is @uint32_t and the value is MQTT packet identifier.
|
|
*
|
|
* 3) IOTX_MQTT_EVENT_PUBLISH_RECEIVED:
|
|
* Its data type is @iotx_mqtt_topic_info_pt and see detail at the declare of this type.
|
|
*
|
|
* */
|
|
void *msg;
|
|
} iotx_mqtt_event_msg_t, *iotx_mqtt_event_msg_pt;
|
|
|
|
/**
|
|
* @brief It define a datatype of function pointer.
|
|
* This type of function will be called when a related event occur.
|
|
*
|
|
* @param pcontext : The program context.
|
|
* @param pclient : The MQTT client.
|
|
* @param msg : The event message.
|
|
*
|
|
* @return none
|
|
*/
|
|
typedef void (*iotx_mqtt_event_handle_func_fpt)(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg);
|
|
|
|
/* The structure of MQTT event handle */
|
|
typedef struct
|
|
{
|
|
iotx_mqtt_event_handle_func_fpt h_fp;
|
|
void *pcontext;
|
|
} iotx_mqtt_event_handle_t, *iotx_mqtt_event_handle_pt;
|
|
|
|
/* The structure of MQTT initial parameter */
|
|
typedef struct
|
|
{
|
|
|
|
uint16_t port; /* Specify MQTT broker port */
|
|
const char *host; /* Specify MQTT broker host */
|
|
const char *client_id; /* Specify MQTT connection client id*/
|
|
const char *username; /* Specify MQTT user name */
|
|
const char *password; /* Specify MQTT password */
|
|
const char *customize_info; /* Specify User custom information */
|
|
/* Specify MQTT transport channel and key.
|
|
* If the value is NULL, it means that use TCP channel,
|
|
* If the value is NOT NULL, it means that use SSL/TLS channel and
|
|
* @pub_key point to the CA certification */
|
|
|
|
const char *pub_key;
|
|
|
|
uint8_t clean_session; /* Specify MQTT clean session or not*/
|
|
uint32_t request_timeout_ms; /* Specify timeout of a MQTT request in millisecond */
|
|
uint32_t keepalive_interval_ms; /* Specify MQTT keep-alive interval in millisecond */
|
|
uint32_t write_buf_size; /* Specify size of write-buffer in byte */
|
|
uint32_t read_buf_size; /* Specify size of read-buffer in byte */
|
|
|
|
iotx_mqtt_event_handle_t handle_event; /* Specify MQTT event handle */
|
|
|
|
} iotx_mqtt_param_t, *iotx_mqtt_param_pt;
|
|
|
|
typedef enum
|
|
{
|
|
IOTX_MQTT_SOC_CONNECTED,
|
|
IOTX_MQTT_SOC_CLOSE,
|
|
IOTX_MQTT_SOC_READ,
|
|
IOTX_MQTT_SOC_WRITE,
|
|
IOTX_MQTT_SOC_MAX
|
|
} iotx_mqtt_nwk_event_t;
|
|
|
|
typedef struct
|
|
{
|
|
uintptr_t fd;
|
|
} iotx_mqtt_nwk_param_t;
|
|
|
|
/** @defgroup group_api api
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup group_api_mqtt mqtt
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Construct the MQTT client
|
|
* This function initialize the data structures, establish MQTT connection.
|
|
*
|
|
* @param [in] pInitParams: specify the MQTT client parameter.
|
|
*
|
|
* @retval NULL : Construct failed.
|
|
* @retval NOT_NULL : The handle of MQTT client.
|
|
* @see None.
|
|
*/
|
|
void *IOT_MQTT_Construct(iotx_mqtt_param_t *pInitParams);
|
|
|
|
/**
|
|
* @brief Deconstruct the MQTT client
|
|
* This function disconnect MQTT connection and release the related resource.
|
|
*
|
|
* @param [in] phandle: pointer of handle, specify the MQTT client.
|
|
*
|
|
* @retval 0 : Deconstruct success.
|
|
* @retval -1 : Deconstruct failed.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Destroy(void **phandle);
|
|
|
|
/**
|
|
* @brief Handle MQTT packet from remote server and process timeout request
|
|
* which include the MQTT subscribe, unsubscribe, publish(QOS >= 1), reconnect, etc..
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] timeout_ms: specify the timeout in millisecond in this loop.
|
|
*
|
|
* @return status.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Yield(void *handle, int timeout_ms);
|
|
|
|
/**
|
|
* @brief check whether MQTT connection is established or not.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
*
|
|
* @retval true : MQTT in normal state.
|
|
* @retval false : MQTT in abnormal state.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_CheckStateNormal(void *handle);
|
|
|
|
/**
|
|
* @brief Subscribe MQTT topic.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] topic_filter: specify the topic filter.
|
|
* @param [in] qos: specify the MQTT Requested QoS.
|
|
* @param [in] topic_handle_func: specify the topic handle callback-function.
|
|
* @param [in] pcontext: specify context. When call 'topic_handle_func', it will be passed back.
|
|
*
|
|
* @retval -1 : Subscribe failed.
|
|
* @retval >=0 : Subscribe successful.
|
|
The value is a unique ID of this request.
|
|
The ID will be passed back when callback 'iotx_mqtt_param_t:handle_event'.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Subscribe(void *handle,
|
|
const char *topic_filter,
|
|
iotx_mqtt_qos_t qos,
|
|
iotx_mqtt_event_handle_func_fpt topic_handle_func,
|
|
void *pcontext);
|
|
|
|
/**
|
|
* @brief Subscribe MQTT topic and wait suback.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] topic_filter: specify the topic filter.
|
|
* @param [in] qos: specify the MQTT Requested QoS.
|
|
* @param [in] topic_handle_func: specify the topic handle callback-function.
|
|
* @param [in] pcontext: specify context. When call 'topic_handle_func', it will be passed back.
|
|
* @param [in] timeout_ms: time in ms to wait.
|
|
*
|
|
* @retval -1 : Subscribe failed.
|
|
* @retval >=0 : Subscribe successful.
|
|
The value is a unique ID of this request.
|
|
The ID will be passed back when callback 'iotx_mqtt_param_t:handle_event'.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Subscribe_Sync(void *handle,
|
|
const char *topic_filter,
|
|
iotx_mqtt_qos_t qos,
|
|
iotx_mqtt_event_handle_func_fpt topic_handle_func,
|
|
void *pcontext,
|
|
int timeout_ms);
|
|
|
|
/**
|
|
* @brief Unsubscribe MQTT topic.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] topic_filter: specify the topic filter.
|
|
*
|
|
* @retval -1 : Unsubscribe failed.
|
|
* @retval >=0 : Unsubscribe successful.
|
|
The value is a unique ID of this request.
|
|
The ID will be passed back when callback 'iotx_mqtt_param_t:handle_event'.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Unsubscribe(void *handle, const char *topic_filter);
|
|
|
|
/**
|
|
* @brief Publish message to specific topic.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] topic_name: specify the topic name.
|
|
* @param [in] topic_msg: specify the topic message.
|
|
*
|
|
* @retval -1 : Publish failed.
|
|
* @retval 0 : Publish successful, where QoS is 0.
|
|
* @retval >0 : Publish successful, where QoS is >= 0.
|
|
The value is a unique ID of this request.
|
|
The ID will be passed back when callback 'iotx_mqtt_param_t:handle_event'.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Publish(void *handle, const char *topic_name, iotx_mqtt_topic_info_pt topic_msg);
|
|
/**
|
|
* @brief Publish message to specific topic.
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] topic_name: specify the topic name.
|
|
* @param [in] qos: specify the MQTT Requested QoS.
|
|
* @param [in] data: specify the topic message payload.
|
|
* @param [in] len: specify the topic message payload len.
|
|
*
|
|
* @retval -1 : Publish failed.
|
|
* @retval 0 : Publish successful, where QoS is 0.
|
|
* @retval >0 : Publish successful, where QoS is >= 0.
|
|
The value is a unique ID of this request.
|
|
The ID will be passed back when callback 'iotx_mqtt_param_t:handle_event'.
|
|
* @see None.
|
|
*/
|
|
int IOT_MQTT_Publish_Simple(void *handle, const char *topic_name, int qos, void *data, int len);
|
|
/* From mqtt_client.h */
|
|
/** @} */ /* end of api_mqtt */
|
|
|
|
/** @} */ /* end of api */
|
|
|
|
/**
|
|
* @brief Only used in async network stack and FEATURE_ASYNC_PROTOCOL_STACK must be selected
|
|
*
|
|
* @param [in] handle: specify the MQTT client.
|
|
* @param [in] event: specify the network event.
|
|
* @param [in] param: specify the network params.
|
|
*
|
|
* @retval -1 : Handle failed.
|
|
* @retval 0 : Handle successful.
|
|
*
|
|
*/
|
|
int IOT_MQTT_Nwk_Event_Handler(void *handle, iotx_mqtt_nwk_event_t event, iotx_mqtt_nwk_param_t *param);
|
|
|
|
/* MQTT Configurations
|
|
*
|
|
* These switches will affect mqtt_api.c and IOT_MQTT_XXX() functions' behaviour
|
|
*
|
|
*/
|
|
|
|
/* Default message length in bytes when PLATFORM_HAS_DYNMEM is not set */
|
|
#define CONFIG_MQTT_MESSAGE_MAXLEN (3072)
|
|
|
|
/* Default maximum length of topic name in byte when PLATFORM_HAS_DYNMEM is not set */
|
|
#ifdef PLATFORM_HAS_DYNMEM
|
|
#define CONFIG_MQTT_TOPIC_MAXLEN (128)
|
|
#else
|
|
#define CONFIG_MQTT_TOPIC_MAXLEN (128)
|
|
#endif
|
|
|
|
/* Default keepalive interval of MQTT request in second */
|
|
#define CONFIG_MQTT_KEEPALIVE_INTERVAL (60)
|
|
|
|
/* Default timeout interval of MQTT request in millisecond */
|
|
#define CONFIG_MQTT_REQUEST_TIMEOUT (5000)
|
|
|
|
/* Minimum timeout interval of MQTT request in millisecond */
|
|
#define CONFIG_MQTT_REQ_TIMEOUT_MIN (1000)
|
|
|
|
/* Maximum timeout interval of MQTT request in millisecond */
|
|
#define CONFIG_MQTT_REQ_TIMEOUT_MAX (10000)
|
|
|
|
/* Minimum keepalive interval of MQTT request in second */
|
|
#define CONFIG_MQTT_KEEPALIVE_INTERVAL_MIN (30)
|
|
|
|
/* Maximum keepalive interval of MQTT request in second */
|
|
#define CONFIG_MQTT_KEEPALIVE_INTERVAL_MAX (120)
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
#endif
|