shadow_sample.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. * Tencent is pleased to support the open source community by making IoT Hub available.
  3. * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
  4. * Licensed under the MIT License (the "License"); you may not use this file except in
  5. * compliance with the License. You may obtain a copy of the License at
  6. * http://opensource.org/licenses/MIT
  7. * Unless required by applicable law or agreed to in writing, software distributed under the License is
  8. * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
  9. * either express or implied. See the License for the specific language governing permissions and
  10. * limitations under the License.
  11. *
  12. */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <limits.h>
  16. #include <stdbool.h>
  17. #include <string.h>
  18. #include <signal.h>
  19. #include "uiot_export_shadow.h"
  20. #include "uiot_import.h"
  21. #include "shadow_client.h"
  22. #define SIZE_OF_JSON_BUFFER 256
  23. static int running_state = 0;
  24. //当设备直接按照desired字段中的属性值更新时不需要上报
  25. void RegCallback_update(void *pClient, RequestParams *pParams, char *pJsonValueBuffer, uint32_t valueLength, DeviceProperty *pProperty)
  26. {
  27. LOG_DEBUG("key:%s val:%s\n",pProperty->key, pJsonValueBuffer);
  28. IOT_Shadow_Direct_Update_Value(pJsonValueBuffer, pProperty);
  29. return;
  30. }
  31. //当设备没有完全按照desired字段中的属性更新时,需要将当前真实值上报
  32. void RegCallback_hold(void *pClient, RequestParams *pParams, char *pJsonValueBuffer, uint32_t valueLength, DeviceProperty *pProperty)
  33. {
  34. LOG_DEBUG("key:%s val:%s\n",pProperty->key, pJsonValueBuffer);
  35. int num = 10;
  36. pProperty->data = &num;
  37. IOT_Shadow_Request_Add_Delta_Property(pClient, pParams,pProperty);
  38. return;
  39. }
  40. static void _update_ack_cb(void *pClient, Method method, RequestAck requestAck, const char *pReceivedJsonDocument, void *pUserdata)
  41. {
  42. LOG_DEBUG("requestAck=%d\n", requestAck);
  43. if (NULL != pReceivedJsonDocument) {
  44. LOG_DEBUG("Received Json Document=%s\n", pReceivedJsonDocument);
  45. } else {
  46. LOG_DEBUG("Received Json Document is NULL\n");
  47. }
  48. *((RequestAck *)pUserdata) = requestAck;
  49. return;
  50. }
  51. /**
  52. * 设置MQTT connet初始化参数
  53. *
  54. * @param initParams MQTT connet初始化参数
  55. *
  56. * @return 0: 参数初始化成功 非0: 失败
  57. */
  58. static int _setup_connect_init_params(MQTTInitParams* initParams)
  59. {
  60. int ret = SUCCESS_RET;
  61. initParams->device_sn = (char *)PKG_USING_UCLOUD_IOT_SDK_DEVICE_SN;
  62. initParams->product_sn = (char *)PKG_USING_UCLOUD_IOT_SDK_PRODUCT_SN;
  63. initParams->device_secret = (char *)PKG_USING_UCLOUD_IOT_SDK_DEVICE_SECRET;
  64. initParams->command_timeout = UIOT_MQTT_COMMAND_TIMEOUT;
  65. initParams->keep_alive_interval = UIOT_MQTT_KEEP_ALIVE_INTERNAL;
  66. initParams->auto_connect_enable = 1;
  67. return ret;
  68. }
  69. static void shadow_test_thread(void)
  70. {
  71. int ret = SUCCESS_RET;
  72. MQTTInitParams initParams = DEFAULT_MQTT_INIT_PARAMS;
  73. ret = _setup_connect_init_params(&initParams);
  74. if(ret != SUCCESS_RET)
  75. {
  76. HAL_Printf("_setup_connect_init_params fail:%d\n", ret);
  77. return;
  78. }
  79. void *mqtt_client = IOT_MQTT_Construct(&initParams);
  80. if(mqtt_client == NULL)
  81. {
  82. HAL_Printf("IOT_MQTT_Construct fail\n");
  83. return;
  84. }
  85. UIoT_Shadow *shadow_client = (UIoT_Shadow *)IOT_Shadow_Construct(PKG_USING_UCLOUD_IOT_SDK_PRODUCT_SN, PKG_USING_UCLOUD_IOT_SDK_DEVICE_SN, mqtt_client);
  86. if(shadow_client == NULL)
  87. {
  88. HAL_Printf("IOT_Shadow_Construct fail\n");
  89. IOT_MQTT_Destroy(&mqtt_client);
  90. }
  91. IOT_Shadow_Yield(shadow_client, 200);
  92. bool isConnected = IOT_MQTT_IsConnected(shadow_client->mqtt);
  93. if(isConnected != true)
  94. {
  95. HAL_Printf("IOT_MQTT_IsConnected fail\n");
  96. IOT_MQTT_Destroy(&mqtt_client);
  97. return;
  98. }
  99. int time_sec = MAX_WAIT_TIME_SEC;
  100. RequestAck ack_update = ACK_NONE;
  101. DeviceProperty *Property1 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  102. int32_t num1 = 18;
  103. char str1[6] = "data1";
  104. Property1->key= str1;
  105. Property1->data = &num1;
  106. Property1->type = JINT32;
  107. ret = IOT_Shadow_Register_Property(shadow_client, Property1, RegCallback_hold);
  108. if(SUCCESS_RET != ret)
  109. {
  110. HAL_Printf("Register Property1 fail:%d\n", ret);
  111. HAL_Free(Property1);
  112. IOT_Shadow_Destroy(shadow_client);
  113. IOT_MQTT_Destroy(&mqtt_client);
  114. return;
  115. }
  116. DeviceProperty *Property2 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  117. float num2 = 20.2;
  118. char str2[6] = "data2";
  119. Property2->key= str2;
  120. Property2->data = &num2;
  121. Property2->type = JFLOAT;
  122. ret = IOT_Shadow_Register_Property(shadow_client, Property2, RegCallback_update);
  123. if(SUCCESS_RET != ret)
  124. {
  125. HAL_Printf("Register Property2 fail:%d\n", ret);
  126. HAL_Free(Property1);
  127. HAL_Free(Property2);
  128. IOT_Shadow_Destroy(shadow_client);
  129. IOT_MQTT_Destroy(&mqtt_client);
  130. return;
  131. }
  132. DeviceProperty *Property3 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  133. double num3 = 22.9;
  134. char str3[6] = "data3";
  135. Property3->key= str3;
  136. Property3->data = &num3;
  137. Property3->type = JDOUBLE;
  138. ret = IOT_Shadow_Register_Property(shadow_client, Property3, RegCallback_update);
  139. if(SUCCESS_RET != ret)
  140. {
  141. HAL_Printf("Register Property3 fail:%d\n", ret);
  142. HAL_Free(Property1);
  143. HAL_Free(Property2);
  144. IOT_Shadow_Destroy(shadow_client);
  145. IOT_MQTT_Destroy(&mqtt_client);
  146. return;
  147. }
  148. DeviceProperty *Property4 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  149. char num4[5] = "num4";
  150. char str4[6] = "data4";
  151. Property4->key= str4;
  152. Property4->data = num4;
  153. Property4->type = JSTRING;
  154. ret = IOT_Shadow_Register_Property(shadow_client, Property4, RegCallback_update);
  155. if(SUCCESS_RET != ret)
  156. {
  157. HAL_Printf("Register Property4 fail:%d\n", ret);
  158. HAL_Free(Property1);
  159. HAL_Free(Property2);
  160. HAL_Free(Property3);
  161. HAL_Free(Property4);
  162. IOT_Shadow_Destroy(shadow_client);
  163. IOT_MQTT_Destroy(&mqtt_client);
  164. return;
  165. }
  166. DeviceProperty *Property5 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  167. bool num5 = false;
  168. char str5[6] = "data5";
  169. Property5->key= str5;
  170. Property5->data = &num5;
  171. Property5->type = JBOOL;
  172. ret = IOT_Shadow_Register_Property(shadow_client, Property5, RegCallback_update);
  173. if(SUCCESS_RET != ret)
  174. {
  175. HAL_Printf("Register Property5 fail:%d\n", ret);
  176. HAL_Free(Property1);
  177. HAL_Free(Property2);
  178. HAL_Free(Property3);
  179. HAL_Free(Property4);
  180. HAL_Free(Property5);
  181. IOT_Shadow_Destroy(shadow_client);
  182. IOT_MQTT_Destroy(&mqtt_client);
  183. return;
  184. }
  185. DeviceProperty *Property6 = (DeviceProperty *)HAL_Malloc(sizeof(DeviceProperty));
  186. char num6[20] = "{\"temp\":25}";
  187. char str6[6] = "data6";
  188. Property6->key= str6;
  189. Property6->data = num6;
  190. Property6->type = JOBJECT;
  191. ret = IOT_Shadow_Register_Property(shadow_client, Property6, RegCallback_update);
  192. if(SUCCESS_RET != ret)
  193. {
  194. HAL_Printf("Register Property6 fail:%d\n", ret);
  195. HAL_Free(Property1);
  196. HAL_Free(Property2);
  197. HAL_Free(Property3);
  198. HAL_Free(Property4);
  199. HAL_Free(Property5);
  200. HAL_Free(Property6);
  201. IOT_Shadow_Destroy(shadow_client);
  202. IOT_MQTT_Destroy(&mqtt_client);
  203. return;
  204. }
  205. /* 先同步一下版本号和设备掉电期间更新的属性 */
  206. ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
  207. if(SUCCESS_RET != ret)
  208. {
  209. HAL_Printf("Get Sync fail:%d\n", ret);
  210. goto end;
  211. }
  212. while (ACK_NONE == ack_update) {
  213. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  214. }
  215. /* update */
  216. ack_update = ACK_NONE;
  217. ret = IOT_Shadow_Update(shadow_client, _update_ack_cb, time_sec, &ack_update, 6, Property1, Property2, Property3, Property4, Property5, Property6);
  218. if(SUCCESS_RET != ret)
  219. {
  220. HAL_Printf("Update Property1 Property2 Property3 Property4 Property5 Property6 fail:%d\n", ret);
  221. goto end;
  222. }
  223. while (ACK_NONE == ack_update) {
  224. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  225. }
  226. ack_update = ACK_NONE;
  227. ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
  228. while (ACK_NONE == ack_update) {
  229. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  230. }
  231. /* update */
  232. num1 = 123;
  233. Property1->data = &num1;
  234. char num9[5] = "num9";
  235. Property4->data = num9;
  236. ack_update = ACK_NONE;
  237. ret = IOT_Shadow_Update(shadow_client, _update_ack_cb, time_sec, &ack_update, 2, Property1, Property4);
  238. if(SUCCESS_RET != ret)
  239. {
  240. HAL_Printf("Update Property1 Property4 fail:%d\n", ret);
  241. goto end;
  242. }
  243. while (ACK_NONE == ack_update) {
  244. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  245. }
  246. /* delete */
  247. ack_update = ACK_NONE;
  248. ret = IOT_Shadow_Delete(shadow_client, _update_ack_cb, time_sec, &ack_update, 2, Property1, Property2);
  249. if(SUCCESS_RET != ret)
  250. {
  251. HAL_Printf("Delete Property1 Property2 fail:%d\n", ret);
  252. goto end;
  253. }
  254. while (ACK_NONE == ack_update) {
  255. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  256. }
  257. ack_update = ACK_NONE;
  258. ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
  259. while (ACK_NONE == ack_update) {
  260. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  261. }
  262. /* delete all */
  263. ack_update = ACK_NONE;
  264. ret = IOT_Shadow_Delete_All(shadow_client, _update_ack_cb, time_sec, &ack_update);
  265. if(SUCCESS_RET != ret)
  266. {
  267. HAL_Printf("Delete All fail:%d\n", ret);
  268. goto end;
  269. }
  270. while (ACK_NONE == ack_update) {
  271. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  272. }
  273. ack_update = ACK_NONE;
  274. ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
  275. while (ACK_NONE == ack_update) {
  276. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  277. }
  278. Property1->data = &num1;
  279. Property4->data = num4;
  280. Property5->data = &num5;
  281. Property6->data = num6;
  282. /* update */
  283. ack_update = ACK_NONE;
  284. ret = IOT_Shadow_Update_And_Reset_Version(shadow_client, _update_ack_cb, time_sec, &ack_update, 4, Property1, Property4, Property5, Property6);
  285. if(SUCCESS_RET != ret)
  286. {
  287. HAL_Printf("Update and Reset Ver fail:%d\n", ret);
  288. goto end;
  289. }
  290. while (ACK_NONE == ack_update) {
  291. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  292. }
  293. ack_update = ACK_NONE;
  294. ret = IOT_Shadow_Get_Sync(shadow_client, _update_ack_cb, time_sec, &ack_update);
  295. while (ACK_NONE == ack_update) {
  296. IOT_Shadow_Yield(shadow_client, MAX_WAIT_TIME_MS);
  297. }
  298. end:
  299. HAL_Free(Property1);
  300. HAL_Free(Property2);
  301. HAL_Free(Property3);
  302. HAL_Free(Property4);
  303. HAL_Free(Property5);
  304. HAL_Free(Property6);
  305. IOT_Shadow_Destroy(shadow_client);
  306. IOT_MQTT_Destroy(&mqtt_client);
  307. return;
  308. }
  309. static int shadow_test_example(int argc, char **argv)
  310. {
  311. rt_thread_t tid;
  312. int stack_size = 8192;
  313. if (2 == argc)
  314. {
  315. if (!strcmp("start", argv[1]))
  316. {
  317. if (1 == running_state)
  318. {
  319. HAL_Printf("shadow_test_example is already running\n");
  320. return 0;
  321. }
  322. }
  323. else if (!strcmp("stop", argv[1]))
  324. {
  325. if (0 == running_state)
  326. {
  327. HAL_Printf("shadow_test_example is already stopped\n");
  328. return 0;
  329. }
  330. running_state = 0;
  331. return 0;
  332. }
  333. else
  334. {
  335. HAL_Printf("Usage: shadow_test_example start/stop");
  336. return 0;
  337. }
  338. }
  339. else
  340. {
  341. HAL_Printf("Para err, usage: shadow_test_example start/stop");
  342. return 0;
  343. }
  344. tid = rt_thread_create("shadow_test", (void (*)(void *))shadow_test_thread,
  345. NULL, stack_size, RT_THREAD_PRIORITY_MAX / 2 - 1, 100);
  346. if (tid != RT_NULL)
  347. {
  348. rt_thread_startup(tid);
  349. }
  350. return 0;
  351. }
  352. #ifdef RT_USING_FINSH
  353. #include <finsh.h>
  354. FINSH_FUNCTION_EXPORT(shadow_test_example, startup mqtt shadow example);
  355. #endif
  356. #ifdef FINSH_USING_MSH
  357. MSH_CMD_EXPORT(shadow_test_example, startup mqtt shadow example);
  358. #endif