shadow_client.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 IOT_SHADOW_CLIENT_H_
  16. #define IOT_SHADOW_CLIENT_H_
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. #include <stdbool.h>
  21. #include "mqtt_client.h"
  22. /* 在任意给定时间内, 处于appending状态的请求最大个数 */
  23. #define MAX_APPENDING_REQUEST_AT_ANY_GIVEN_TIME (10)
  24. /* 一个method的最大长度 */
  25. #define MAX_SIZE_OF_METHOD (10)
  26. /* 一个仅包含method字段的JSON文档的最大长度 */
  27. #define MAX_SIZE_OF_JSON_WITH_METHOD (MAX_SIZE_OF_METHOD + 20)
  28. /* 接收云端返回的JSON文档的buffer大小 */
  29. #define CLOUD_IOT_JSON_RX_BUF_LEN (UIOT_MQTT_RX_BUF_LEN + 1)
  30. /* 最大等待时间 */
  31. #define MAX_WAIT_TIME_SEC 1
  32. #define MAX_WAIT_TIME_MS 1000
  33. /**
  34. * @brief 请求响应返回的类型
  35. */
  36. typedef enum {
  37. ACK_NONE = -3, // 请求超时
  38. ACK_TIMEOUT = -2, // 请求超时
  39. ACK_REJECTED = -1, // 请求拒绝
  40. ACK_ACCEPTED = 0 // 请求接受
  41. } RequestAck;
  42. /**
  43. * @brief 操作云端设备文档可以使用的三种方式
  44. */
  45. typedef enum {
  46. GET, // 获取云端设备文档
  47. UPDATE, // 更新或创建云端设备文档
  48. UPDATE_AND_RESET_VER, // 更新同时重置版本号
  49. DELETE, // 删除部分云端设备文档
  50. DELETE_ALL, // 删除全部云端设备文档中的属性,不需要一个个添加需要删除的属性
  51. REPLY_CONTROL_UPDATE, // 设备处理完服务端的control消息后回应的update消息
  52. REPLY_CONTROL_DELETE, // 设备处理完服务端的control消息后回应的delete消息
  53. } Method;
  54. /**
  55. * @brief JSON文档中支持的数据类型
  56. */
  57. typedef enum {
  58. JINT32, // 32位有符号整型
  59. JINT16, // 16位有符号整型
  60. JINT8, // 8位有符号整型
  61. JUINT32, // 32位无符号整型
  62. JUINT16, // 16位无符号整型
  63. JUINT8, // 8位无符号整型
  64. JFLOAT, // 单精度浮点型
  65. JDOUBLE, // 双精度浮点型
  66. JBOOL, // 布尔型
  67. JSTRING, // 字符串
  68. JOBJECT // JSON对象
  69. } JsonDataType;
  70. /**
  71. * @brief 定义设备的某个属性, 实际就是一个JSON文档节点
  72. */
  73. typedef struct _JSONNode {
  74. char *key; // 该JSON节点的Key
  75. void *data; // 该JSON节点的Value
  76. JsonDataType type; // 该JSON节点的数据类型
  77. } DeviceProperty;
  78. /**
  79. * @brief 每次文档请求响应的回调函数
  80. *
  81. * @param pClient ShadowClient对象
  82. * @param method 文档操作方式
  83. * @param requestAck 请求响应类型
  84. * @param pJsonDocument 云端响应返回的文档
  85. * @param userContext 用户数据
  86. *
  87. */
  88. typedef void (*OnRequestCallback)(void *pClient, Method method, RequestAck requestAck, const char *pJsonDocument, void *userContext);
  89. /**
  90. * @brief 文档操作请求的参数结构体定义
  91. */
  92. typedef struct _RequestParam {
  93. Method method; // 文档请求方式: GET, UPDATE, DELETE等
  94. List *property_delta_list; // 该请求需要修改的属性
  95. uint32_t timeout_sec; // 请求超时时间, 单位:s
  96. OnRequestCallback request_callback; // 请求回调方法
  97. void *user_context; // 用户数据, 会通过回调方法OnRequestCallback返回
  98. } RequestParams;
  99. /**
  100. * @brief 设备属性处理回调函数
  101. *
  102. * @param pClient ShadowClient对象
  103. * @param pParams 设备影子文档修改请求
  104. * @param pJsonValueBuffer 设备属性值
  105. * @param valueLength 设备属性值长度
  106. * @param DeviceProperty 设备属性结构体
  107. */
  108. typedef void (*OnPropRegCallback)(void *pClient, RequestParams *pParams, char *pJsonValueBuffer, uint32_t valueLength, DeviceProperty *pProperty);
  109. /**
  110. * @brief 该结构体用于保存已登记的设备属性及设备属性处理的回调方法
  111. */
  112. typedef struct {
  113. void *property; // 设备属性
  114. OnPropRegCallback callback; // 回调处理函数
  115. } PropertyHandler;
  116. typedef struct _ShadowInnerData {
  117. uint32_t version; //本地维护的影子文档的版本号
  118. List *request_list; //影子文档的修改请求
  119. List *property_list; //本地维护的影子文档的属性值,期望值和回调处理函数
  120. } ShadowInnerData;
  121. typedef struct _Shadow {
  122. void *mqtt;
  123. const char *product_sn;
  124. const char *device_sn;
  125. void *request_mutex;
  126. void *property_mutex;
  127. ShadowInnerData inner_data;
  128. } UIoT_Shadow;
  129. /**
  130. * @brief 设备影子初始化
  131. *
  132. * @param pShadow shadow client
  133. * @return 返回SUCCESS, 表示成功
  134. */
  135. int uiot_shadow_init(UIoT_Shadow *pShadow);
  136. /**
  137. * @brief 设备影子重置,主要是将设备影子中的队列归零
  138. *
  139. * @param pClient shadow client
  140. * @return 返回SUCCESS, 表示成功
  141. */
  142. void uiot_shadow_reset(void *pClient);
  143. /**
  144. * @brief 处理请求队列中已经超时的请求
  145. *
  146. * @param pShadow shadow client
  147. */
  148. void _handle_expired_request(UIoT_Shadow *pShadow);
  149. /**
  150. * @brief 所有的云端设备文档操作请求, 通过该方法进行中转分发
  151. *
  152. * @param pShadow shadow client
  153. * @param pParams 请求参数
  154. * @param pJsonDoc 请求文档
  155. * @param sizeOfBuffer 文档缓冲区大小
  156. * @return 返回SUCCESS, 表示成功
  157. */
  158. int uiot_shadow_make_request(UIoT_Shadow *pShadow,char *pJsonDoc, size_t sizeOfBuffer, RequestParams *pParams);
  159. /**
  160. * @brief 订阅设备影子topic
  161. *
  162. * @param pShadow shadow client
  163. * @param topicFilter topic的名称
  164. * @param on_message_handler topic的消息回调函数
  165. * @return 返回SUCCESS, 表示成功
  166. */
  167. int uiot_shadow_subscribe_topic(UIoT_Shadow *pShadow, char *topicFilter, OnMessageHandler on_message_handler);
  168. /**
  169. * @brief 初始化一个修改设备影子的请求
  170. * @param handle ShadowClient对象
  171. * @param method 修改类型
  172. * @param callback 请求回调函数
  173. * @param timeout_sec 超时时间
  174. * @return 返回NULL,表示初始化失败
  175. */
  176. void* uiot_shadow_request_init(Method method, OnRequestCallback request_callback, uint32_t timeout_sec, void *user_context);
  177. /**
  178. * @brief 从服务端获取设备影子文档
  179. *
  180. * @param handle shadow handle
  181. * @param message 返回的消息
  182. * @param pUserdata 跟随回调函数返回
  183. */
  184. void topic_request_result_handler(void *pClient, MQTTMessage *message, void *pUserdata);
  185. /**
  186. * @brief 从服务端获取设备影子文档
  187. *
  188. * @param handle shadow handle
  189. * @param message 返回的消息
  190. * @param pUserdata 跟随回调函数返回
  191. */
  192. void topic_sync_handler(void *pClient, MQTTMessage *message, void *pUserdata);
  193. #ifdef __cplusplus
  194. }
  195. #endif
  196. #endif /* IOT_SHADOW_CLIENT_H_ */