first commit for opensource

first commit for opensource
This commit is contained in:
supowang
2019-09-16 13:19:50 +08:00
parent 08ab013b8e
commit edb2879617
6303 changed files with 5472815 additions and 23 deletions

View File

@@ -0,0 +1,310 @@
#ifndef _QCLOUD_MQTT_COMMON_H_
#define _QCLOUD_MQTT_COMMON_H_
typedef enum mqtt_version_en {
MQTT_VERSION_3_1_1 = 4,
} mqtt_version_t;
typedef enum mqtt_clean_session_state_en {
MQTT_CLEAN_SESSION_STATE_DISABLED = 0,
MQTT_CLEAN_SESSION_STATE_ENABLED = 1,
} mqtt_clean_session_state_t;
typedef enum mqtt_quality_of_service_en {
MQTT_QOS0 = 0, // 至多分发一次
MQTT_QOS1 = 1, // 至少分发一次, 消息的接收者需回复PUBACK报文
MQTT_QOS2 = 2, // 仅分发一次, 目前腾讯物联云不支持该等级
} mqtt_qos_t;
typedef enum mqtt_packet_suback_return_code_en {
MQTT_PACKET_SUBACK_RC_QOS0 = 0x00,
MQTT_PACKET_SUBACK_RC_QOS1 = 0x01,
MQTT_PACKET_SUBACK_RC_QOS2 = 0x02,
MQTT_PACKET_SUBACK_RC_FAILURE = 0x80,
} mqtt_packet_suback_rc_t;
typedef enum mqtt_packet_type_en {
MQTT_PACKET_TYPE_RESERVED = 0, // Reserved
MQTT_PACKET_TYPE_CONNECT = 1, // Client request to connect to Server
MQTT_PACKET_TYPE_CONNACK = 2, // Connect Acknowledgment
MQTT_PACKET_TYPE_PUBLISH = 3, // Publish message
MQTT_PACKET_TYPE_PUBACK = 4, // Publish Acknowledgment
MQTT_PACKET_TYPE_PUBREC = 5, // Publish Received
MQTT_PACKET_TYPE_PUBREL = 6, // Publish Release
MQTT_PACKET_TYPE_PUBCOMP = 7, // Publish Complete
MQTT_PACKET_TYPE_SUBSCRIBE = 8, // Client Subscribe request
MQTT_PACKET_TYPE_SUBACK = 9, // Subscribe Acknowledgment
MQTT_PACKET_TYPE_UNSUBSCRIBE = 10, // Client Unsubscribe request
MQTT_PACKET_TYPE_UNSUBACK = 11, // Unsubscribe Acknowledgment
MQTT_PACKET_TYPE_PINGREQ = 12, // PING Request
MQTT_PACKET_TYPE_PINGRESP = 13, // PING Response
MQTT_PACKET_TYPE_DISCONNECT = 14, // Client is Disconnecting
} mqtt_packet_t;
/**
* Bitfields for the MQTT header byte.
*/
typedef union mqtt_header_un {
uint8_t byte; /**< the whole byte */
#if defined(REVERSED)
struct {
unsigned int type : 4; /**< message type nibble */
unsigned int dup : 1; /**< DUP flag bit */
unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */
unsigned int retain : 1; /**< retained flag bit */
} bits;
#else
struct {
unsigned int retain : 1; /**< retained flag bit */
unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */
unsigned int dup : 1; /**< DUP flag bit */
unsigned int type : 4; /**< message type nibble */
} bits;
#endif
} mqtt_header_t;
typedef union mqtt_connect_flags_un {
uint8_t all; /**< all connect flags */
#if defined(REVERSED)
struct {
unsigned int username : 1; /**< 3.1 user name */
unsigned int password : 1; /**< 3.1 password */
unsigned int willRetain : 1; /**< will retain setting */
unsigned int willQoS : 2; /**< will QoS value */
unsigned int will : 1; /**< will flag */
unsigned int cleansession : 1; /**< clean session flag */
unsigned int : 1; /**< unused */
} bits;
#else
struct {
unsigned int : 1; /**< unused */
unsigned int cleansession : 1; /**< cleansession flag */
unsigned int will : 1; /**< will flag */
unsigned int willQoS : 2; /**< will QoS value */
unsigned int willRetain : 1; /**< will retain setting */
unsigned int password : 1; /**< 3.1 password */
unsigned int username : 1; /**< 3.1 user name */
} bits;
#endif
} mqtt_connect_flag_t; /**< connect flags byte */
typedef union mqtt_connack_flags_un {
uint8_t all; /**< all connack flags */
#if defined(REVERSED)
struct {
unsigned int reserved : 7; /**< unused */
unsigned int sessionpresent : 1; /**< session present flag */
} bits;
#else
struct {
unsigned int sessionpresent : 1; /**< session present flag */
unsigned int reserved: 7; /**< unused */
} bits;
#endif
} mqtt_connack_flags_t; /**< connack flags byte */
/**
* connect return code
*/
typedef enum mqtt_connack_return_code_en {
MQTT_CONNACK_CONNECTION_ACCEPTED = 0, // connection accepted
MQTT_CONANCK_UNACCEPTABLE_PROTOCOL_VERSION_ERROR = 1, // connection refused: unaccpeted protocol verison
MQTT_CONNACK_IDENTIFIER_REJECTED_ERROR = 2, // connection refused: identifier rejected
MQTT_CONNACK_SERVER_UNAVAILABLE_ERROR = 3, // connection refused: server unavailable
MQTT_CONNACK_BAD_USERDATA_ERROR = 4, // connection refused: bad user name or password
MQTT_CONNACK_NOT_AUTHORIZED_ERROR = 5 // connection refused: not authorized
} mqtt_connack_rc_t;
typedef struct mqtt_connect_option_st {
/* The eyecatcher for this structure. must be MQTC. */
char struct_id[4];
/* The version number of this structure. Must be 0 */
int struct_version;
/* Version of MQTT to be used. 3 = 3.1 4 = 3.1.1
*/
mqtt_version_t mqtt_version;
char client_id[QCLOUD_MQTT_DEVICE_CLIENT_ID_MAX + 1];
uint16_t keep_alive_interval;
mqtt_clean_session_state_t clean_session;
char username[QCLOUD_DEVICE_USERNAME_MAX + 1];
size_t username_len;
char password[QCLOUD_DEVICE_PASSWORD_MAX + 1];
size_t password_len;
} mqtt_connect_opt_t;
/**
* @brief 发布或接收已订阅消息的结构体定义
*/
typedef struct mqtt_publish_option_st {
mqtt_qos_t qos; // MQTT 服务质量等级
uint8_t retained; // RETAIN 标识位
uint8_t dup; // DUP 标识位
uint16_t id; // MQTT 消息标识符
const char *topic; // MQTT topic
size_t topic_len; // topic 长度
void *payload; // MQTT 消息负载
size_t payload_len; // MQTT 消息负载长度
} mqtt_publish_opt_t;
typedef mqtt_publish_opt_t mqtt_incoming_msg_t;
/**
* @brief MQTT PUBLISH 消息回调处理函数指针定义
*/
typedef void (*mqtt_message_handler_fn_t)(void *client, mqtt_incoming_msg_t *message, void *private_data);
/**
* @brief 订阅主题的结构体定义
*/
typedef struct mqtt_subscribe_option_st {
mqtt_qos_t qos; // 服务质量等级, 目前支持QOS0和QOS1
mqtt_message_handler_fn_t message_handler; // 接收已订阅消息的回调函数
void *private_data; // 用户数据, 通过callback返回
} mqtt_subscribe_opt_t;
typedef enum mqtt_event_type_en {
/* 未定义事件 */
MQTT_EVENT_UNDEF = 0,
/* MQTT 断开连接 */
MQTT_EVENT_DISCONNECT = 1,
/* MQTT 重连 */
MQTT_EVENT_RECONNECT = 2,
/* 订阅成功 */
MQTT_EVENT_SUBCRIBE_SUCCESS = 3,
/* 订阅超时 */
MQTT_EVENT_SUBCRIBE_TIMEOUT = 4,
/* 订阅失败 */
MQTT_EVENT_SUBCRIBE_NACK = 5,
/* 取消订阅成功 */
MQTT_EVENT_UNSUBCRIBE_SUCCESS = 6,
/* 取消订阅超时 */
MQTT_EVENT_UNSUBCRIBE_TIMEOUT = 7,
/* 取消订阅失败 */
MQTT_EVENT_UNSUBCRIBE_NACK = 8,
/* 发布成功 */
MQTT_EVENT_PUBLISH_SUCCESS = 9,
/* 发布超时 */
MQTT_EVENT_PUBLISH_TIMEOUT = 10,
/* 发布失败 */
MQTT_EVENT_PUBLISH_NACK = 11,
/* SDK订阅的topic收到后台push消息 */
MQTT_EVENT_PUBLISH_RECVEIVED = 12,
} mqtt_event_type_t;
typedef struct mqtt_event_st {
/* 事件类型 */
mqtt_event_type_t type;
void *message;
} mqtt_event_t;
typedef void (*mqtt_event_handler_fn_t)(void *client, void *context, mqtt_event_t *event);
/* The structure of MQTT event handle */
typedef struct mqtt_event_handler_st {
mqtt_event_handler_fn_t handler;
void *context;
} mqtt_event_handler_t;
__QCLOUD_INTERNAL__ int mqtt_common_packet_encode(uint8_t *buf, int length);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_deserialize_ack_packet(uint8_t *packet_type,
uint8_t *dup,
uint16_t *packet_id,
uint8_t *buf,
size_t buf_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_deserialize_suback_packet(uint16_t *packet_id,
uint32_t max_count,
uint32_t *count,
int granted_qoss[],
uint8_t *buf,
size_t buf_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_deserialize_unsuback_packet(uint16_t *packet_id,
uint8_t *buf,
size_t buf_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_connect_packet(uint8_t *buf,
size_t buf_len,
mqtt_connect_opt_t *connect_opt,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_deserialize_connack_packet(uint8_t *session_present,
uint8_t *connack_rc,
uint8_t *buf,
size_t buf_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_zero_payload_packet(uint8_t *buf,
size_t buf_len,
mqtt_packet_t packet_type,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_deserialize_publish_packet(uint8_t *dup, int *qos,
uint8_t *retained, uint16_t *packet_id,
char **topic, uint16_t *topic_len,
uint8_t **payload, size_t *payload_len,
uint8_t *buf, size_t buf_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_puback_packet(uint8_t *buf,
size_t buf_len,
uint16_t packet_id,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_pubrel_packet(uint8_t *buf,
size_t buf_len,
uint8_t dup,
uint16_t packet_id,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_pubrec_packet(uint8_t *buf,
size_t buf_len,
uint16_t packet_id,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_publish_packet(uint8_t *buf,
size_t buf_len,
uint8_t dup,
int qos,
uint8_t retained,
uint16_t packet_id,
char *topic,
uint8_t *payload,
size_t payload_len,
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_subscribe_packet(uint8_t *buf,
size_t buf_len,
uint8_t dup,
uint16_t packet_id,
uint32_t count,
char *topic_filters[],
int requested_qoss[],
uint32_t *serialized_len);
__QCLOUD_INTERNAL__ qcloud_err_t mqtt_common_serialize_unsubscribe_packet(uint8_t *buf, size_t buf_len,
uint8_t dup, uint16_t packet_id,
uint32_t count, char *topic_filters[],
uint32_t *serialized_len);
#endif