protocol.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  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_TN.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. extern SYSCFG syscfg;
  107. extern wm_Def workmode;
  108. extern char Demo_Mode_NEW;
  109. /**
  110. * @brief 生成新版的状态数据包
  111. *
  112. * @return char* 直接以字符串的形式返回
  113. */
  114. char *makeJson_NEW(uint8_t type)
  115. {
  116. char cache[128] = {0};
  117. // 创建根JSON对象
  118. cJSON *root = cJSON_CreateObject();
  119. if (!root)
  120. return NULL;
  121. // 添加字符串类型字段
  122. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  123. if (type == 1)
  124. {
  125. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  126. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  127. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  128. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  129. cJSON_AddStringToObject(root, "RESULT", res_c.RESULT);
  130. }
  131. cJSON_AddStringToObject(root, "SIM", device_status.iccid);
  132. // sprintf(cache, "%d", RSSI_TO_DBM(atoi(device_status.csq)));
  133. cJSON_AddStringToObject(root, "SIGNAL", device_status.csq);
  134. sprintf(cache, "%s,%s", device_status.lng, device_status.lat);
  135. cJSON_AddStringToObject(root, "LOCATION", cache);
  136. (atoi(device_status.net) == 0) ? cJSON_AddStringToObject(root, "STATUS", "STATUS_ONLINE") : cJSON_AddStringToObject(root, "STATUS", "STATUS_OFFLINE");
  137. cJSON_AddStringToObject(root, "STATUS_DESCRIPTION", "设备运行正常"); // 需要修改 // 但是好像没有异常的时候啊 先不改
  138. GetTiming(cache, sizeof(cache));
  139. cJSON_AddStringToObject(root, "UPDATE_DATE", cache);
  140. // 添加数值类型字段
  141. cJSON_AddNumberToObject(root, "VOLTAGE", atof(device_status.voltage));
  142. cJSON_AddNumberToObject(root, "CURRENT", atof(device_status.power));
  143. cJSON_AddNumberToObject(root, "TEMPERATURE", atof(sensor[s_Temp].eValue));
  144. cJSON_AddNumberToObject(root, "HUMIDITY", atof(sensor[s_Humi].eValue));
  145. cJSON_AddNumberToObject(root, "TPS", device_status.temp_status);
  146. cJSON_AddNumberToObject(root, "RPS", device_status.rain_status);
  147. cJSON_AddNumberToObject(root, "DEMO", Demo_Mode_NEW);
  148. cJSON_AddNumberToObject(root, "RAY_CNT", RayTigCnt);
  149. sprintf(cache, "%d", syscfg.photim);
  150. cJSON_AddStringToObject(root, "PHO_T", cache);
  151. sprintf(cache, "%d", syscfg.dattim);
  152. cJSON_AddStringToObject(root, "DATT", cache);
  153. sprintf(cache, "%d", device_status.collecting_sh1);
  154. cJSON_AddStringToObject(root, "START_TIME", cache);
  155. sprintf(cache, "%d", device_status.collecting_eh1);
  156. cJSON_AddStringToObject(root, "END_TIME", cache);
  157. Get_work_mode();
  158. sprintf(cache, "%d", workmode);
  159. cJSON_AddStringToObject(root, "CONTROL", cache);
  160. sprintf(cache, "%s-%s", VERSION_NUM, device_status.driver_4g);
  161. cJSON_AddStringToObject(root, "VERSION", cache);
  162. cJSON_AddStringToObject(root, "HISTORY_DATA", "0");
  163. if (type == 2 || type == 3 || type == 4)
  164. {
  165. if (type != 4)
  166. {
  167. RayTigCnt = 0; // 清空计数
  168. RTC_SET_TigVal(0); // 清空计数
  169. CamFree = 1; // 拍照完成
  170. }
  171. if (type == 4)
  172. {
  173. cJSON_AddStringToObject(root, "PIC_RES", "START");
  174. if (device_status.camsta == 0)
  175. {
  176. cJSON_AddStringToObject(root, "CAM_STA", "linkup");
  177. }
  178. else
  179. {
  180. cJSON_AddStringToObject(root, "CAM_STA", "linkdown");
  181. }
  182. }
  183. else
  184. {
  185. (type == 2) ? cJSON_AddStringToObject(root, "PIC_RES", "SUCC") : cJSON_AddStringToObject(root, "PIC_RES", "FAIL");
  186. }
  187. }
  188. /**
  189. * @brief 250818 新增了土壤要素
  190. *
  191. */
  192. char sensor_status = sensor[s_Stemp1].online +
  193. sensor[s_Shumi1].online +
  194. sensor[s_Stemp2].online +
  195. sensor[s_Shumi2].online +
  196. sensor[s_Stemp3].online +
  197. sensor[s_Shumi3].online +
  198. sensor[s_S_PH].online +
  199. sensor[s_S_sail].online +
  200. sensor[s_SWP].online;
  201. if (type == 0 && sensor_status > 0)
  202. {
  203. // 添加ENV数组
  204. cJSON *env_array = cJSON_CreateArray();
  205. if (env_array)
  206. {
  207. // 土壤温度1
  208. cJSON *item1 = cJSON_CreateArray();
  209. cJSON_AddItemToArray(item1, cJSON_CreateString(sensor[s_Stemp1].eName));
  210. cJSON_AddItemToArray(item1, cJSON_CreateString(sensor[s_Stemp1].eValue));
  211. cJSON_AddItemToArray(item1, cJSON_CreateString("℃"));
  212. cJSON_AddItemToArray(env_array, item1);
  213. // 土壤湿度1
  214. cJSON *item2 = cJSON_CreateArray();
  215. cJSON_AddItemToArray(item2, cJSON_CreateString(sensor[s_Shumi1].eName));
  216. cJSON_AddItemToArray(item2, cJSON_CreateString(sensor[s_Shumi1].eValue));
  217. cJSON_AddItemToArray(item2, cJSON_CreateString("%"));
  218. cJSON_AddItemToArray(env_array, item2);
  219. // 土壤温度2
  220. cJSON *item3 = cJSON_CreateArray();
  221. cJSON_AddItemToArray(item3, cJSON_CreateString(sensor[s_Stemp2].eName));
  222. cJSON_AddItemToArray(item3, cJSON_CreateString(sensor[s_Stemp2].eValue));
  223. cJSON_AddItemToArray(item3, cJSON_CreateString("℃"));
  224. cJSON_AddItemToArray(env_array, item3);
  225. // 土壤湿度2
  226. cJSON *item4 = cJSON_CreateArray();
  227. cJSON_AddItemToArray(item4, cJSON_CreateString(sensor[s_Shumi2].eName));
  228. cJSON_AddItemToArray(item4, cJSON_CreateString(sensor[s_Shumi2].eValue));
  229. cJSON_AddItemToArray(item4, cJSON_CreateString("%"));
  230. cJSON_AddItemToArray(env_array, item4);
  231. // 土壤温度3
  232. cJSON *item5 = cJSON_CreateArray();
  233. cJSON_AddItemToArray(item5, cJSON_CreateString(sensor[s_Stemp3].eName));
  234. cJSON_AddItemToArray(item5, cJSON_CreateString(sensor[s_Stemp3].eValue));
  235. cJSON_AddItemToArray(item5, cJSON_CreateString("℃"));
  236. cJSON_AddItemToArray(env_array, item5);
  237. // 土壤湿度3
  238. cJSON *item6 = cJSON_CreateArray();
  239. cJSON_AddItemToArray(item6, cJSON_CreateString(sensor[s_Shumi3].eName));
  240. cJSON_AddItemToArray(item6, cJSON_CreateString(sensor[s_Shumi3].eValue));
  241. cJSON_AddItemToArray(item6, cJSON_CreateString("%"));
  242. cJSON_AddItemToArray(env_array, item6);
  243. // 土壤PH值
  244. cJSON *item7 = cJSON_CreateArray();
  245. cJSON_AddItemToArray(item7, cJSON_CreateString(sensor[s_S_PH].eName));
  246. cJSON_AddItemToArray(item7, cJSON_CreateString(sensor[s_S_PH].eValue));
  247. cJSON_AddItemToArray(item7, cJSON_CreateString("PH"));
  248. cJSON_AddItemToArray(env_array, item7);
  249. // 盐度
  250. cJSON *item8 = cJSON_CreateArray();
  251. cJSON_AddItemToArray(item8, cJSON_CreateString(sensor[s_S_sail].eName));
  252. cJSON_AddItemToArray(item8, cJSON_CreateString(sensor[s_S_sail].eValue));
  253. cJSON_AddItemToArray(item8, cJSON_CreateString("mg/L"));
  254. cJSON_AddItemToArray(env_array, item8);
  255. // SWP
  256. cJSON *item9 = cJSON_CreateArray();
  257. cJSON_AddItemToArray(item9, cJSON_CreateString(sensor[s_SWP].eName));
  258. cJSON_AddItemToArray(item9, cJSON_CreateString(sensor[s_SWP].eValue));
  259. cJSON_AddItemToArray(item9, cJSON_CreateString("KPA"));
  260. cJSON_AddItemToArray(env_array, item9);
  261. cJSON_AddItemToObject(root, "ENV", env_array);
  262. }
  263. }
  264. /**
  265. * @brief 250818 新增了土壤要素
  266. *
  267. */
  268. // 生成紧凑型JSON字符串
  269. char *json_str = cJSON_PrintUnformatted(root);
  270. // 清理cJSON对象
  271. cJSON_Delete(root);
  272. DTU_Write(json_str);
  273. rt_kprintf("DTU_Write > %s \n\n", json_str);
  274. if (json_str)
  275. {
  276. free(json_str);
  277. }
  278. return NULL; // 返回的字符串需由调用者释放
  279. }
  280. /**
  281. * @brief 组包返回执行结果
  282. *
  283. * @param result
  284. * @return char* 一定要记得释放指针
  285. */
  286. char *ReportRes(uint8_t result)
  287. {
  288. // 创建根JSON对象
  289. cJSON *root = cJSON_CreateObject();
  290. if (!root)
  291. {
  292. rt_kprintf("Failed to create JSON root\n");
  293. return NULL;
  294. }
  295. if (strstr(res_c.COMMAND, "00") == NULL)
  296. {
  297. return NULL;
  298. }
  299. // 添加字段到根对象
  300. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  301. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  302. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  303. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  304. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  305. result ? cJSON_AddStringToObject(root, "RESULT", "SUCC") : cJSON_AddStringToObject(root, "RESULT", "FAIL");
  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. return NULL;
  317. }
  318. /**
  319. * @brief 回复结果
  320. *
  321. */
  322. static void Report_setpara(void)
  323. {
  324. // 创建根JSON对象
  325. cJSON *root = cJSON_CreateObject();
  326. if (!root)
  327. {
  328. rt_kprintf("Failed to create JSON root\n");
  329. return;
  330. }
  331. if (strstr(res_c.COMMAND, "00") == NULL)
  332. {
  333. return;
  334. }
  335. // 添加字段到根对象
  336. cJSON_AddStringToObject(root, "DEVICE_SERIAL_NUMBER", device_status.imei);
  337. cJSON_AddStringToObject(root, "ACTION_ID", res_c.ACTION_ID);
  338. cJSON_AddStringToObject(root, "COMMAND", res_c.COMMAND);
  339. GetTiming(res_c.TIMING, sizeof(res_c.TIMING));
  340. cJSON_AddStringToObject(root, "TIMING", res_c.TIMING);
  341. cJSON_AddStringToObject(root, "RESULT", "SUCC");
  342. cJSON_AddNumberToObject(root, "CONTROL", limit.LuxEN);
  343. char cache_0[8] = {0};
  344. char cache_1[8] = {0};
  345. sprintf(cache_0, "%d", device_status.collecting_sh1);
  346. sprintf(cache_1, "%d", device_status.collecting_eh1);
  347. cJSON_AddStringToObject(root, "START_TIME", cache_0);
  348. cJSON_AddStringToObject(root, "END_TIME", cache_1);
  349. sprintf(cache_0, "%d", syscfg.photim);
  350. sprintf(cache_1, "%d", syscfg.dattim);
  351. cJSON_AddStringToObject(root, "PHO_T", cache_0);
  352. cJSON_AddStringToObject(root, "DATT", cache_1);
  353. // 将JSON对象转换为字符串(格式化输出)
  354. char *json_str = cJSON_PrintUnformatted(root);
  355. // 清理cJSON对象
  356. cJSON_Delete(root);
  357. DTU_Write(json_str);
  358. rt_kprintf("DTU_Write > %s \n\n", json_str);
  359. if (json_str)
  360. {
  361. free(json_str);
  362. }
  363. }
  364. /**
  365. * @brief 执行新协议下发的指令 dev_setpara
  366. *
  367. * @param cmd json字符串
  368. */
  369. static void exe_dev_setpara(char *cmd)
  370. {
  371. // 解析JSON根对象
  372. cJSON *root = cJSON_Parse(cmd);
  373. if (root == NULL)
  374. {
  375. const char *error_ptr = cJSON_GetErrorPtr();
  376. if (error_ptr != NULL)
  377. {
  378. rt_kprintf("JSON解析错误: %s\n", error_ptr);
  379. }
  380. return;
  381. }
  382. /**
  383. * @brief 应用模式
  384. *
  385. */
  386. cJSON *CONTROL = cJSON_GetObjectItemCaseSensitive(root, "CONTROL");
  387. if (CONTROL != NULL)
  388. {
  389. char temp = cjson_getval(CONTROL);
  390. if (temp >= 2)
  391. {
  392. rt_kprintf("错误的CONTROL: %d\n", temp);
  393. cJSON_Delete(root);
  394. return;
  395. }
  396. else
  397. {
  398. syscfg.en_tigmode = temp;
  399. ef_set_env_blob("syscfg", (const char *)&syscfg, sizeof(syscfg));
  400. rt_kprintf("Change Workmod %d OK\n", temp);
  401. LOG_I("CONTROL: %d\n", temp);
  402. }
  403. }
  404. /**
  405. * @brief 开始时间
  406. *
  407. */
  408. cJSON *START_TIME = cJSON_GetObjectItemCaseSensitive(root, "START_TIME");
  409. if (cJSON_IsString(START_TIME) && (strlen(START_TIME->valuestring) < 3))
  410. {
  411. char temp = cjson_getval(START_TIME);
  412. if (temp >= 0 && temp <= 24)
  413. {
  414. device_status.collecting_sh1 = temp;
  415. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  416. LOG_I("START_TIME: %s\n", START_TIME->valuestring);
  417. }
  418. else
  419. {
  420. LOG_E("时控开始设置错误!!!");
  421. }
  422. }
  423. /**
  424. * @brief 结束时间
  425. *
  426. */
  427. cJSON *END_TIME = cJSON_GetObjectItemCaseSensitive(root, "END_TIME");
  428. if (cJSON_IsString(END_TIME) && (strlen(START_TIME->valuestring) < 3))
  429. {
  430. char temp = cjson_getval(END_TIME);
  431. if (temp >= 0 && temp <= 24)
  432. {
  433. device_status.collecting_eh1 = temp;
  434. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  435. LOG_I("END_TIME: %s\n", END_TIME->valuestring);
  436. }
  437. else
  438. {
  439. LOG_E("时控结束设置错误!!!");
  440. }
  441. }
  442. /**
  443. * @brief 图片间隔
  444. *
  445. */
  446. cJSON *PHO_T = cJSON_GetObjectItemCaseSensitive(root, "PHO_T");
  447. if (cJSON_IsString(PHO_T))
  448. {
  449. char temp = cjson_getval(PHO_T);
  450. if (temp >= 5 && temp <= 60*8)
  451. {
  452. syscfg.photim = temp;
  453. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  454. LOG_I("照片上传间隔:%d\n", temp);
  455. }
  456. else
  457. {
  458. LOG_E("照片上传间隔设置错误!!!\n");
  459. }
  460. }
  461. /**
  462. * @brief 数据间隔
  463. *
  464. */
  465. cJSON *DATT = cJSON_GetObjectItemCaseSensitive(root, "DATT");
  466. if (cJSON_IsString(DATT) && (strlen(DATT->valuestring) < 3))
  467. {
  468. char temp = cjson_getval(DATT);
  469. if (temp >= 5 && temp <= 60*8)
  470. {
  471. syscfg.dattim = temp;
  472. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  473. LOG_I("DATT: %s\n", DATT->valuestring);
  474. }
  475. else
  476. {
  477. LOG_E("数据上传间隔设置错误!!!\n");
  478. }
  479. }
  480. cJSON_Delete(root);
  481. Report_setpara();
  482. }
  483. /**
  484. * @brief 执行具体的指令 并回复结果
  485. *
  486. */
  487. static void execute_NewCmd(char *cmd)
  488. {
  489. if (atoi(res_c.COMMAND) > dev_typemax)
  490. {
  491. rt_kprintf("execute_NewCmd Err %s \n", res_c.COMMAND);
  492. return;
  493. }
  494. switch (atoi(res_c.COMMAND))
  495. {
  496. case dev_on:
  497. Recode_e_code(e_CMD_list, dev_on, "下发指令执行");
  498. device_status.ds = ON;
  499. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  500. ef_get_env_blob("ds", &device_status.ds, sizeof(device_status.ds), NULL);
  501. if (device_status.ds == ON)
  502. {
  503. rt_kprintf("dev_on execute\n");
  504. ReportRes(1);
  505. }
  506. else
  507. {
  508. ReportRes(0);
  509. device_status.ds = ON;
  510. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  511. }
  512. break;
  513. case dev_off:
  514. Recode_e_code(e_CMD_list, dev_off, "下发指令执行");
  515. device_status.ds = OFF;
  516. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  517. ef_get_env_blob("ds", &device_status.ds, sizeof(device_status.ds), NULL);
  518. if (device_status.ds == OFF)
  519. {
  520. rt_kprintf("dev_off execute\n");
  521. ReportRes(1);
  522. }
  523. else
  524. {
  525. ReportRes(0);
  526. device_status.ds = OFF;
  527. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  528. }
  529. break;
  530. case dev_reboot:
  531. Recode_e_code(e_CMD_list, dev_reboot, "下发指令执行");
  532. ReportRes(1);
  533. rt_kprintf("dev_reboot execute\n");
  534. rt_hw_cpu_reset();
  535. break;
  536. case dev_takepho:
  537. Recode_e_code(e_CMD_list, dev_takepho, "下发指令执行");
  538. jts.takephoto_test = ON;
  539. ReportRes(1);
  540. rt_kprintf("dev_takepho execute\n");
  541. break;
  542. case dev_sta:
  543. Recode_e_code(e_CMD_list, dev_sta, "下发指令执行");
  544. rt_kprintf("dev_sta execute\n");
  545. makeJson_NEW(1);
  546. break;
  547. case dev_readcfg:
  548. Recode_e_code(e_CMD_list, dev_readcfg, "下发指令执行");
  549. // rtu进行回复
  550. break;
  551. case dev_setcfg:
  552. Recode_e_code(e_CMD_list, dev_setcfg, "下发指令执行");
  553. // rtu进行回复
  554. break;
  555. case dev_setpara:
  556. Recode_e_code(e_CMD_list, dev_setpara, "下发指令执行");
  557. exe_dev_setpara(cmd);
  558. break;
  559. default:
  560. break;
  561. }
  562. }
  563. /**
  564. * @brief 解析新协议的指令
  565. *
  566. * @param cmd 待解析的JSON字符串
  567. */
  568. void prase_NewCmd(char *cmd)
  569. {
  570. // 校验输入有效性
  571. if (cmd == NULL)
  572. {
  573. rt_kprintf("输入字符串为空\n");
  574. return;
  575. }
  576. // 解析JSON根对象
  577. cJSON *root = cJSON_Parse(cmd);
  578. if (root == NULL)
  579. {
  580. const char *error_ptr = cJSON_GetErrorPtr();
  581. if (error_ptr != NULL)
  582. {
  583. rt_kprintf("JSON解析错误: %s\n", error_ptr);
  584. }
  585. return;
  586. }
  587. // 解析设备序列号
  588. cJSON *device_sn = cJSON_GetObjectItemCaseSensitive(root, "DEVICE_SERIAL_NUMBER");
  589. if (cJSON_IsString(device_sn) && (device_sn->valuestring != NULL))
  590. {
  591. rt_kprintf("设备序列号: %s\n", device_sn->valuestring);
  592. if (strlen(device_sn->valuestring) != 15)
  593. {
  594. rt_kprintf("错误的序列号: %s %d\n", device_sn->valuestring, strlen(device_sn->valuestring));
  595. cJSON_Delete(root);
  596. return;
  597. }
  598. }
  599. else
  600. {
  601. rt_kprintf("未找到DEVICE_SERIAL_NUMBER字段或类型错误\n");
  602. cJSON_Delete(root);
  603. return;
  604. }
  605. // 解析指令ID
  606. cJSON *action_id = cJSON_GetObjectItemCaseSensitive(root, "ACTION_ID");
  607. if (cJSON_IsString(action_id) && (action_id->valuestring != NULL))
  608. {
  609. rt_kprintf("指令ID: %s\n", action_id->valuestring);
  610. sprintf(res_c.ACTION_ID, "%s", action_id->valuestring);
  611. }
  612. else
  613. {
  614. rt_kprintf("未找到ACTION_ID字段或类型错误\n");
  615. }
  616. // 解析指令代码
  617. cJSON *command = cJSON_GetObjectItemCaseSensitive(root, "COMMAND");
  618. if (cJSON_IsString(command) && (command->valuestring != NULL))
  619. {
  620. rt_kprintf("指令代码: %s\n", command->valuestring);
  621. if (atoi(command->valuestring) >= dev_typemax)
  622. {
  623. rt_kprintf("错误的指令代码: %s\n", command->valuestring);
  624. }
  625. else
  626. {
  627. sprintf(res_c.COMMAND, "%s", command->valuestring);
  628. }
  629. }
  630. else
  631. {
  632. rt_kprintf("未找到COMMAND字段或类型错误\n");
  633. }
  634. // 解析执行时间
  635. cJSON *timing = cJSON_GetObjectItemCaseSensitive(root, "TIMING");
  636. if (cJSON_IsString(timing) && (timing->valuestring != NULL))
  637. {
  638. rt_kprintf("执行时间: %s\n", timing->valuestring);
  639. }
  640. else
  641. {
  642. rt_kprintf("未找到TIMING字段或类型错误\n");
  643. }
  644. // 释放JSON对象
  645. cJSON_Delete(root);
  646. /*** 开始执行具体指令 ***/
  647. execute_NewCmd(cmd);
  648. /*** 开始执行具体指令 ***/
  649. }