RyanMqttClient.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #ifndef __RyanMqttClient__
  2. #define __RyanMqttClient__
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #include "RyanMqttLog.h"
  7. #include "RyanMqttList.h"
  8. #include "RyanMqttPlatform.h"
  9. #include "RyanMqttPublic.h"
  10. // 接收到订阅消息回调函数类型,eventData用户不要进行修改否则mqtt客户端可能崩溃
  11. typedef void (*RyanMqttEventHandle)(void *client, RyanMqttEventId_e event, const void *eventData);
  12. // 定义枚举类型
  13. // 定义结构体类型
  14. typedef struct
  15. {
  16. char *topic; // 主题信息
  17. char *payload; // 数据内容
  18. uint32_t payloadLen; // 数据长度
  19. uint32_t topicLen; // topic长度
  20. RyanMqttQos_e qos; // QOS等级
  21. uint16_t packetId; // packetId 系统生成
  22. RyanMqttBool_e retained; // retained 标志位
  23. RyanMqttBool_e dup; // 重发标志
  24. } RyanMqttMsgData_t;
  25. typedef struct
  26. {
  27. RyanMqttList_t list; // 链表节点,用户勿动
  28. void *userData; // 用户自定义数据
  29. char *topic; // 主题
  30. RyanMqttQos_e qos; // qos等级
  31. uint16_t packetId; // 关联的packetId
  32. uint16_t topicLen; // 主题长度
  33. } RyanMqttMsgHandler_t;
  34. typedef struct
  35. {
  36. RyanMqttList_t list; // 链表节点,用户勿动
  37. RyanMqttTimer_t timer; // ack超时定时器,用户勿动
  38. RyanMqttMsgHandler_t *msgHandler; // msg信息
  39. uint8_t *packet; // 没有收到期望ack,重新发送的原始报文
  40. uint32_t packetLen; // 报文长度
  41. uint16_t packetId; // 报文标识符 系统生成,用户勿动
  42. uint16_t repeatCount; // 当前ack超时重发次数
  43. uint8_t packetType; // 期望接收到的ack报文类型
  44. RyanMqttBool_e packetAllocatedExternally; // packet 是外部分配的
  45. } RyanMqttAckHandler_t;
  46. typedef struct
  47. {
  48. char *topic; // 遗嘱主题
  49. char *payload; // 遗嘱消息
  50. uint32_t payloadLen; // 消息长度
  51. RyanMqttQos_e qos; // 遗嘱qos等级
  52. RyanMqttBool_e lwtFlag; // 遗嘱标志位
  53. RyanMqttBool_e retain; // 遗嘱保留标志位
  54. } lwtOptions_t;
  55. typedef struct
  56. {
  57. char *topic;
  58. RyanMqttQos_e qos;
  59. uint16_t topicLen;
  60. } RyanMqttSubscribeData_t;
  61. typedef struct
  62. {
  63. char *topic;
  64. uint16_t topicLen;
  65. } RyanMqttUnSubscribeData_t;
  66. typedef struct
  67. {
  68. void *userData; // 用户自定义数据,用户需要保证指针指向内容的持久性
  69. RyanMqttEventHandle mqttEventHandle; // mqtt事件回调函数
  70. char *clientId; // 客户端ID
  71. char *userName; // 用户名
  72. char *password; // 密码
  73. char *host; // mqtt服务器地址
  74. char *taskName; // 线程名字
  75. uint16_t port; // mqtt服务器端口
  76. uint16_t taskPrio; // mqtt线程优先级
  77. uint16_t taskStack; // 线程栈大小
  78. // ack重发超过这个数值后触发事件回调,根据实际硬件选择。典型值为 5
  79. uint16_t ackHandlerRepeatCountWarning;
  80. // 等待ack的警告数.每次添加ack,ack总数大于或等于该值将触发事件回调,根据实际硬件选择。典型值是32
  81. uint16_t ackHandlerCountWarning;
  82. // mqtt等待接收命令超时时间, 根据实际硬件选择。推荐 > ackTimeout && <= (keepaliveTimeoutS / 2)
  83. uint16_t recvTimeout; // mqtt接收命令超时时间, 根据实际硬件选择。单位ms
  84. uint16_t sendTimeout; // mqtt发送命令超时时间, 根据实际硬件选择。单位ms
  85. uint16_t ackTimeout; // mqtt ack 等待回复的超时时间, 典型值为5 - 60秒。单位ms
  86. uint16_t keepaliveTimeoutS; // mqtt心跳时间间隔。单位S
  87. uint16_t reconnectTimeout; // mqtt重连间隔时间。单位ms
  88. uint8_t mqttVersion; // mqtt版本 3.1.1是4, 3.1是3
  89. RyanMqttBool_e autoReconnectFlag; // 自动重连标志位
  90. RyanMqttBool_e cleanSessionFlag; // 清除会话标志位
  91. } RyanMqttClientConfig_t;
  92. typedef struct
  93. {
  94. RyanMqttClientConfig_t config; // mqtt config
  95. // 维护消息处理列表,这是mqtt协议必须实现的内容,所有来自服务器的publish报文都会被处理(前提是订阅了对应的消息,或者设置了拦截器)
  96. RyanMqttList_t msgHandlerList;
  97. RyanMqttList_t ackHandlerList; // 维护ack链表
  98. RyanMqttList_t userAckHandlerList; // 用户接口的ack链表,会由mqtt线程移动到ack链表
  99. RyanMqttTimer_t ackScanThrottleTimer; // ack链表检查节流定时器
  100. RyanMqttTimer_t keepaliveTimer; // 保活定时器
  101. RyanMqttTimer_t keepaliveThrottleTimer; // 保活检查节流定时器
  102. platformMutex_t sendLock; // 写缓冲区锁
  103. platformMutex_t msgHandleLock; // msg链表锁
  104. platformMutex_t ackHandleLock; // ack链表锁
  105. platformMutex_t userSessionLock; // 用户接口的锁
  106. platformCritical_t criticalLock; // 临界区锁
  107. platformNetwork_t network; // 网络组件
  108. platformThread_t mqttThread; // mqtt线程
  109. lwtOptions_t *lwtOptions; // 遗嘱相关配置
  110. uint32_t eventFlag; // 事件标志位
  111. RyanMqttState_e clientState; // mqtt客户端的状态
  112. uint16_t ackHandlerCount; // 等待ack的记录个数
  113. uint16_t packetId; // mqtt报文标识符,控制报文必须包含一个非零的 16 位报文标识符
  114. RyanMqttBool_e destroyFlag; // 销毁标志位
  115. RyanMqttBool_e pendingAckFlag; // 需要处理ack, 缩短recv超时时间,避免阻塞太久
  116. } RyanMqttClient_t;
  117. /* extern variables-----------------------------------------------------------*/
  118. extern RyanMqttError_e RyanMqttInit(RyanMqttClient_t **pClient);
  119. extern RyanMqttError_e RyanMqttDestroy(RyanMqttClient_t *client);
  120. extern RyanMqttError_e RyanMqttStart(RyanMqttClient_t *client);
  121. extern RyanMqttError_e RyanMqttDisconnect(RyanMqttClient_t *client, RyanMqttBool_e sendDiscFlag);
  122. extern RyanMqttError_e RyanMqttReconnect(RyanMqttClient_t *client);
  123. extern RyanMqttError_e RyanMqttPublishWithUserData(RyanMqttClient_t *client, char *topic, uint16_t topicLen,
  124. char *payload, uint32_t payloadLen, RyanMqttQos_e qos,
  125. RyanMqttBool_e retain, void *userData);
  126. // !推荐使用 RyanMqttPublishWithUserData , RyanMqttPublish不能正确处理topic结尾为0的情况
  127. extern RyanMqttError_e RyanMqttPublish(RyanMqttClient_t *client, char *topic, char *payload, uint32_t payloadLen,
  128. RyanMqttQos_e qos, RyanMqttBool_e retain);
  129. #define RyanMqttPublishAndUserData RyanMqttPublishWithUserData // 兼容旧版本
  130. // !推荐使用 RyanMqttSubscribeMany , RyanMqttSubscribe不能正确处理topic结尾为0的情况
  131. extern RyanMqttError_e RyanMqttSubscribe(RyanMqttClient_t *client, char *topic, RyanMqttQos_e qos);
  132. extern RyanMqttError_e RyanMqttSubscribeMany(RyanMqttClient_t *client, int32_t count,
  133. RyanMqttSubscribeData_t subscribeManyData[]);
  134. // !推荐使用 RyanMqttUnSubscribeMany , RyanMqttUnSubscribe不能正确处理topic结尾为0的情况
  135. extern RyanMqttError_e RyanMqttUnSubscribe(RyanMqttClient_t *client, char *topic);
  136. extern RyanMqttError_e RyanMqttUnSubscribeMany(RyanMqttClient_t *client, int32_t count,
  137. RyanMqttUnSubscribeData_t unSubscribeManyData[]);
  138. extern RyanMqttError_e RyanMqttGetSubscribeSafe(RyanMqttClient_t *client, RyanMqttMsgHandler_t **msgHandles,
  139. int32_t *subscribeNum);
  140. extern RyanMqttError_e RyanMqttSafeFreeSubscribeResources(RyanMqttMsgHandler_t *msgHandles, int32_t subscribeNum);
  141. // !此函数是非线程安全的,已不推荐! 请使用 RyanMqttGetSubscribeSafe 代替
  142. extern RyanMqttError_e RyanMqttGetSubscribe(RyanMqttClient_t *client, RyanMqttMsgHandler_t *msgHandles,
  143. int32_t msgHandleSize, int32_t *subscribeNum);
  144. extern RyanMqttError_e RyanMqttGetSubscribeTotalCount(RyanMqttClient_t *client, int32_t *subscribeTotalCount);
  145. extern RyanMqttState_e RyanMqttGetState(RyanMqttClient_t *client);
  146. extern RyanMqttError_e RyanMqttGetKeepAliveRemain(RyanMqttClient_t *client, uint32_t *keepAliveRemain);
  147. extern RyanMqttError_e RyanMqttGetConfig(RyanMqttClient_t *client, RyanMqttClientConfig_t **pclientConfig);
  148. extern RyanMqttError_e RyanMqttFreeConfigFromGet(RyanMqttClientConfig_t *clientConfig);
  149. extern RyanMqttError_e RyanMqttSetConfig(RyanMqttClient_t *client, RyanMqttClientConfig_t *clientConfig);
  150. extern RyanMqttError_e RyanMqttSetLwt(RyanMqttClient_t *client, char *topicName, char *payload, uint32_t payloadLen,
  151. RyanMqttQos_e qos, RyanMqttBool_e retain);
  152. extern RyanMqttError_e RyanMqttDiscardAckHandler(RyanMqttClient_t *client, uint8_t packetType, uint16_t packetId);
  153. extern RyanMqttError_e RyanMqttGetEventId(RyanMqttClient_t *client, RyanMqttEventId_e *eventId);
  154. extern RyanMqttError_e RyanMqttRegisterEventId(RyanMqttClient_t *client, RyanMqttEventId_e eventId);
  155. extern RyanMqttError_e RyanMqttCancelEventId(RyanMqttClient_t *client, RyanMqttEventId_e eventId);
  156. #ifdef __cplusplus
  157. }
  158. #endif
  159. #endif