uiot_export_mqtt.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. * Copyright (C) 2012-2019 UCloud. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License").
  5. * You may not use this file except in compliance with the License.
  6. * A copy of the License is located at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * or in the "license" file accompanying this file. This file is distributed
  11. * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. * express or implied. See the License for the specific language governing
  13. * permissions and limitations under the License.
  14. */
  15. #ifndef C_SDK_UIOT_EXPORT_MQTT_H_
  16. #define C_SDK_UIOT_EXPORT_MQTT_H_
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. #include <stddef.h>
  21. #include <stdbool.h>
  22. #include <stdint.h>
  23. /**
  24. * @brief 服务质量等级。服务质量等级表示PUBLISH消息分发的质量等级。可参考MQTT协议说明 4.7
  25. */
  26. typedef enum _QoS {
  27. QOS0 = 0, // 至多分发一次
  28. QOS1 = 1, // 至少分发一次, 消息的接收者需回复PUBACK报文
  29. QOS2 = 2 // 仅分发一次, 目前暂不支持
  30. } QoS;
  31. /**
  32. * @brief 发布或接收已订阅消息的结构体定义
  33. */
  34. typedef struct {
  35. QoS qos; // MQTT 服务质量等级
  36. uint8_t retained; // RETAIN 标识位
  37. uint8_t dup; // DUP 标识位
  38. uint16_t id; // MQTT 消息标识符
  39. const char *topic; // MQTT topic
  40. size_t topic_len; // topic 长度
  41. void *payload; // MQTT 消息负载
  42. size_t payload_len; // MQTT 消息负载长度
  43. } MQTTMessage;
  44. typedef MQTTMessage PublishParams;
  45. #define DEFAULT_PUB_PARAMS {QOS0, 0, 0, 0, NULL, 0, NULL, 0}
  46. /**
  47. * @brief 接收已订阅消息的回调函数定义
  48. */
  49. typedef void (*OnMessageHandler)(void *pClient, MQTTMessage *message, void *pUserData);
  50. /**
  51. * @brief 订阅主题的结构体定义
  52. */
  53. typedef struct {
  54. QoS qos; // QOS服务质量标识
  55. OnMessageHandler on_message_handler; // 接收已订阅消息的回调函数
  56. void *user_data; // 用户数据, 通过callback返回
  57. } SubscribeParams;
  58. #define DEFAULT_SUB_PARAMS {QOS0, NULL, NULL}
  59. typedef enum {
  60. /* 未定义事件 */
  61. MQTT_EVENT_UNDEF = 0,
  62. /* MQTT 断开连接 */
  63. MQTT_EVENT_DISCONNECT = 1,
  64. /* MQTT 重连 */
  65. MQTT_EVENT_RECONNECT = 2,
  66. /* 订阅成功 */
  67. MQTT_EVENT_SUBSCRIBE_SUCCESS = 3,
  68. /* 订阅超时 */
  69. MQTT_EVENT_SUBSCRIBE_TIMEOUT = 4,
  70. /* 订阅失败 */
  71. MQTT_EVENT_SUBSCRIBE_NACK = 5,
  72. /* 取消订阅成功 */
  73. MQTT_EVENT_UNSUBSCRIBE_SUCCESS = 6,
  74. /* 取消订阅超时 */
  75. MQTT_EVENT_UNSUBSCRIBE_TIMEOUT = 7,
  76. /* 取消订阅失败 */
  77. MQTT_EVENT_UNSUBSCRIBE_NACK = 8,
  78. /* 发布成功 */
  79. MQTT_EVENT_PUBLISH_SUCCESS = 9,
  80. /* 发布超时 */
  81. MQTT_EVENT_PUBLISH_TIMEOUT = 10,
  82. /* 发布失败 */
  83. MQTT_EVENT_PUBLISH_NACK = 11,
  84. /* SDK订阅的topic收到后台push消息 */
  85. MQTT_EVENT_PUBLISH_RECEIVED = 12,
  86. } MQTTEventType;
  87. typedef struct {
  88. MQTTEventType event_type;
  89. void *msg;
  90. } MQTTEventMsg;
  91. /**
  92. * @brief 定义了函数指针的数据类型. 当相关事件发生时,将调用这种类型的函数.
  93. *
  94. * @param context, the program context
  95. * @param pClient, the MQTT client
  96. * @param msg, the event message.
  97. *
  98. * @return none
  99. */
  100. typedef void (*MQTTEventHandlerFun)(void *pClient, void *context, MQTTEventMsg *msg);
  101. /* The structure of MQTT event handle */
  102. typedef struct {
  103. MQTTEventHandlerFun h_fp;
  104. void *context;
  105. } MQTTEventHandler;
  106. typedef struct {
  107. /**
  108. * 设备基础信息
  109. */
  110. char *product_sn; // 产品序列号
  111. char *device_sn; // 设备序列号
  112. char *product_secret; // 产品密钥 用于动态注册,不填则认为是静态注册
  113. char *device_secret; // 设备密钥 用于静态注册,动态注册时可以不填
  114. uint32_t command_timeout; // 发布订阅信令读写超时时间 ms
  115. uint32_t keep_alive_interval; // 心跳周期, 单位: s
  116. uint8_t clean_session; // 清理会话标志位
  117. uint8_t auto_connect_enable; // 是否开启自动重连 1:启用自动重连 0:不启用自动重连 建议为1
  118. MQTTEventHandler event_handler; // 事件回调
  119. } MQTTInitParams;
  120. #define DEFAULT_MQTT_INIT_PARAMS { NULL, NULL, NULL, NULL, 2000, 240, 1, 1, {0}}
  121. /**
  122. * @brief 构造MQTTClient并完成MQTT连接
  123. *
  124. * @param pParams MQTT协议连接接入与连接维持阶段所需要的参数
  125. *
  126. * @return 构造成功返回MQTT句柄,构造失败返回NULL
  127. */
  128. void* IOT_MQTT_Construct(MQTTInitParams *pParams);
  129. /**
  130. * @brief 关闭MQTT连接并销毁MQTTClient
  131. *
  132. * @param pClient MQTT句柄
  133. *
  134. * @return 返回SUCCESS, 表示销毁成功,返回FAILURE表示失败
  135. */
  136. int IOT_MQTT_Destroy(void **pClient);
  137. /**
  138. * @brief 在当前线程为底层MQTT客户端让出一定CPU执行时间
  139. *
  140. * 在这段时间内, MQTT客户端会用用处理消息接收, 以及发送PING报文, 监控网络状态
  141. *
  142. * @param pClient MQTT句柄
  143. * @param timeout_ms Yield操作超时时间
  144. * @return 返回SUCCESS, 表示成功, 返回ERR_MQTT_ATTEMPTING_RECONNECT, 表示正在重连
  145. */
  146. int IOT_MQTT_Yield(void *pClient, uint32_t timeout_ms);
  147. /**
  148. * @brief 发布MQTT消息
  149. *
  150. * @param pClient MQTT句柄
  151. * @param topicName 主题名
  152. * @param pParams 发布参数
  153. * @return < 0 : 表示失败
  154. * >= 0 : 返回唯一的packet id
  155. */
  156. int IOT_MQTT_Publish(void *pClient, char *topicName, PublishParams *pParams);
  157. /**
  158. * @brief 订阅MQTT主题
  159. *
  160. * @param pClient MQTT句柄
  161. * @param topicFilter 主题过滤器, 可参考MQTT协议说明 4.7
  162. * @param pParams 订阅参数
  163. * @return < 0 : 表示失败
  164. * >= 0 : 返回唯一的packet id
  165. */
  166. int IOT_MQTT_Subscribe(void *pClient, char *topicFilter, SubscribeParams *pParams);
  167. /**
  168. * @brief 取消订阅已订阅的MQTT主题
  169. *
  170. * @param pClient MQTT客户端结构体
  171. * @param topicFilter 主题过滤器, 可参考MQTT协议说明 4.7
  172. * @return < 0 : 表示失败
  173. * >= 0 : 返回唯一的packet id
  174. */
  175. int IOT_MQTT_Unsubscribe(void *pClient, char *topicFilter);
  176. /**
  177. * @brief 客户端目前是否已连接
  178. *
  179. * @param pClient MQTT Client结构体
  180. * @return 返回true, 表示客户端已连接,返回false表示断开连接
  181. */
  182. bool IOT_MQTT_IsConnected(void *pClient);
  183. /**
  184. * @brief 构造MQTTClient动态注册
  185. *
  186. * @param pParams MQTT协议连接接入与连接维持阶段所需要的参数
  187. *
  188. * @return 成功返回SUCCESS,否则返回错误码
  189. */
  190. int IOT_MQTT_Dynamic_Register(MQTTInitParams *pParams);
  191. #ifdef __cplusplus
  192. }
  193. #endif
  194. #endif /* C_SDK_UIOT_EXPORT_MQTT_H_ */