123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- * @Author: jiejie
- * @Github: https://github.com/jiejieTop
- * @Date: 2019-12-09 21:31:25
- * @LastEditTime : 2022-06-11 22:45:02
- * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
- */
- #ifndef _MQTTCLIENT_H_
- #define _MQTTCLIENT_H_
- #include <stdio.h>
- #include <stdint.h>
- #include <string.h>
- #include "MQTTPacket.h"
- #include "mqtt_list.h"
- #include "platform_timer.h"
- #include "platform_memory.h"
- #include "platform_mutex.h"
- #include "platform_thread.h"
- #include "mqtt_defconfig.h"
- #include "network.h"
- #include "random.h"
- #include "mqtt_error.h"
- #include "mqtt_log.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef enum mqtt_qos {
- QOS0 = 0,
- QOS1 = 1,
- QOS2 = 2,
- SUBFAIL = 0x80
- } mqtt_qos_t;
- typedef enum client_state {
- CLIENT_STATE_INVALID = -1,
- CLIENT_STATE_INITIALIZED = 0,
- CLIENT_STATE_CONNECTED = 1,
- CLIENT_STATE_DISCONNECTED = 2,
- CLIENT_STATE_CLEAN_SESSION = 3
- }client_state_t;
- typedef struct mqtt_connack_data {
- uint8_t rc;
- uint8_t session_present;
- } mqtt_connack_data_t;
- typedef struct mqtt_message {
- mqtt_qos_t qos;
- uint8_t retained;
- uint8_t dup;
- uint16_t id;
- size_t payloadlen;
- void *payload;
- } mqtt_message_t;
- typedef struct message_data {
- char topic_name[MQTT_TOPIC_LEN_MAX];
- mqtt_message_t *message;
- } message_data_t;
- typedef void (*interceptor_handler_t)(void* client, message_data_t* msg);
- typedef void (*message_handler_t)(void* client, message_data_t* msg);
- typedef void (*reconnect_handler_t)(void* client, void* reconnect_date);
- typedef struct message_handlers {
- mqtt_list_t list;
- mqtt_qos_t qos;
- const char* topic_filter;
- message_handler_t handler;
- } message_handlers_t;
- typedef struct ack_handlers {
- mqtt_list_t list;
- platform_timer_t timer;
- uint32_t type;
- uint16_t packet_id;
- message_handlers_t *handler;
- uint16_t payload_len;
- uint8_t *payload;
- } ack_handlers_t;
- typedef struct mqtt_will_options {
- mqtt_qos_t will_qos;
- uint8_t will_retained;
- char *will_topic;
- char *will_message;
- } mqtt_will_options_t;
- typedef struct mqtt_client {
- char *mqtt_client_id;
- char *mqtt_user_name;
- char *mqtt_password;
- char *mqtt_host;
- char *mqtt_port;
- char *mqtt_ca;
- void *mqtt_reconnect_data;
- uint8_t *mqtt_read_buf;
- uint8_t *mqtt_write_buf;
- uint16_t mqtt_keep_alive_interval;
- uint16_t mqtt_packet_id;
- uint32_t mqtt_will_flag : 1;
- uint32_t mqtt_clean_session : 1;
- uint32_t mqtt_ping_outstanding : 2;
- uint32_t mqtt_version : 4;
- uint32_t mqtt_ack_handler_number : 24;
- uint32_t mqtt_cmd_timeout;
- uint32_t mqtt_read_buf_size;
- uint32_t mqtt_write_buf_size;
- uint32_t mqtt_reconnect_try_duration;
- size_t mqtt_client_id_len;
- size_t mqtt_user_name_len;
- size_t mqtt_password_len;
- mqtt_will_options_t *mqtt_will_options;
- client_state_t mqtt_client_state;
- platform_mutex_t mqtt_write_lock;
- platform_mutex_t mqtt_global_lock;
- mqtt_list_t mqtt_msg_handler_list;
- mqtt_list_t mqtt_ack_handler_list;
- network_t *mqtt_network;
- platform_thread_t *mqtt_thread;
- platform_timer_t mqtt_last_sent;
- platform_timer_t mqtt_last_received;
- reconnect_handler_t mqtt_reconnect_handler;
- interceptor_handler_t mqtt_interceptor_handler;
- } mqtt_client_t;
- #define MQTT_ROBUSTNESS_CHECK(item, err) if (!(item)) { \
- MQTT_LOG_E("%s:%d %s()... check for error.", __FILE__, __LINE__, __FUNCTION__); \
- return err; }
- #define MQTT_CLIENT_SET_DEFINE(name, type, res) \
- type mqtt_set_##name(mqtt_client_t *c, type t) { \
- MQTT_ROBUSTNESS_CHECK((c), res); \
- c->mqtt_##name = t; \
- return c->mqtt_##name; \
- }
- #define MQTT_CLIENT_SET_STATEMENT(name, type) \
- type mqtt_set_##name(mqtt_client_t *, type);
- MQTT_CLIENT_SET_STATEMENT(client_id, char*)
- MQTT_CLIENT_SET_STATEMENT(user_name, char*)
- MQTT_CLIENT_SET_STATEMENT(password, char*)
- MQTT_CLIENT_SET_STATEMENT(host, char*)
- MQTT_CLIENT_SET_STATEMENT(port, char*)
- MQTT_CLIENT_SET_STATEMENT(ca, char*)
- MQTT_CLIENT_SET_STATEMENT(reconnect_data, void*)
- MQTT_CLIENT_SET_STATEMENT(keep_alive_interval, uint16_t)
- MQTT_CLIENT_SET_STATEMENT(will_flag, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(clean_session, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(version, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(cmd_timeout, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(read_buf_size, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(write_buf_size, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(reconnect_try_duration, uint32_t)
- MQTT_CLIENT_SET_STATEMENT(reconnect_handler, reconnect_handler_t)
- MQTT_CLIENT_SET_STATEMENT(interceptor_handler, interceptor_handler_t)
- void mqtt_sleep_ms(int ms);
- mqtt_client_t *mqtt_lease(void);
- int mqtt_release(mqtt_client_t* c);
- int mqtt_connect(mqtt_client_t* c);
- int mqtt_disconnect(mqtt_client_t* c);
- int mqtt_keep_alive(mqtt_client_t* c);
- int mqtt_subscribe(mqtt_client_t* c, const char* topic_filter, mqtt_qos_t qos, message_handler_t msg_handler);
- int mqtt_unsubscribe(mqtt_client_t* c, const char* topic_filter);
- int mqtt_publish(mqtt_client_t* c, const char* topic_filter, mqtt_message_t* msg);
- int mqtt_list_subscribe_topic(mqtt_client_t* c);
- int mqtt_set_will_options(mqtt_client_t* c, char *topic, mqtt_qos_t qos, uint8_t retained, char *message);
- #ifdef __cplusplus
- }
- #endif
- #endif /* _MQTTCLIENT_H_ */
|