protocol.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-03-27 RuoFeng the first version
  9. */
  10. /*********************↑ declaration ↑************************/
  11. /**
  12. *
  13. *
  14. *
  15. *
  16. * */
  17. /*********************↓ define ↓************************/
  18. #define DBG_ENABLE
  19. #define DBG_COLOR
  20. #define DBG_TAG "tn"
  21. #define DBG_LEVEL DBG_INFO
  22. #include <rtdbg.h>
  23. #define RSSI_TO_DBM(rssi) (2 * (rssi) - 113)
  24. /*********************↑ define ↑************************/
  25. /**
  26. *
  27. *
  28. *
  29. *
  30. * */
  31. /*********************↓ include ↓************************/
  32. #include <rtthread.h>
  33. #include "rs485.h"
  34. #include "dtu_uart2.h"
  35. #include "string.h"
  36. #include "control.h"
  37. #include <Work_SY2.h>
  38. #include <easyflash.h>
  39. #include "protocol.h"
  40. #include "test.h"
  41. #include "cJSON.h"
  42. /*********************↑ include ↑************************/
  43. /**
  44. *
  45. *
  46. *
  47. *
  48. * */
  49. /*********************↓ extern ↓************************/
  50. extern uint8_t ReFlash_RTC(void);
  51. extern Device_Status_typedef device_status;
  52. extern RTC_DateTypeDef GetDate;
  53. extern RTC_TimeTypeDef GetTime;
  54. extern Sensor sensor[MAX_SENSOR_NUM];
  55. extern JD_Test_Sta jts;
  56. extern int cjson_getval(cJSON *json);
  57. extern Limit limit;
  58. extern uint16_t RayTigCnt;
  59. extern char CamFree;
  60. /*********************↑ extern ↑************************/
  61. /**
  62. *
  63. *
  64. *
  65. *
  66. * */
  67. /********************↓ declaration ↓***********************/
  68. /********************↑ declaration ↑***********************/
  69. /**
  70. *
  71. *
  72. *
  73. *
  74. * */
  75. /*********************↓ global variables ↓************************/
  76. static struct RES_Type res_c = {0};
  77. /*********************↑ global variables ↑************************/
  78. /**
  79. *
  80. *
  81. *
  82. *
  83. * */
  84. /**
  85. * @brief Get the Timing object 获取时间戳
  86. *
  87. * @param str
  88. */
  89. void GetTiming(char *str, char len)
  90. {
  91. ReFlash_RTC();
  92. if (len < 28)
  93. {
  94. rt_kprintf("GetTiming > str so short %d\n", len);
  95. return;
  96. }
  97. sprintf(str, "%04d-%02d-%02dT%02d:%02d:%02d.%03d",
  98. (GetDate.Year % 2000) + 2000,
  99. GetDate.Month,
  100. GetDate.Date,
  101. GetTime.Hours,
  102. GetTime.Minutes,
  103. GetTime.Seconds,
  104. 0);
  105. }
  106. /**
  107. * @brief Get the now temphumi object
  108. *
  109. * @param temp
  110. * @param humi
  111. */
  112. void get_now_temphumi(char *temp_c , char *humi_c)
  113. {
  114. if (sensor[s_Temp].online && strstr(sensor[s_Temp].eValue, "99.99") == NULL)
  115. {
  116. sprintf(temp_c , "%s" , sensor[s_Temp].eValue);
  117. }
  118. else
  119. {
  120. sprintf(temp_c , "%s" , device_status.tempture);
  121. }
  122. if (sensor[s_Humi].online && strstr(sensor[s_Humi].eValue, "99.99") == NULL)
  123. {
  124. sprintf(humi_c , "%s" , sensor[s_Humi].eValue);
  125. }
  126. else
  127. {
  128. sprintf(humi_c , "%s" , device_status.humidity);
  129. }
  130. }
  131. extern char Demo_Mode_NEW;
  132. extern SYSCFG syscfg;
  133. extern wm_Def workmode;
  134. /**
  135. * @brief 生成新版的状态数据包
  136. *
  137. * @return char* 直接以字符串的形式返回
  138. */
  139. char *makeJson_NEW(uint8_t type)
  140. {
  141. char cache[128] = {0};
  142. // 创建根JSON对象
  143. cJSON *root = cJSON_CreateObject();
  144. if (!root)
  145. return NULL;
  146. // 添加字符串类型字段
  147. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  148. if (type == 1)
  149. {
  150. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  151. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  152. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  153. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  154. cJSON_AddStringToObject(root, "RESULT", res_c.RESULT);
  155. }
  156. cJSON_AddStringToObject(root, "SIM", device_status.iccid);
  157. // sprintf(cache, "%d", RSSI_TO_DBM(atoi(device_status.csq)));
  158. cJSON_AddStringToObject(root, "SIGNAL", device_status.csq);
  159. sprintf(cache, "%s,%s", device_status.lng, device_status.lat);
  160. cJSON_AddStringToObject(root, "LOCATION", cache);
  161. (atoi(device_status.net) == 0) ? cJSON_AddStringToObject(root, "STATUS", "STATUS_ONLINE") : cJSON_AddStringToObject(root, "STATUS", "STATUS_OFFLINE");
  162. cJSON_AddStringToObject(root, "STATUS_DESCRIPTION", "设备运行正常"); // 需要修改 // 但是好像没有异常的时候啊 先不改
  163. GetTiming(cache, sizeof(cache));
  164. cJSON_AddStringToObject(root, "UPDATE_DATE", cache);
  165. // 添加数值类型字段
  166. cJSON_AddNumberToObject(root, "VOLTAGE", atof(device_status.voltage));
  167. cJSON_AddNumberToObject(root, "CURRENT", atof(device_status.power));
  168. char temp_c[6] = {0};
  169. char humi_c[6] = {0};
  170. get_now_temphumi(temp_c , humi_c);
  171. cJSON_AddNumberToObject(root, "TEMPERATURE", atof(temp_c));
  172. cJSON_AddNumberToObject(root, "HUMIDITY", atof(humi_c));
  173. // cJSON_AddNumberToObject(root, "TPS", device_status.temp_status);
  174. // cJSON_AddNumberToObject(root, "RPS", device_status.rain_status);
  175. cJSON_AddNumberToObject(root, "DEMO", Demo_Mode_NEW);
  176. cJSON_AddNumberToObject(root, "REMAIN", Get_REMAIN());
  177. sprintf(cache, "%d", syscfg.dattim);
  178. cJSON_AddStringToObject(root, "DATT", cache);
  179. sprintf(cache, "%d", syscfg.pho_inr_day);
  180. cJSON_AddStringToObject(root, "PHO_INR_DAY", cache);
  181. sprintf(cache, "%d", syscfg.pho_t_hour);
  182. cJSON_AddStringToObject(root, "PHO_T_HOUR", cache);
  183. sprintf(cache, "%d", syscfg.pho_t_min);
  184. cJSON_AddStringToObject(root, "PHO_T_MIN", cache);
  185. sprintf(cache, "%d", limit.temhumEN);
  186. cJSON_AddStringToObject(root, "TEMP_LIMIT", cache);
  187. sprintf(cache, "%d", limit.temp_up);
  188. cJSON_AddStringToObject(root, "TEMP_UP", cache);
  189. sprintf(cache, "%d", limit.temp_dw);
  190. cJSON_AddStringToObject(root, "TEMP_DOWN", cache);
  191. Get_work_mode();
  192. sprintf(cache, "%d", workmode);
  193. cJSON_AddStringToObject(root, "CONTROL", cache);
  194. sprintf(cache, "%s-%s", VERSION_NUM, device_status.driver_4g);
  195. cJSON_AddStringToObject(root, "VERSION", cache);
  196. cJSON_AddStringToObject(root, "HISTORY_DATA", "0");
  197. if (type == 2 || type == 3 || type == 4)
  198. {
  199. if (type != 4)
  200. {
  201. CamFree = 1; // 拍照完成
  202. }
  203. if(type == 4)
  204. {
  205. cJSON_AddStringToObject(root, "PIC_RES", "START");
  206. if(device_status.camsta == 0)
  207. {
  208. cJSON_AddStringToObject(root, "CAM_STA", "linkup");
  209. }
  210. else
  211. {
  212. cJSON_AddStringToObject(root, "CAM_STA", "linkdown");
  213. }
  214. }
  215. else
  216. {
  217. (type == 2) ? cJSON_AddStringToObject(root, "PIC_RES", "SUCC") : cJSON_AddStringToObject(root, "PIC_RES", "FAIL");
  218. }
  219. }
  220. // 生成紧凑型JSON字符串
  221. char *json_str = cJSON_PrintUnformatted(root);
  222. // 清理cJSON对象
  223. cJSON_Delete(root);
  224. DTU_Write(json_str);
  225. rt_kprintf("DTU_Write > %s \n\n", json_str);
  226. if (json_str)
  227. {
  228. free(json_str);
  229. }
  230. return NULL; // 返回的字符串需由调用者释放
  231. }
  232. /**
  233. * @brief 组包返回执行结果
  234. *
  235. * @param result
  236. * @return char* 一定要记得释放指针
  237. */
  238. char *ReportRes(uint8_t result)
  239. {
  240. // 创建根JSON对象
  241. cJSON *root = cJSON_CreateObject();
  242. if (!root)
  243. {
  244. rt_kprintf("Failed to create JSON root\n");
  245. return NULL;
  246. }
  247. if (strstr(res_c.COMMAND, "00") == NULL)
  248. {
  249. return NULL;
  250. }
  251. // 添加字段到根对象
  252. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  253. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  254. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  255. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  256. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  257. result ? cJSON_AddStringToObject(root, "RESULT", "SUCC") : cJSON_AddStringToObject(root, "RESULT", "FAIL");
  258. // 将JSON对象转换为字符串(格式化输出)
  259. char *json_str = cJSON_PrintUnformatted(root);
  260. // 清理cJSON对象
  261. cJSON_Delete(root);
  262. DTU_Write(json_str);
  263. rt_kprintf("DTU_Write > %s \n\n", json_str);
  264. if (json_str)
  265. {
  266. free(json_str);
  267. }
  268. return NULL;
  269. }
  270. /**
  271. * @brief 回复结果
  272. *
  273. */
  274. static void Report_setpara(void)
  275. {
  276. // 创建根JSON对象
  277. cJSON *root = cJSON_CreateObject();
  278. if (!root)
  279. {
  280. rt_kprintf("Failed to create JSON root\n");
  281. return;
  282. }
  283. if (strstr(res_c.COMMAND, "00") == NULL)
  284. {
  285. return;
  286. }
  287. // 添加字段到根对象
  288. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  289. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  290. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  291. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  292. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  293. cJSON_AddStringToObject(root, "RESULT", "SUCC");
  294. cJSON_AddNumberToObject(root, "CONTROL", limit.LuxEN);
  295. char cache_0[8] = {0};
  296. char cache_1[8] = {0};
  297. char cache_2[8] = {0};
  298. sprintf(cache_0, "%d", syscfg.pho_inr_day);
  299. sprintf(cache_1, "%d", syscfg.pho_t_hour);
  300. sprintf(cache_2, "%d", syscfg.pho_t_min);
  301. cJSON_AddStringToObject(root, "PHO_INR_DAY", cache_0);
  302. cJSON_AddStringToObject(root, "PHO_T_HOUR", cache_1);
  303. cJSON_AddStringToObject(root, "PHO_T_MIN", cache_2);
  304. sprintf(cache_0, "%d", syscfg.dattim);
  305. cJSON_AddStringToObject(root, "DATT", cache_0);
  306. // 将JSON对象转换为字符串(格式化输出)
  307. char *json_str = cJSON_PrintUnformatted(root);
  308. // 清理cJSON对象
  309. cJSON_Delete(root);
  310. DTU_Write(json_str);
  311. rt_kprintf("DTU_Write > %s \n\n", json_str);
  312. if (json_str)
  313. {
  314. free(json_str);
  315. }
  316. }
  317. /**
  318. * @brief 执行新协议下发的指令 dev_setpara
  319. *
  320. * @param cmd json字符串
  321. */
  322. static void exe_dev_setpara(char *cmd)
  323. {
  324. // 解析JSON根对象
  325. cJSON *root = cJSON_Parse(cmd);
  326. if (root == NULL)
  327. {
  328. const char *error_ptr = cJSON_GetErrorPtr();
  329. if (error_ptr != NULL)
  330. {
  331. rt_kprintf("JSON解析错误: %s\n", error_ptr);
  332. }
  333. return;
  334. }
  335. /**
  336. * @brief 应用模式
  337. *
  338. */
  339. cJSON *CONTROL = cJSON_GetObjectItemCaseSensitive(root, "CONTROL");
  340. if (CONTROL != NULL)
  341. {
  342. char temp = cjson_getval(CONTROL);
  343. if (temp >= 2)
  344. {
  345. rt_kprintf("错误的CONTROL: %d\n", temp);
  346. cJSON_Delete(root);
  347. return;
  348. }
  349. else
  350. {
  351. syscfg.en_tigmode = temp;
  352. ef_set_env_blob("syscfg", (const char *)&syscfg, sizeof(syscfg));
  353. rt_kprintf("Change Workmod %d OK\n", temp);
  354. LOG_I("CONTROL: %d\n", temp);
  355. }
  356. }
  357. /**
  358. * @brief 开始时间
  359. *
  360. */
  361. cJSON *START_TIME = cJSON_GetObjectItemCaseSensitive(root, "START_TIME");
  362. if (cJSON_IsString(START_TIME) && (strlen(START_TIME->valuestring) < 3))
  363. {
  364. char temp = cjson_getval(START_TIME);
  365. if (temp >= 0 && temp <= 24)
  366. {
  367. device_status.collecting_sh1 = temp;
  368. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  369. LOG_I("START_TIME: %s\n", START_TIME->valuestring);
  370. }
  371. else
  372. {
  373. LOG_E("时控开始设置错误!!!");
  374. }
  375. }
  376. /**
  377. * @brief 结束时间
  378. *
  379. */
  380. cJSON *END_TIME = cJSON_GetObjectItemCaseSensitive(root, "END_TIME");
  381. if (cJSON_IsString(END_TIME) && (strlen(START_TIME->valuestring) < 3))
  382. {
  383. char temp = cjson_getval(END_TIME);
  384. if (temp >= 0 && temp <= 24)
  385. {
  386. device_status.collecting_eh1 = temp;
  387. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  388. LOG_I("END_TIME: %s\n", END_TIME->valuestring);
  389. }
  390. else
  391. {
  392. LOG_E("时控结束设置错误!!!");
  393. }
  394. }
  395. /**
  396. * @brief 图片间隔
  397. *
  398. */
  399. cJSON *PHO_T = cJSON_GetObjectItemCaseSensitive(root, "PHO_T");
  400. if (cJSON_IsString(PHO_T))
  401. {
  402. char temp = cjson_getval(PHO_T);
  403. if (temp >= 5 && temp <= 240)
  404. {
  405. syscfg.photim = temp;
  406. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  407. LOG_I("照片上传间隔:%d\n", temp);
  408. }
  409. else
  410. {
  411. LOG_E("照片上传间隔设置错误!!!\n");
  412. }
  413. }
  414. /**
  415. * @brief 数据间隔
  416. *
  417. */
  418. cJSON *DATT = cJSON_GetObjectItemCaseSensitive(root, "DATT");
  419. if (cJSON_IsString(DATT) && (strlen(DATT->valuestring) < 3))
  420. {
  421. char temp = cjson_getval(DATT);
  422. if (temp >= 10 && temp <= 120)
  423. {
  424. syscfg.dattim = temp;
  425. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  426. LOG_I("DATT: %s\n", DATT->valuestring);
  427. }
  428. else
  429. {
  430. LOG_E("数据上传间隔设置错误!!!\n");
  431. }
  432. }
  433. cJSON_Delete(root);
  434. Report_setpara();
  435. }
  436. /**
  437. * @brief 执行具体的指令 并回复结果
  438. *
  439. */
  440. static void execute_NewCmd(char *cmd)
  441. {
  442. if (atoi(res_c.COMMAND) > dev_typemax)
  443. {
  444. rt_kprintf("execute_NewCmd Err %s \n", res_c.COMMAND);
  445. return;
  446. }
  447. switch (atoi(res_c.COMMAND))
  448. {
  449. case dev_on:
  450. Recode_e_code(e_CMD_list, dev_on, "下发指令执行");
  451. device_status.ds = ON;
  452. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  453. ef_get_env_blob("ds", &device_status.ds, sizeof(device_status.ds), NULL);
  454. if (device_status.ds == ON)
  455. {
  456. rt_kprintf("dev_on execute\n");
  457. ReportRes(1);
  458. }
  459. else
  460. {
  461. ReportRes(0);
  462. device_status.ds = ON;
  463. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  464. }
  465. break;
  466. case dev_off:
  467. Recode_e_code(e_CMD_list, dev_off, "下发指令执行");
  468. device_status.ds = OFF;
  469. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  470. ef_get_env_blob("ds", &device_status.ds, sizeof(device_status.ds), NULL);
  471. if (device_status.ds == OFF)
  472. {
  473. rt_kprintf("dev_off execute\n");
  474. ReportRes(1);
  475. }
  476. else
  477. {
  478. ReportRes(0);
  479. device_status.ds = OFF;
  480. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  481. }
  482. break;
  483. case dev_reboot:
  484. Recode_e_code(e_CMD_list, dev_reboot, "下发指令执行");
  485. ReportRes(1);
  486. rt_kprintf("dev_reboot execute\n");
  487. rt_hw_cpu_reset();
  488. break;
  489. case dev_takepho:
  490. Recode_e_code(e_CMD_list, dev_takepho, "下发指令执行");
  491. jts.takephoto_test = ON;
  492. ReportRes(1);
  493. rt_kprintf("dev_takepho execute\n");
  494. break;
  495. case dev_sta:
  496. Recode_e_code(e_CMD_list, dev_sta, "下发指令执行");
  497. rt_kprintf("dev_sta execute\n");
  498. makeJson_NEW(1);
  499. break;
  500. case dev_readcfg:
  501. Recode_e_code(e_CMD_list, dev_readcfg, "下发指令执行");
  502. // rtu进行回复
  503. break;
  504. case dev_setcfg:
  505. Recode_e_code(e_CMD_list, dev_setcfg, "下发指令执行");
  506. // rtu进行回复
  507. break;
  508. case dev_setpara:
  509. Recode_e_code(e_CMD_list, dev_setpara, "下发指令执行");
  510. exe_dev_setpara(cmd);
  511. break;
  512. default:
  513. break;
  514. }
  515. }
  516. /**
  517. * @brief 解析新协议的指令
  518. *
  519. * @param cmd 待解析的JSON字符串
  520. */
  521. void prase_NewCmd(char *cmd)
  522. {
  523. // 校验输入有效性
  524. if (cmd == NULL)
  525. {
  526. rt_kprintf("输入字符串为空\n");
  527. return;
  528. }
  529. // 解析JSON根对象
  530. cJSON *root = cJSON_Parse(cmd);
  531. if (root == NULL)
  532. {
  533. const char *error_ptr = cJSON_GetErrorPtr();
  534. if (error_ptr != NULL)
  535. {
  536. rt_kprintf("JSON解析错误: %s\n", error_ptr);
  537. }
  538. return;
  539. }
  540. // 解析设备序列号
  541. cJSON *device_sn = cJSON_GetObjectItemCaseSensitive(root, "DEVICE_SERIAL_NUMBER");
  542. if (cJSON_IsString(device_sn) && (device_sn->valuestring != NULL))
  543. {
  544. rt_kprintf("设备序列号: %s\n", device_sn->valuestring);
  545. if (strlen(device_sn->valuestring) != 15)
  546. {
  547. rt_kprintf("错误的序列号: %s %d\n", device_sn->valuestring, strlen(device_sn->valuestring));
  548. cJSON_Delete(root);
  549. return;
  550. }
  551. }
  552. else
  553. {
  554. rt_kprintf("未找到DEVICE_SERIAL_NUMBER字段或类型错误\n");
  555. cJSON_Delete(root);
  556. return;
  557. }
  558. // 解析指令ID
  559. cJSON *action_id = cJSON_GetObjectItemCaseSensitive(root, "ACTION_ID");
  560. if (cJSON_IsString(action_id) && (action_id->valuestring != NULL))
  561. {
  562. rt_kprintf("指令ID: %s\n", action_id->valuestring);
  563. sprintf(res_c.ACTION_ID, "%s", action_id->valuestring);
  564. }
  565. else
  566. {
  567. rt_kprintf("未找到ACTION_ID字段或类型错误\n");
  568. }
  569. // 解析指令代码
  570. cJSON *command = cJSON_GetObjectItemCaseSensitive(root, "COMMAND");
  571. if (cJSON_IsString(command) && (command->valuestring != NULL))
  572. {
  573. rt_kprintf("指令代码: %s\n", command->valuestring);
  574. if (atoi(command->valuestring) >= dev_typemax)
  575. {
  576. rt_kprintf("错误的指令代码: %s\n", command->valuestring);
  577. }
  578. else
  579. {
  580. sprintf(res_c.COMMAND, "%s", command->valuestring);
  581. }
  582. }
  583. else
  584. {
  585. rt_kprintf("未找到COMMAND字段或类型错误\n");
  586. }
  587. // 解析执行时间
  588. cJSON *timing = cJSON_GetObjectItemCaseSensitive(root, "TIMING");
  589. if (cJSON_IsString(timing) && (timing->valuestring != NULL))
  590. {
  591. rt_kprintf("执行时间: %s\n", timing->valuestring);
  592. }
  593. else
  594. {
  595. rt_kprintf("未找到TIMING字段或类型错误\n");
  596. }
  597. // 释放JSON对象
  598. cJSON_Delete(root);
  599. /*** 开始执行具体指令 ***/
  600. execute_NewCmd(cmd);
  601. /*** 开始执行具体指令 ***/
  602. }