RyanMqttClient.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #ifndef __RyanMqttClient__
  2. #define __RyanMqttClient__
  3. #ifdef __cplusplus
  4. extern "C"
  5. {
  6. #endif
  7. #include "platformTimer.h"
  8. #include "platformSystem.h"
  9. #include "platformNetwork.h"
  10. #include "RyanList.h"
  11. #include "RyanMqttPublic.h"
  12. #include "core_mqtt_serializer.h"
  13. // 接收到订阅消息回调函数类型,eventData用户不要进行修改否则mqtt客户端可能崩溃
  14. typedef void (*RyanMqttEventHandle)(void *client, RyanMqttEventId_e event, const void *eventData);
  15. // 定义枚举类型
  16. // 定义结构体类型
  17. typedef struct
  18. {
  19. RyanMqttBool_e retained : 1; // retained 标志位
  20. RyanMqttBool_e dup : 1; // 重发标志
  21. uint16_t packetId; // packetId 系统生成
  22. RyanMqttQos_e qos; // QOS等级
  23. uint32_t payloadLen; // 数据长度
  24. uint32_t topicLen; // topic长度
  25. char *topic; // 主题信息
  26. char *payload; // 数据内容
  27. } RyanMqttMsgData_t;
  28. typedef struct
  29. {
  30. uint16_t topicLen; // 主题长度
  31. RyanMqttQos_e qos; // qos等级
  32. RyanList_t list; // 链表节点,用户勿动
  33. char *topic; // 主题
  34. } RyanMqttMsgHandler_t;
  35. typedef struct
  36. {
  37. uint8_t packetType; // 期望接收到的ack报文类型
  38. uint16_t repeatCount; // 当前ack超时重发次数
  39. uint16_t packetId; // 报文标识符 系统生成,用户勿动
  40. RyanMqttBool_e isPreallocatedPacket; // 是否是预分配的内存
  41. uint32_t packetLen; // 报文长度
  42. RyanList_t list; // 链表节点,用户勿动
  43. platformTimer_t timer; // ack超时定时器,用户勿动
  44. RyanMqttMsgHandler_t *msgHandler; // msg信息
  45. uint8_t *packet; // 没有收到期望ack,重新发送的原始报文
  46. } RyanMqttAckHandler_t;
  47. typedef struct
  48. {
  49. uint8_t retain; // 遗嘱保留标志位
  50. RyanMqttQos_e qos; // 遗嘱qos等级
  51. uint32_t payloadLen; // 消息长度
  52. char *topic; // 遗嘱主题
  53. char *payload; // 遗嘱消息
  54. } lwtOptions_t;
  55. typedef struct
  56. {
  57. char *clientId; // 客户端ID
  58. char *userName; // 用户名
  59. char *password; // 密码
  60. char *host; // mqtt服务器地址
  61. char *taskName; // 线程名字
  62. RyanMqttBool_e autoReconnectFlag : 1; // 自动重连标志位
  63. RyanMqttBool_e cleanSessionFlag : 1; // 清除会话标志位
  64. uint8_t mqttVersion : 4; // mqtt版本 3.1.1是4, 3.1是3
  65. uint16_t port; // mqtt服务器端口
  66. uint16_t ackHandlerRepeatCountWarning; // ack重发超过这个数值后触发事件回调,根据实际硬件选择。典型值为 * ackTimeout ~= 300秒
  67. uint16_t taskPrio; // mqtt线程优先级
  68. uint16_t taskStack; // 线程栈大小
  69. uint16_t recvTimeout; // mqtt等待接收命令超时时间, 根据实际硬件选择。推荐 > ackTimeout && <= (keepaliveTimeoutS / 2)
  70. uint16_t sendTimeout; // mqtt发送给命令超时时间, 根据实际硬件选择。
  71. uint16_t ackTimeout; // mqtack等待命令超时时间, 典型值为5 - 30
  72. uint16_t keepaliveTimeoutS; // mqtt心跳时间间隔秒
  73. uint16_t ackHandlerCountWarning; // 等待ack的警告数 每次添加ack,ack总数大于或等于该值将触发事件回调,根据实际硬件选择。典型值是32
  74. uint16_t reconnectTimeout; // mqtt重连间隔时间
  75. RyanMqttEventHandle mqttEventHandle; // mqtt事件回调函数
  76. void *userData; // 用户自定义数据,用户需要保证指针指向内容的持久性
  77. } RyanMqttClientConfig_t;
  78. typedef struct
  79. {
  80. RyanMqttBool_e lwtFlag : 1; // 遗嘱标志位
  81. RyanMqttBool_e destoryFlag : 1; // 销毁标志位
  82. uint16_t ackHandlerCount; // 等待ack的记录个数
  83. uint16_t packetId; // mqtt报文标识符,控制报文必须包含一个非零的 16 位报文标识符
  84. uint32_t eventFlag; // 事件标志位
  85. RyanMqttState_e clientState; // mqtt客户端的状态
  86. RyanList_t msgHandlerList; // 维护消息处理列表,这是mqtt协议必须实现的内容,所有来自服务器的publish报文都会被处理(前提是订阅了对应的消息,或者设置了拦截器)
  87. RyanList_t ackHandlerList; // 维护ack链表
  88. RyanList_t userAckHandlerList; // 用户接口的ack链表,会由mqtt线程移动到ack链表
  89. platformTimer_t ackScanThrottleTimer; // ack链表检查节流定时器
  90. platformTimer_t keepaliveTimer; // 保活定时器
  91. platformTimer_t keepaliveThrottleTimer; // 保活检查节流定时器
  92. platformNetwork_t network; // 网络组件
  93. RyanMqttClientConfig_t config; // mqtt config
  94. platformThread_t mqttThread; // mqtt线程
  95. platformMutex_t sendBufLock; // 写缓冲区锁
  96. platformMutex_t msgHandleLock; // msg链表锁
  97. platformMutex_t ackHandleLock; // ack链表锁
  98. platformMutex_t userAckHandleLock; // 用户接口的ack链表锁
  99. platformCritical_t criticalLock; // 临界区锁
  100. lwtOptions_t lwtOptions; // 遗嘱相关配置
  101. } RyanMqttClient_t;
  102. /* extern variables-----------------------------------------------------------*/
  103. extern RyanMqttError_e RyanMqttInit(RyanMqttClient_t **pClient);
  104. extern RyanMqttError_e RyanMqttDestroy(RyanMqttClient_t *client);
  105. extern RyanMqttError_e RyanMqttStart(RyanMqttClient_t *client);
  106. extern RyanMqttError_e RyanMqttDisconnect(RyanMqttClient_t *client, RyanMqttBool_e sendDiscFlag);
  107. extern RyanMqttError_e RyanMqttReconnect(RyanMqttClient_t *client);
  108. extern RyanMqttError_e RyanMqttSubscribe(RyanMqttClient_t *client, char *topic, RyanMqttQos_e qos);
  109. extern RyanMqttError_e RyanMqttUnSubscribe(RyanMqttClient_t *client, char *topic);
  110. extern RyanMqttError_e RyanMqttPublish(RyanMqttClient_t *client, char *topic, char *payload, uint32_t payloadLen, RyanMqttQos_e qos, RyanMqttBool_e retain);
  111. extern RyanMqttState_e RyanMqttGetState(RyanMqttClient_t *client);
  112. extern RyanMqttError_e RyanMqttGetSubscribeTotalCount(RyanMqttClient_t *client, int32_t *subscribeTotalCount);
  113. extern RyanMqttError_e RyanMqttGetSubscribe(RyanMqttClient_t *client, RyanMqttMsgHandler_t *msgHandles, int32_t msgHandleSize, int32_t *subscribeNum);
  114. extern RyanMqttError_e RyanMqttSetConfig(RyanMqttClient_t *client, RyanMqttClientConfig_t *clientConfig);
  115. extern RyanMqttError_e RyanMqttSetLwt(RyanMqttClient_t *client, char *topicName, char *payload, uint32_t payloadLen, RyanMqttQos_e qos, RyanMqttBool_e retain);
  116. extern RyanMqttError_e RyanMqttDiscardAckHandler(RyanMqttClient_t *client, RyanMqttAckHandler_t *ackHandler);
  117. extern RyanMqttError_e RyanMqttRegisterEventId(RyanMqttClient_t *client, RyanMqttEventId_e eventId);
  118. extern RyanMqttError_e RyanMqttCancelEventId(RyanMqttClient_t *client, RyanMqttEventId_e eventId);
  119. #ifdef __cplusplus
  120. }
  121. #endif
  122. #endif