dtu_uart2.c 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-28 Administrator the first version
  9. */
  10. #include <rtthread.h>
  11. #include "hmi.h"
  12. #include <board.h>
  13. #include <rtdevice.h>
  14. #include "stdarg.h"
  15. #include "string.h"
  16. #include "stdio.h"
  17. #include "dtu_uart2.h"
  18. #include <cJSON.h>
  19. #include "control.h"
  20. #include "sht30_collect.h"
  21. #include <easyflash.h>
  22. #include "sound.h"
  23. #include <ymodem.h>
  24. #include "beep.h"
  25. #include "test.h"
  26. #define DBG_ENABLE
  27. #define DBG_COLOR
  28. #define DBG_TAG "dtu"
  29. #define DBG_LEVEL DBG_LOG
  30. #include <rtdbg.h> //must after of DBG_LVL, DBG_TAG or other options
  31. #define DTU_THREAD_PRIORITY 6 // 线程优先级
  32. #define DTU_THREAD_STACK_SIZE 2048 + 1024 // 线程栈空间大小
  33. #define DTU_THREAD_TIMESLICE 5 // 时间片
  34. Device_Status_typedef device_status;
  35. DataTemp data_arry;
  36. volatile sr_type screen_type = old;
  37. JD_Test_Sta jts;
  38. void list_mem(void);
  39. /* 串口接收消息结构*/
  40. struct rx_msg
  41. {
  42. rt_device_t dev;
  43. rt_size_t size;
  44. };
  45. /* 消息队列句柄 */
  46. static struct rt_messagequeue rx_mq_dtu;
  47. rt_thread_t dtu_recv_data = RT_NULL;
  48. rt_thread_t dtu_send_data = RT_NULL;
  49. rt_device_t dtuserial; /*串口设备句柄*/
  50. struct serial_configure dtuconfig = RT_SERIAL_CONFIG_DEFAULT; /*初始化配置参数*/
  51. static uint8_t makejson_sta = 0;
  52. /**
  53. * @brief 初始化用于与上层dtu通信的串口 - 串口2
  54. *
  55. * @return int 成功返回RT_EOK
  56. */
  57. static int DTU_uart2_init(void)
  58. {
  59. dtuserial = rt_device_find(DTU_UART_NAME);
  60. /*修改串口配置参数*/
  61. dtuconfig.baud_rate = BAUD_RATE_115200; // 修改波特率9600
  62. dtuconfig.data_bits = DATA_BITS_8; // 数据位8c
  63. dtuconfig.stop_bits = STOP_BITS_1; // 停止位1
  64. dtuconfig.bufsz = 1024; // 缓冲区1k
  65. dtuconfig.parity = PARITY_NONE; // 奇校验
  66. /* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
  67. rt_device_control(dtuserial, RT_DEVICE_CTRL_CONFIG, &dtuconfig);
  68. /* step4:打开串口设备。以DMA接收及轮询发送模式打开串口设备 */
  69. rt_device_open(dtuserial, RT_DEVICE_FLAG_DMA_RX);
  70. return RT_EOK;
  71. }
  72. /*数据发送*/
  73. /**
  74. * @brief 将组包完成后的json字符串发送到dtu
  75. *
  76. * @param fmt 字符串模型
  77. * @param ... 可变参数
  78. */
  79. void DTU_Write(char *fmt, ...)
  80. {
  81. rt_pin_mode(GET_PIN(B, 14) , PIN_MODE_OUTPUT);
  82. rt_pin_write(GET_PIN(B, 14), 1);
  83. const char dtu_conf[4] = {device_status.vol, 0x00, 0x00, 0x00};
  84. va_list arg;
  85. static char dtu_str[800];
  86. rt_size_t str_length;
  87. va_start(arg, fmt);
  88. str_length = rt_vsnprintf(dtu_str, sizeof(dtu_str) - 1, fmt, arg);
  89. if (str_length > 800 - 1)
  90. str_length = 800 - 1;
  91. // rt_kprintf("DTU_Write data:%d\n%s\n", str_length, dtu_str);
  92. rt_device_write(dtuserial, 0, dtu_str, str_length);
  93. if (strstr(dtu_str, "volume") != RT_NULL)
  94. {
  95. rt_device_write(dtuserial, 0, dtu_conf, 4);
  96. }
  97. else if (strstr(dtu_str, "reset") != RT_NULL)
  98. {
  99. const char dtu_conf[4] = {7, 0x00, 0x00, 0x00};
  100. rt_device_write(dtuserial, 0, dtu_conf, 4);
  101. }
  102. va_end(arg);
  103. memset(dtu_str, '\0', sizeof(dtu_str));
  104. rt_pin_write(GET_PIN(B, 14), 0);
  105. //rt_kprintf("DTU_Write > %X > %d\n" , &dtuserial , dtuserial->device_id);
  106. }
  107. /* 接收数据回调函数 */
  108. static rt_err_t dtu_input(rt_device_t dev, rt_size_t size)
  109. {
  110. struct rx_msg msg;
  111. rt_err_t result;
  112. msg.dev = dev;
  113. msg.size = size;
  114. result = rt_mq_send(&rx_mq_dtu, &msg, sizeof(struct rx_msg));
  115. if (result == -RT_EFULL)
  116. {
  117. /* 消息队列满 */
  118. rt_kprintf("message queue full!\n");
  119. }
  120. return result;
  121. }
  122. #include "Work_XCT.h"
  123. extern SYSCFG syscfg;
  124. /* 入口函数-指令接收*/
  125. /**
  126. * @brief dtu数据的接收线程
  127. *
  128. * @param parameter NULL
  129. */
  130. static void dtu_thread_entry_recv(void *parameter)
  131. {
  132. struct rx_msg msg;
  133. rt_err_t result;
  134. rt_uint32_t rx_length;
  135. rt_uint32_t rx_err = 0;
  136. static char str_check[2] = {'{', '}'};
  137. static char rx_buffer[512];
  138. static char rx_buffer_tmp[512];
  139. static char rx_buffer_tmp2[512];
  140. while (1)
  141. {
  142. rt_memset(&msg, 0, sizeof(msg));
  143. // 从消息队列中获取被回调函数放入消息队列中的内容
  144. result = rt_mq_recv(&rx_mq_dtu, &msg, sizeof(struct rx_msg), 100);
  145. if (result == RT_EOK)
  146. {
  147. rx_err = 0;
  148. rx_length = (sizeof(rx_buffer) - 1) > msg.size ? msg.size : sizeof(rx_buffer) - 1;
  149. rx_length = rt_device_read(msg.dev, 0, &rx_buffer[0], rx_length);
  150. rx_buffer[rx_length] = '\0';
  151. rt_kprintf("recv data: %d %s", rx_length, rx_buffer);
  152. // 适配新屏幕
  153. if ((strstr(rx_buffer, "systest") != NULL) && (strstr(rx_buffer, "touch") != NULL))
  154. {
  155. screen_type = new;
  156. prase_test_cmd(rx_buffer);
  157. }
  158. // 拍照完成标记
  159. if (strstr(rx_buffer, "photolink") != RT_NULL && strstr(rx_buffer, "ALARM_INPUT") != RT_NULL)
  160. {
  161. syscfg.photo_finsh = 1; // 拍照完成回复
  162. rt_kprintf("photo_finsh \n\n\n");
  163. }
  164. if (strstr(rx_buffer, "{") == RT_NULL || strstr(rx_buffer, "}") == RT_NULL)
  165. {
  166. HMI_WRITE("sysTest.result.txt=\"%s\"", rx_buffer);
  167. }
  168. // 过滤异常数据
  169. char str_check_head[2];
  170. char str_check_end[2];
  171. rt_sprintf(str_check_head, "%c", rx_buffer[0]);
  172. rt_sprintf(str_check_end, "%c", rx_buffer[rx_length - 1]);
  173. if (str_check_end[0] == str_check[1] && str_check_head[0] == str_check[0])
  174. {
  175. parseDtu(rx_buffer);
  176. rt_memset(rx_buffer, 0, sizeof(rx_buffer));
  177. rt_memset(rx_buffer_tmp, 0, sizeof(rx_buffer_tmp));
  178. rt_memset(rx_buffer_tmp2, 0, sizeof(rx_buffer_tmp2));
  179. }
  180. else
  181. {
  182. if (rx_buffer[rx_length - 1] != '}')
  183. {
  184. rt_sprintf(rx_buffer_tmp, "%s", rx_buffer);
  185. }
  186. else
  187. {
  188. rt_sprintf(rx_buffer_tmp2, "%s", rx_buffer);
  189. rt_sprintf(rx_buffer, "%s%s", rx_buffer_tmp, rx_buffer_tmp2);
  190. // rt_kprintf("rxbuffer:%s",rx_buffer);
  191. parseDtu(rx_buffer);
  192. rt_memset(rx_buffer, 0, sizeof(rx_buffer));
  193. rt_memset(rx_buffer_tmp, 0, sizeof(rx_buffer_tmp));
  194. rt_memset(rx_buffer_tmp2, 0, sizeof(rx_buffer_tmp2));
  195. }
  196. // rt_kprintf("%s",rx_buffer);
  197. }
  198. }
  199. else
  200. {
  201. rx_err++;
  202. if (rx_err == 54000) // 90分钟未接收到数据
  203. {
  204. if (device_status.version_type == 6)
  205. {
  206. LOG_E("RK3399 transter Error!");
  207. ctr_photo(OFF);
  208. }
  209. else
  210. {
  211. ctr_RTU_DTU(OFF);
  212. }
  213. }
  214. else if (rx_err == 54100 && device_status.bat_status == 0)
  215. {
  216. LOG_W("通信中断,RTU重新上电");
  217. rx_err = 0;
  218. ctr_RTU_DTU(ON);
  219. ctr_photo(ON);
  220. }
  221. }
  222. // rt_kprintf("%s\n",rx_json_buffer);
  223. // 将内容写回到串口1
  224. // rt_device_write(dtuserial, 0, &rx_json_buffer[0], rx_length);
  225. }
  226. }
  227. /*入口函数-指令发送*/
  228. /**
  229. * @brief dtu数据的发送线程
  230. *
  231. * @param parameter NULL
  232. */
  233. static void dtu_thread_entry_send(void *parameter)
  234. {
  235. device_status.power_status = 1;
  236. device_status.num_updata = 0;
  237. rt_thread_delay(10000);
  238. static rt_uint16_t wait_i = 0;
  239. static rt_uint8_t check_i = 0;
  240. static rt_uint8_t power_i = 0;
  241. uint8_t cnt_reflash = 0;
  242. uint16_t log_en_inr = 30; // 打印log的速度 数值越小 打印越频繁
  243. static int16_t log_en_cnt = -1;
  244. static uint8_t onec = 0;
  245. while (1)
  246. {
  247. if (atoi(device_status.net) == 0)
  248. {
  249. onec = 1;
  250. }
  251. else if (onec == 0)
  252. {
  253. wait_i++;
  254. if (chk_log_time)
  255. {
  256. LOG_I("wait connect internet......%d", wait_i);
  257. rt_kprintf("net sta %s \n", device_status.net);
  258. }
  259. }
  260. rt_thread_mdelay(1000);
  261. if (++cnt_reflash >= 10)
  262. {
  263. cnt_reflash = 0;
  264. UpLoad_Data_refresh();
  265. }
  266. }
  267. }
  268. /* 创建线程 */
  269. /**
  270. * @brief 用于创建dtu通信相关的线程
  271. *
  272. * 该线程在主线程中-读取完保存的设备参数之后调用
  273. *
  274. * @return int 完成后返回RT_EOK
  275. */
  276. int dtu_data_play(void)
  277. {
  278. rt_err_t rm_dtu_result;
  279. DTU_uart2_init();
  280. // 初始化消息队列
  281. rm_dtu_result = rt_mq_init(&rx_mq_dtu, "dtu", &data_arry.msg_pool[0], 128 - sizeof(void *), sizeof(data_arry.msg_pool), RT_IPC_FLAG_FIFO);
  282. if (rm_dtu_result == RT_EOK)
  283. {
  284. rt_kprintf("消息队列创建成功!!");
  285. }
  286. else
  287. {
  288. rt_kprintf("消息队列创建失败!!");
  289. }
  290. /* 设置接收回调函数 */
  291. rt_device_set_rx_indicate(dtuserial, dtu_input);
  292. /*创建线程-指令发送*/
  293. dtu_send_data = rt_thread_create("DTU_Uart_thread_send",
  294. dtu_thread_entry_send, RT_NULL,
  295. DTU_THREAD_STACK_SIZE,
  296. 3, // 优先级高是为了保证数据上传的频率的精确度
  297. 20 // 时间片
  298. );
  299. /* 创建线程-指令接收解析*/
  300. dtu_recv_data = rt_thread_create("DTU_Uart_thread_recv",
  301. dtu_thread_entry_recv, RT_NULL,
  302. DTU_THREAD_STACK_SIZE+1024,
  303. DTU_THREAD_PRIORITY,
  304. DTU_THREAD_TIMESLICE);
  305. /* 如果获得线程控制块,启动这个线程 */
  306. if (dtu_send_data != RT_NULL)
  307. rt_thread_startup(dtu_send_data);
  308. /* 如果获得线程控制块,启动这个线程 */
  309. if (dtu_recv_data != RT_NULL)
  310. rt_thread_startup(dtu_recv_data);
  311. return RT_EOK;
  312. }
  313. /**
  314. * @brief 组包读取设备信息的json
  315. *
  316. * @return char* 组包完成后的字符串指针
  317. */
  318. char *makeJson_ReadInfo()
  319. {
  320. cJSON *rJsonRoot = NULL;
  321. rJsonRoot = cJSON_CreateObject();
  322. if (NULL == rJsonRoot)
  323. {
  324. return NULL;
  325. }
  326. cJSON_AddStringToObject(rJsonRoot, "uart", "getinfo");
  327. char *r = cJSON_PrintUnformatted(rJsonRoot);
  328. if (NULL == r)
  329. {
  330. cJSON_Delete(rJsonRoot);
  331. return NULL;
  332. }
  333. cJSON_Delete(rJsonRoot);
  334. return r;
  335. }
  336. //{"cmd": "platform", "ext": {"type": "120.27.222.26"}}
  337. /**
  338. * @brief 组包平台参数的json
  339. *
  340. * @param plt 平台参数的内容
  341. * @return char* 组包完成后的字符串指针
  342. */
  343. char *makeJson_platform(char *plt)
  344. {
  345. cJSON *platform = NULL;
  346. platform = cJSON_CreateObject();
  347. if (NULL == platform)
  348. {
  349. return NULL;
  350. }
  351. cJSON_AddStringToObject(platform, "cmd", "platform");
  352. cJSON *extstr = NULL;
  353. extstr = cJSON_CreateObject();
  354. if (NULL == extstr)
  355. {
  356. return NULL;
  357. }
  358. cJSON_AddItemToObject(platform, "ext", extstr);
  359. cJSON_AddStringToObject(extstr, "type", plt);
  360. char *p_str = cJSON_PrintUnformatted(platform);
  361. if (NULL == p_str)
  362. {
  363. cJSON_Delete(platform);
  364. return NULL;
  365. }
  366. cJSON_Delete(platform);
  367. return p_str;
  368. }
  369. /**
  370. * @brief 组包拍照指令的json
  371. *
  372. * @return char* 完成后的指针
  373. */
  374. char *makeJson_takephoto()
  375. {
  376. cJSON *takephoto = NULL;
  377. takephoto = cJSON_CreateObject();
  378. if (NULL == takephoto)
  379. {
  380. return NULL;
  381. }
  382. cJSON_AddStringToObject(takephoto, "cmd", "takephoto");
  383. char *takephoto_str = cJSON_PrintUnformatted(takephoto);
  384. if (NULL == takephoto_str)
  385. {
  386. cJSON_Delete(takephoto);
  387. return NULL;
  388. }
  389. cJSON_Delete(takephoto);
  390. return takephoto_str;
  391. }
  392. /**
  393. * @brief 组包RTU拍照的json
  394. *
  395. * @return char* 完成后的指针
  396. */
  397. char *makeJson_Rtutakephoto()
  398. {
  399. cJSON *tJsonRoot = NULL;
  400. tJsonRoot = cJSON_CreateObject();
  401. if (NULL == tJsonRoot)
  402. {
  403. return NULL;
  404. }
  405. cJSON_AddStringToObject(tJsonRoot, "cmd", "ctrl");
  406. cJSON *tpubstring = NULL;
  407. tpubstring = cJSON_CreateObject();
  408. if (NULL == tpubstring)
  409. {
  410. LOG_E("cJSON tpubstring NULL!!!\n");
  411. return NULL;
  412. }
  413. cJSON_AddItemToObject(tJsonRoot, "ext", tpubstring);
  414. cJSON_AddStringToObject(tpubstring, "takephoto", "2");
  415. char *t = cJSON_PrintUnformatted(tJsonRoot);
  416. if (NULL == t)
  417. {
  418. cJSON_Delete(tJsonRoot);
  419. return NULL;
  420. }
  421. cJSON_Delete(tJsonRoot);
  422. return t;
  423. }
  424. // 预警消息
  425. /**
  426. * @brief 组包预警信息的json
  427. *
  428. * @param s status
  429. * @param t type
  430. * @return char* 完成后的指针
  431. */
  432. char *makeJson_Warn(char *s, char *t)
  433. {
  434. cJSON *wJsonRoot = NULL;
  435. wJsonRoot = cJSON_CreateObject();
  436. if (NULL == wJsonRoot)
  437. {
  438. return NULL;
  439. }
  440. cJSON_AddStringToObject(wJsonRoot, "cmd", "warn");
  441. cJSON *pubstring = NULL;
  442. pubstring = cJSON_CreateObject();
  443. if (NULL == pubstring)
  444. {
  445. rt_kprintf("cJSON pubstring NULL!!!\n");
  446. return NULL;
  447. }
  448. cJSON_AddItemToObject(wJsonRoot, "ext", pubstring);
  449. cJSON_AddStringToObject(pubstring, "status", s); //
  450. cJSON_AddStringToObject(pubstring, "type", t);
  451. char *w = cJSON_PrintUnformatted(wJsonRoot);
  452. if (NULL == w)
  453. {
  454. cJSON_Delete(wJsonRoot);
  455. rt_kprintf("wJsonRoot cJSON_Delete NULL!!!\n");
  456. return NULL;
  457. }
  458. cJSON_Delete(wJsonRoot);
  459. return w;
  460. }
  461. #include "Work_XCT.h"
  462. extern Limit limit;
  463. extern SYSCFG syscfg;
  464. extern wm_Def workmode;
  465. #include "rs485.h"
  466. extern Sensor sensor[MAX_SENSOR_NUM];
  467. char *makeJson_with_para(uint8_t type)
  468. {
  469. char utos[5];
  470. if (device_status.gps == NULL)
  471. rt_sprintf(device_status.gps, "0");
  472. // 如果设备工作并且电流小于500,并且不是上电启动灯管异常
  473. if (atoi(device_status.power) < 400 && atoi(device_status.power) != 0 && device_status.work_status == 1 && makejson_sta != 0)
  474. {
  475. #if LAMP_EN == 0
  476. LOG_I("Current is:%d", atoi(device_status.power));
  477. if (atoi(device_status.power) > 10) // 过滤电流检测芯片损坏导致电流直为0 的异常
  478. device_status.lamp_status = 1;
  479. #endif
  480. }
  481. else
  482. {
  483. device_status.lamp_status = 0;
  484. }
  485. if (atoi(device_status.power) > 5000)
  486. rt_sprintf(device_status.power, "0.01");
  487. makejson_sta = 1;
  488. time_t stamp = time(RT_NULL);
  489. static struct tm tm;
  490. gmtime_r(&stamp, &tm);
  491. rt_sprintf(device_status.stamp, "%04d%02d%02d%02d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
  492. cJSON *pJsonRoot = NULL;
  493. pJsonRoot = cJSON_CreateObject();
  494. if (NULL == pJsonRoot)
  495. {
  496. rt_kprintf("cJSON pJsonRoot NULL!!!\n");
  497. return NULL;
  498. }
  499. if (type == 0x0A)
  500. {
  501. cJSON_AddStringToObject(pJsonRoot, "cmd", "data");
  502. }
  503. else
  504. {
  505. cJSON_AddStringToObject(pJsonRoot, "cmd", "refresh");
  506. }
  507. cJSON *pSubJson = NULL;
  508. pSubJson = cJSON_CreateObject();
  509. if (NULL == pSubJson)
  510. {
  511. rt_kprintf("cJSON pSubJson NULL!!!\n");
  512. return NULL;
  513. }
  514. memset(device_status.driver, 0, sizeof(device_status.driver));
  515. rt_sprintf(device_status.driver, "%s-%s", VERSION_XCT, device_status.driver_4g);
  516. if (device_status.sensor_485_sta != 0)
  517. {
  518. if (strstr(device_status.driver, "485") == RT_NULL)
  519. strcat(device_status.driver, ".485");
  520. }
  521. cJSON_AddItemToObject(pJsonRoot, "ext", pSubJson);
  522. cJSON_AddStringToObject(pSubJson, "dver", device_status.driver); // 版本号,字符型
  523. cJSON_AddStringToObject(pSubJson, "proj", device_status.project); // 项目类型
  524. // 设备类型
  525. rt_sprintf(utos, "%d", device_status.dtype);
  526. cJSON_AddStringToObject(pSubJson, "dtype", utos);
  527. // 光控定时时长
  528. rt_sprintf(utos, "%d", limit.LuxTime);
  529. cJSON_AddStringToObject(pSubJson, "tt", utos);
  530. // 时控定时开始
  531. rt_sprintf(utos, "%d", device_status.collecting_sh1);
  532. cJSON_AddStringToObject(pSubJson, "collstart", utos);
  533. // 时控定时结束
  534. rt_sprintf(utos, "%d", device_status.collecting_eh1);
  535. cJSON_AddStringToObject(pSubJson, "collend", utos);
  536. // 定时模式
  537. // rt_sprintf(utos, "%d", workmode);
  538. rt_sprintf(utos, "%d", limit.LuxEN);
  539. cJSON_AddStringToObject(pSubJson, "ts", utos);
  540. // 温控开关
  541. rt_sprintf(utos, "%d", limit.temhumEN);
  542. cJSON_AddStringToObject(pSubJson, "tps", utos);
  543. // 高温保护
  544. rt_sprintf(utos, "%d", limit.temp_up);
  545. cJSON_AddStringToObject(pSubJson, "tph", utos);
  546. // 低温保护
  547. rt_sprintf(utos, "%d", limit.temp_dw);
  548. cJSON_AddStringToObject(pSubJson, "tpl", utos);
  549. // 雨控开关
  550. rt_sprintf(utos, "%d", limit.RainEN);
  551. cJSON_AddStringToObject(pSubJson, "rps", utos);
  552. // 当前光控状态
  553. rt_sprintf(utos, "%d", device_status.lps_sta);
  554. cJSON_AddStringToObject(pSubJson, "lps", utos);
  555. // 当前雨控状态
  556. rt_sprintf(utos, "%d", device_status.rain_status);
  557. cJSON_AddStringToObject(pSubJson, "nrps", utos);
  558. // 当前温控状态
  559. rt_sprintf(utos, "%d", device_status.temp_status);
  560. cJSON_AddStringToObject(pSubJson, "ntps", utos);
  561. // 电池状态
  562. rt_sprintf(utos, "%d", device_status.bat_status);
  563. cJSON_AddStringToObject(pSubJson, "batStatus", utos);
  564. // 上灯管状态
  565. rt_sprintf(utos, "%d", rt_pin_read(LAMP_SW));
  566. cJSON_AddStringToObject(pSubJson, "lamp", utos);
  567. // 下灯管状态
  568. rt_sprintf(utos, "%d", rt_pin_read(LAMP_SW_DOWN));
  569. cJSON_AddStringToObject(pSubJson, "lamp_down", utos);
  570. // 补光灯
  571. rt_sprintf(utos, "%d", rt_pin_read(LED_SW));
  572. cJSON_AddStringToObject(pSubJson, "led", utos);
  573. // 定位状态
  574. cJSON_AddStringToObject(pSubJson, "gps", device_status.gps);
  575. // 开关状态
  576. rt_sprintf(utos, "%d", device_status.ds);
  577. cJSON_AddStringToObject(pSubJson, "ds", utos);
  578. char *temp_c = NULL;
  579. char *humi_c = NULL;
  580. if (sensor[s_Temp].online)
  581. temp_c = sensor[s_Temp].eValue;
  582. else
  583. temp_c = device_status.tempture;
  584. if (sensor[s_Humi].online)
  585. humi_c = sensor[s_Humi].eValue;
  586. else
  587. humi_c = device_status.humidity;
  588. // rt_kprintf("temp %s humi %s\n",temp_c , humi_c);
  589. // 温度
  590. cJSON_AddStringToObject(pSubJson, "at", temp_c);
  591. // 湿度
  592. cJSON_AddStringToObject(pSubJson, "ah", humi_c);
  593. cJSON_AddStringToObject(pSubJson, "imei", device_status.imei); // IMEI
  594. cJSON_AddStringToObject(pSubJson, "iccid", device_status.iccid); // ICCID
  595. cJSON_AddStringToObject(pSubJson, "stamp", device_status.stamp); // 时间
  596. // 经度
  597. cJSON_AddStringToObject(pSubJson, "lng", device_status.lng);
  598. // 纬度
  599. cJSON_AddStringToObject(pSubJson, "lat", device_status.lat);
  600. // 是否为上电开机
  601. cJSON_AddNumberToObject(pSubJson, "rcnt", device_status.rebootcnt);
  602. // 电流(当前)
  603. cJSON_AddStringToObject(pSubJson, "current", device_status.power);
  604. // 电压
  605. cJSON_AddStringToObject(pSubJson, "vbat", device_status.voltage);
  606. // 数据上传间隔
  607. rt_sprintf(utos, "%d", device_status.dattim);
  608. cJSON_AddStringToObject(pSubJson, "dat_f", utos);
  609. // 照片上传间隔
  610. rt_sprintf(utos, "%d", device_status.photim);
  611. cJSON_AddStringToObject(pSubJson, "pho_f", utos);
  612. // 风机调速
  613. rt_sprintf(utos, "%d", syscfg.fan_speed);
  614. cJSON_AddStringToObject(pSubJson, "fan_speed", utos);
  615. // 演示模式
  616. rt_sprintf(utos, "%d", syscfg.Demo_mode);
  617. cJSON_AddStringToObject(pSubJson, "Demo_mode", utos);
  618. if (type != 0x0A)
  619. {
  620. // 风机状态
  621. rt_sprintf(utos, "%d", rt_pin_read(Collect_Fan));
  622. cJSON_AddStringToObject(pSubJson, "fan_sta", utos);
  623. // LED状态
  624. rt_sprintf(utos, "%d", rt_pin_read(LED_SW));
  625. cJSON_AddStringToObject(pSubJson, "led_sta", utos);
  626. }
  627. else
  628. {
  629. rt_kprintf("type %X\n", type);
  630. }
  631. // 信号强度
  632. cJSON_AddStringToObject(pSubJson, "csq", device_status.csq);
  633. char *p = cJSON_PrintUnformatted(pJsonRoot);
  634. if (NULL == p)
  635. {
  636. cJSON_Delete(pJsonRoot);
  637. rt_kprintf("cJSON_Delete NULL!!!\n");
  638. return NULL;
  639. }
  640. cJSON_Delete(pJsonRoot);
  641. return p;
  642. }
  643. /*生成JSON数据*/
  644. /**
  645. * @brief 组包设备状态信息的json
  646. *
  647. * @return char* 完成后的指针
  648. */
  649. char *makeJson()
  650. {
  651. return makeJson_with_para(0x0A);
  652. }
  653. // 适用于给安卓屏刷新状态
  654. char *makeJson_refresh()
  655. {
  656. return makeJson_with_para(0x0B);
  657. }
  658. /**
  659. * @brief 组包返回信息的json
  660. *
  661. * @return char* 组包完成后的字符串指针
  662. */
  663. char *makeJson_Return(char *cmd, char *data)
  664. {
  665. // 创建一个JSON对象
  666. cJSON *root = cJSON_CreateObject();
  667. if (root == NULL)
  668. {
  669. fprintf(stderr, "Error creating JSON object\n");
  670. return NULL;
  671. }
  672. // 在JSON对象中添加键值对
  673. cJSON_AddStringToObject(root, cmd, data);
  674. // 将JSON对象转换为字符串
  675. char *json_str = cJSON_Print(root);
  676. if (json_str == NULL)
  677. {
  678. fprintf(stderr, "Error printing JSON string\n");
  679. // 释放JSON对象的内存
  680. cJSON_Delete(root);
  681. return NULL;
  682. }
  683. // 释放JSON对象的内存
  684. cJSON_Delete(root);
  685. return json_str;
  686. }
  687. /***************** 241217 新增控制指令框架 *******************/
  688. #include "Work_XCT.h"
  689. #include "rs485.h"
  690. #define return_modle "{\"cmd\": \"data\", \"ext\": %s}"
  691. extern void getEcodeData(uint8_t type);
  692. extern wm_Def workmode;
  693. extern WorkMode_Def WorkModeList[TypeMAX_wx];
  694. extern Caw_def Check_Allow_Work(void);
  695. extern Sunwork swork;
  696. extern Luxwork lwork;
  697. extern Sensor sensor[MAX_SENSOR_NUM];
  698. extern void CollFanSetPWM(uint8_t percent);
  699. static char RC_Res[512] = {0};
  700. static char temp[64] = {0};
  701. static RC_Def rcdList[TypeMAX_rcd] =
  702. {
  703. {read_limit_rcd, "read_limit"},
  704. {TEMP_ON_rcd, "TEMP_ON"},
  705. {TEMP_OFF_rcd, "TEMP_OFF"},
  706. {RAIN_ON_rcd, "RAIN_ON"},
  707. {RAIN_OFF_rcd, "RAIN_OFF"},
  708. {RunFRMS_rcd, "RunFRMS"},
  709. {RunLight_rcd, "RunLight"},
  710. {RunTime_rcd, "RunTime"},
  711. {Read_ecode_rcd, "Read_ecode"},
  712. {Read_status_rcd, "Read_status"},
  713. {Clear_log_rcd, "clear_log"},
  714. {RebootRTU_rcd, "RebootRTU"},
  715. {Demo_ON_rcd, "Demo_ON"},
  716. {Force_Reset_rcd, "Force_Reset"}
  717. };
  718. static RCD Get_RCType(char *cmd)
  719. {
  720. RCD res = TypeMAX_rcd;
  721. for (uint8_t a = 0; a < TypeMAX_rcd; a++)
  722. {
  723. if (strstr(cmd, rcdList[a].keyword) != NULL)
  724. {
  725. return rcdList[a].rcd;
  726. }
  727. }
  728. return res;
  729. }
  730. /**
  731. * @brief 把收到的请求指令解析出来
  732. *
  733. * @param cmd 指令
  734. */
  735. void prase_Rcmd(char *cmd)
  736. {
  737. if (strstr(cmd, "RC") == NULL || Get_RCType(cmd) == TypeMAX_rcd)
  738. {
  739. rt_kprintf("prase_Rcmd no keyword find \n\n");
  740. return;
  741. }
  742. RCD type = Get_RCType(cmd);
  743. // rt_kprintf("type %d \n", type);
  744. switch (type)
  745. {
  746. case read_limit_rcd:
  747. sprintf(RC_Res, "\"温湿控- %s | 光控-%s | 雨控-%s\"",
  748. limit.temhumEN ? "开" : "关",
  749. limit.LuxEN ? "开" : "关",
  750. limit.RainEN ? "开" : "关");
  751. break;
  752. case TEMP_ON_rcd:
  753. limit.temhumEN = ON;
  754. ef_set_env_blob("limit", &limit, sizeof(Limit));
  755. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  756. break;
  757. case TEMP_OFF_rcd:
  758. limit.temhumEN = OFF;
  759. ef_set_env_blob("limit", &limit, sizeof(Limit));
  760. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  761. break;
  762. case RAIN_ON_rcd:
  763. limit.RainEN = ON;
  764. ef_set_env_blob("limit", &limit, sizeof(Limit));
  765. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  766. break;
  767. case RAIN_OFF_rcd:
  768. limit.RainEN = OFF;
  769. ef_set_env_blob("limit", &limit, sizeof(Limit));
  770. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  771. break;
  772. case RunFRMS_rcd:
  773. ef_get_env_blob("swork", &swork, sizeof(swork), NULL);
  774. swork.Read = 1;
  775. swork.EN = ON;
  776. ef_set_env_blob("swork", &swork, sizeof(swork));
  777. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  778. break;
  779. case RunLight_rcd:
  780. swork.Read = 1;
  781. swork.EN = OFF;
  782. ef_set_env_blob("swork", &swork, sizeof(swork));
  783. limit.LuxEN = ON;
  784. if (limit.LuxTime == 0)
  785. {
  786. limit.LuxTime = gktime_def;
  787. }
  788. ef_set_env_blob("limit", &limit, sizeof(Limit));
  789. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  790. break;
  791. case RunTime_rcd:
  792. swork.Read = 1;
  793. swork.EN = OFF;
  794. ef_set_env_blob("swork", &swork, sizeof(swork));
  795. limit.LuxEN = OFF;
  796. ef_set_env_blob("limit", &limit, sizeof(Limit));
  797. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  798. break;
  799. case Read_ecode_rcd:
  800. getEcodeData(1);
  801. break;
  802. case Clear_log_rcd:
  803. ef_log_clean();
  804. char static_array[] = "{\"cmd\":\"data\",\"ext\":{\"RC\":\"Ecode 已清空\"}}";
  805. DTU_Write(static_array);
  806. break;
  807. case RebootRTU_rcd:
  808. rt_pin_write(RTU_DTU, OFF);
  809. CTL_CAM0();
  810. rt_thread_mdelay(3000);
  811. Recode_e_code(e_rtu_reboot , 0 , "RTU断电重启");
  812. rt_hw_cpu_reset();
  813. break;
  814. case Force_Reset_rcd:
  815. ef_env_set_default();
  816. device_status.stop_in_bootloader = 0;
  817. ef_set_env_blob("stop_in_bootloader", &device_status.stop_in_bootloader, sizeof(device_status.stop_in_bootloader));
  818. Recode_e_code(e_para_setdef , 0 ,"强制恢复默认参数");
  819. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  820. break;
  821. default:
  822. break;
  823. }
  824. if ((type != Read_ecode_rcd) && (type != Clear_log_rcd))
  825. {
  826. // rt_kprintf("\n");
  827. // rt_kprintf(return_modle, RC_Res);
  828. // rt_kprintf("\n");
  829. DTU_Write(return_modle, RC_Res);
  830. }
  831. if(type == Force_Reset_rcd)
  832. {
  833. rt_hw_cpu_reset();
  834. }
  835. }
  836. /***************** 241217 新增控制指令框架 *******************/
  837. /**
  838. * @brief 获取Cjson数值
  839. *
  840. * @return int
  841. */
  842. int cjson_getval(cJSON *json)
  843. {
  844. if (json->type == cJSON_Number)
  845. {
  846. return json->valueint;
  847. }
  848. else if (json->type == cJSON_String)
  849. {
  850. return atoi(json->valuestring);
  851. }
  852. else
  853. {
  854. return -99;
  855. }
  856. }
  857. void ecodeinfo_json(void)
  858. {
  859. // 创建根JSON对象
  860. cJSON *root = cJSON_CreateObject();
  861. if (!root)
  862. {
  863. fprintf(stderr, "Failed to create root JSON object.\n");
  864. return;
  865. }
  866. cJSON_AddStringToObject(root, "cmd", "ecode");
  867. cJSON_AddStringToObject(root, "type", "info");
  868. // 创建嵌套的"ext"对象
  869. cJSON *ext = cJSON_CreateObject();
  870. if (!ext)
  871. {
  872. fprintf(stderr, "Failed to create ext JSON object.\n");
  873. cJSON_Delete(root);
  874. return;
  875. }
  876. // Recode_e_code(code, para, detail)
  877. uint32_t used = ef_log_get_used_size();
  878. uint32_t cnt = used / sizeof(Record);
  879. uint16_t pages = cnt / EcodeOnePageNum;
  880. if (pages * EcodeOnePageNum < cnt)
  881. {
  882. pages++;
  883. }
  884. cJSON_AddNumberToObject(ext, "count", cnt);
  885. cJSON_AddNumberToObject(ext, "pages", pages);
  886. // 将"ext"对象添加到根对象
  887. cJSON_AddItemToObject(root, "ext", ext);
  888. // 将cJSON对象转换为字符串
  889. char *json_string = cJSON_Print(root);
  890. if (!json_string)
  891. {
  892. fprintf(stderr, "Failed to print JSON object.\n");
  893. cJSON_Delete(root);
  894. return;
  895. }
  896. // 释放cJSON对象(字符串已经复制出来,不需要再保留这个对象)
  897. cJSON_Delete(root);
  898. DTU_Write("%s", json_string);
  899. free(json_string);
  900. }
  901. void ecode_concent_json(uint16_t page_num)
  902. {
  903. uint32_t used = ef_log_get_used_size();
  904. uint32_t cnt = used / sizeof(Record);
  905. uint16_t pages = cnt / EcodeOnePageNum;
  906. if (pages * EcodeOnePageNum < cnt)
  907. {
  908. pages++;
  909. }
  910. if (page_num >= pages)
  911. {
  912. rt_kprintf("ecode_concent_json > illagl para \n");
  913. return;
  914. }
  915. // 创建根JSON对象
  916. cJSON *root = cJSON_CreateObject();
  917. if (!root)
  918. {
  919. fprintf(stderr, "Failed to create root JSON object.\n");
  920. return;
  921. }
  922. cJSON_AddStringToObject(root, "cmd", "ecode");
  923. // 创建嵌套的"ext"对象
  924. cJSON *ext = cJSON_CreateObject();
  925. if (!ext)
  926. {
  927. fprintf(stderr, "Failed to create ext JSON object.\n");
  928. cJSON_Delete(root);
  929. return;
  930. }
  931. // Recode_e_code(code, para, detail)
  932. // cJSON_AddNumberToObject(ext, "count", cnt);
  933. // cJSON_AddNumberToObject(ext, "pages", pages);
  934. cJSON_AddStringToObject(root, "type", "data");
  935. Record ecode = {0};
  936. RTC_DateTypeDef r_date = {0};
  937. RTC_TimeTypeDef r_time = {0};
  938. char cache[96] = {0};
  939. char c_num[8] = {0};
  940. uint16_t start = 0, end = 0;
  941. start = (EcodeOnePageNum * page_num);
  942. if (page_num + 1 == pages)
  943. {
  944. end = cnt;
  945. }
  946. else
  947. {
  948. end = (EcodeOnePageNum * page_num + EcodeOnePageNum);
  949. }
  950. for (uint16_t a = start; a < end; a++)
  951. {
  952. if (ef_log_read(a * sizeof(Record), (uint32_t *)&ecode, sizeof(Record)) == EF_NO_ERR)
  953. {
  954. Prase_Time_Stampe(&r_date, &r_time, ecode.Time_Stampe);
  955. LOG_I("%d - %02d/%02d/%02d %02d:%02d:%02d:(%d-%d) %s",
  956. ecode.num,
  957. r_date.Year, r_date.Month, r_date.Date,
  958. r_time.Hours, r_time.Minutes, r_time.Seconds,
  959. ecode.code, ecode.para, ecode.detail);
  960. sprintf(c_num, "%d", ecode.num);
  961. sprintf(cache, "%02d/%02d/%02d %02d:%02d:%02d (%02d-%02d) : %s",
  962. r_date.Year, r_date.Month, r_date.Date,
  963. r_time.Hours, r_time.Minutes, r_time.Seconds,
  964. ecode.code, ecode.para, ecode.detail);
  965. cJSON_AddStringToObject(ext, c_num, cache);
  966. memset(&ecode, 0, sizeof(ecode));
  967. }
  968. else
  969. {
  970. LOG_I("ef_log_read %d fail\n", a);
  971. }
  972. }
  973. // 将"ext"对象添加到根对象
  974. cJSON_AddItemToObject(root, "ext", ext);
  975. // 将cJSON对象转换为字符串
  976. char *json_string = cJSON_Print(root);
  977. if (!json_string)
  978. {
  979. fprintf(stderr, "Failed to print JSON object.\n");
  980. cJSON_Delete(root);
  981. return;
  982. }
  983. // 释放cJSON对象(字符串已经复制出来,不需要再保留这个对象)
  984. cJSON_Delete(root);
  985. DTU_Write("%s", json_string);
  986. free(json_string);
  987. }
  988. extern RTC_DateTypeDef GetDate;
  989. extern RTC_TimeTypeDef GetTime;
  990. /**
  991. * @brief 检查将要对时的时间是否合法
  992. *
  993. * @param cmd 字符串的时间
  994. * @return char 0-非法 1-合法
  995. */
  996. static char CHECK_DATE(char *cmd)
  997. {
  998. if (cmd == NULL)
  999. {
  1000. return -1;
  1001. }
  1002. ReFlash_RTC();
  1003. char datetime[12] = {0};
  1004. strncpy(datetime, cmd, 10);
  1005. uint32_t ntc_time = atoi(datetime);
  1006. uint32_t yyyy = 2000 + GetDate.Year;
  1007. uint32_t mm = GetDate.Month;
  1008. uint32_t dd = GetDate.Date;
  1009. uint32_t hh = GetTime.Hours;
  1010. uint32_t now_time = (yyyy * 1000000) + (mm * 10000) + (dd * 100) + hh;
  1011. if (ntc_time >= now_time)
  1012. {
  1013. return 1;
  1014. }
  1015. LOG_E("NTP Time val illagl %s \n", cmd);
  1016. return 0;
  1017. }
  1018. extern void prase_test_cmd(char *cmd);
  1019. extern Reflash_test_sta rts;
  1020. // JSON数据解析
  1021. /**
  1022. * @brief 解析dtu发来的指令
  1023. *
  1024. * @param json_string 收到的json字符串
  1025. * @return int 0 完成
  1026. */
  1027. int parseDtu(char *json_string)
  1028. {
  1029. extern int rt_hw_rtc_init(void);
  1030. char *json_s = NULL;
  1031. cJSON *item_cmd = NULL; // 嵌套ext
  1032. cJSON *item_ext = NULL; // 嵌套ext
  1033. cJSON *item_checkself = NULL; //
  1034. /**
  1035. * 有用的小虫体指令
  1036. *
  1037. */
  1038. cJSON *collstart = NULL; // 时控开始(整型 / 时)
  1039. cJSON *collend = NULL; // 时控结束(整型 / 时)
  1040. cJSON *tt = NULL; // 光控定时时长(整型 / 时)
  1041. cJSON *ts = NULL; // 工作模式(整型 / 0-时控 1-光控)
  1042. cJSON *tpl = NULL; // 低温保护阈值
  1043. cJSON *tph = NULL; // 高温保护阈值
  1044. cJSON *inr_data = NULL; // 数据上传间隔(整型 / min)
  1045. cJSON *inr_photo = NULL; // 拍照间隔(整型 / min)
  1046. cJSON *limit_temp = NULL; // 设置温控开关(bool / 0-关闭 1-开启)
  1047. cJSON *limit_rain = NULL; // 设置雨控开关(bool / 0-关闭 1-开启)
  1048. // 晨曦模式新增参数
  1049. cJSON *RunFRMS = NULL; // 晨曦模式开关
  1050. cJSON *FRMSlseek = NULL; // 晨曦模式便宜量
  1051. cJSON *setLux = NULL; // 晨曦模式光控阈值
  1052. // 晨曦模式新增参数
  1053. cJSON *tps = NULL; // 温控开关
  1054. cJSON *Demo_mode = NULL;
  1055. cJSON *no_reply = NULL;
  1056. /**
  1057. * 有用的小虫体指令
  1058. *
  1059. */
  1060. cJSON *gps = NULL; // 定位状态
  1061. cJSON *datetime = NULL;
  1062. cJSON *lat = NULL;
  1063. cJSON *lng = NULL;
  1064. cJSON *csq = NULL;
  1065. cJSON *net = NULL;
  1066. cJSON *iccid = NULL;
  1067. cJSON *imei = NULL;
  1068. cJSON *sim = NULL;
  1069. cJSON *volume = NULL;
  1070. cJSON *driver_4g = NULL; // 版本号
  1071. cJSON *project = NULL; // Project
  1072. cJSON *ds = NULL; // 设备状态
  1073. // cJSON *vt = NULL; // 版本类型
  1074. // cJSON* account_status = NULL; //卡状态
  1075. // cJSON* data_plan = NULL; //套餐
  1076. // cJSON* data_usage = NULL; //已使用
  1077. // cJSON* expiry_date = NULL; //到期时间
  1078. cJSON *mqttcfg1 = NULL;
  1079. cJSON *mqttcfg2 = NULL;
  1080. cJSON *type = NULL;
  1081. cJSON *hum = NULL;
  1082. cJSON *tmp = NULL;
  1083. cJSON *sunrise = NULL;
  1084. cJSON *sunset = NULL;
  1085. cJSON *link_sta = NULL;
  1086. cJSON *value_commn = NULL;
  1087. cJSON *fan_speed = NULL;
  1088. cJSON *pages = NULL;
  1089. // rt_kprintf("parseDtu : %s\n", json_string);
  1090. cJSON *root = cJSON_Parse(json_string);
  1091. if (!root)
  1092. {
  1093. cJSON_Delete(root);
  1094. rt_kprintf("parse json err:%s", json_string);
  1095. return -1;
  1096. }
  1097. // 适配远程控制指令
  1098. else if (strstr(json_string, "RC") != NULL)
  1099. {
  1100. prase_Rcmd(json_string);
  1101. }
  1102. else
  1103. {
  1104. item_cmd = cJSON_GetObjectItem(root, "cmd");
  1105. item_ext = cJSON_GetObjectItem(root, "ext");
  1106. item_checkself = cJSON_GetObjectItem(root, "selfcheck");
  1107. // item_data = cJSON_GetObjectItem(root,"data");
  1108. if (item_checkself != NULL)
  1109. { // 自检签名
  1110. LOG_I("自检签名:%s", item_checkself->valuestring);
  1111. // 执行一键测试任务
  1112. jts.autotest = ON;
  1113. device_status.test_flag = 10;
  1114. }
  1115. if (item_cmd != RT_NULL)
  1116. {
  1117. if (strstr(item_cmd->valuestring, "ReadEcodeInfo") != RT_NULL)
  1118. {
  1119. ecodeinfo_json();
  1120. }
  1121. else if (strstr(item_cmd->valuestring, "takephoto") != RT_NULL)
  1122. {
  1123. // HK_TakePhoto();
  1124. device_status.photo_ws = 1;
  1125. char *photo = makeJson_Warn("takephoto", "control");
  1126. DTU_Write("%s", photo);
  1127. rt_free(photo);
  1128. rt_thread_delay(2000);
  1129. }
  1130. else if (strstr(item_cmd->valuestring, "json_w_clock") != RT_NULL)
  1131. {
  1132. rt_kprintf("查询时间配置!\n");
  1133. json_s = makeJson_Warn(device_status.json_w_clock, "主动查询");
  1134. DTU_Write("%s", json_s);
  1135. rt_free(json_s);
  1136. rt_thread_delay(1000);
  1137. }
  1138. else if (strstr(item_cmd->valuestring, "json_w_reset") != RT_NULL)
  1139. {
  1140. rt_kprintf("查询重置配置!\n");
  1141. json_s = makeJson_Warn(device_status.json_w_reset, "主动查询");
  1142. DTU_Write("%s", json_s);
  1143. rt_free(json_s);
  1144. rt_thread_delay(1000);
  1145. }
  1146. else if (strstr(item_cmd->valuestring, "json_w_platform") != RT_NULL)
  1147. {
  1148. rt_kprintf("查询平台配置!\n");
  1149. json_s = makeJson_Warn(device_status.json_w_platform, "主动查询");
  1150. DTU_Write("%s", json_s);
  1151. rt_free(json_s);
  1152. rt_thread_delay(1000);
  1153. }
  1154. else if (strstr(item_cmd->valuestring, "shake") != RT_NULL)
  1155. {
  1156. ctr_shake(ON, 30);
  1157. char *shake = makeJson_Warn("shake", "control");
  1158. DTU_Write("%s", shake);
  1159. rt_free(shake);
  1160. rt_thread_delay(2000);
  1161. }
  1162. // 远程给rtu重新上电
  1163. else if (strstr(item_cmd->valuestring, "ctrl") != RT_NULL)
  1164. {
  1165. type = cJSON_GetObjectItem(item_ext, "type");
  1166. if (strstr(type->valuestring, "rtu_off_on") != RT_NULL)
  1167. {
  1168. LOG_W("DTU 12V Power down");
  1169. ctr_RTU_DTU(OFF);
  1170. rt_thread_delay(5000);
  1171. ctr_RTU_DTU(ON);
  1172. }
  1173. // 对焦拍照
  1174. else if (strstr(type->valuestring, "auto_takephoto") != RT_NULL)
  1175. {
  1176. device_status.autotakepic = 1;
  1177. rt_thread_delay(2000);
  1178. char *auto_takephoto = makeJson_Warn("send cmd success:auto_takephoto", "control");
  1179. DTU_Write("%s", auto_takephoto);
  1180. rt_free(auto_takephoto);
  1181. }
  1182. else if (strstr(type->valuestring, "takephoto") != RT_NULL)
  1183. {
  1184. // HK_TakePhoto();
  1185. rts.takephoto_t = tig_ON;
  1186. char *takephotojson = makeJson_takephoto();
  1187. DTU_Write("%s", takephotojson);
  1188. rt_free(takephotojson);
  1189. rt_kprintf("cmd triger takepho\n");
  1190. rt_thread_delay(2000);
  1191. }
  1192. //{"ext": {"type": "turn"}, "cmd": "ctrl"} 转仓
  1193. else if (strstr(type->valuestring, "turn") != RT_NULL)
  1194. {
  1195. #if Color_EN == 0
  1196. char *turn_zp = makeJson_Warn("send cmd success:turn_zp", "control");
  1197. DTU_Write("%s", turn_zp);
  1198. rt_free(turn_zp);
  1199. ctr_turn(90, 0);
  1200. #else
  1201. DTU_Write("黄板复位:%d", ctr_Color_board(RESET, 800));
  1202. #endif
  1203. }
  1204. }
  1205. // 切换平台
  1206. else if (strstr(item_cmd->valuestring, "platform") != RT_NULL)
  1207. {
  1208. type = cJSON_GetObjectItem(item_ext, "type");
  1209. if (strstr(type->valuestring, "8.136.98.49") != RT_NULL)
  1210. {
  1211. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1212. ef_set_env_blob("platform", &device_status.mqttcfg1, sizeof(device_status.mqttcfg1));
  1213. // 给RTU发送切换指令
  1214. DTU_Write("%s", makeJson_platform("8.136.98.49"));
  1215. rt_free(makeJson_platform("8.136.98.49"));
  1216. rt_thread_delay(1000);
  1217. rt_sprintf(device_status.json_w_platform, "平台操作:切换平台>大数据,操作时间:%s", device_status.stamp);
  1218. json_s = makeJson_Warn(device_status.json_w_platform, "切换平台");
  1219. ef_set_env_blob("json_w_platform", &device_status.json_w_platform, sizeof(device_status.json_w_platform)); // 将修改屏幕参数操作记录保存到Flash中
  1220. if (atoi(device_status.net) == 0)
  1221. DTU_Write("%s", json_s);
  1222. rt_free(json_s);
  1223. rt_thread_delay(1000);
  1224. MA_save();
  1225. }
  1226. else if (strstr(type->valuestring, "120.27.222.26") != RT_NULL)
  1227. {
  1228. rt_sprintf(device_status.mqttcfg1, "120.27.222.26");
  1229. ef_set_env_blob("platform", &device_status.mqttcfg1, sizeof(device_status.mqttcfg1));
  1230. // 给RTU发送切换指令
  1231. DTU_Write("%s", makeJson_platform("120.27.222.26"));
  1232. rt_free(makeJson_platform("120.27.222.26"));
  1233. rt_thread_delay(1000);
  1234. rt_sprintf(device_status.json_w_platform, "平台操作:切换平台>四情,操作时间:%s", device_status.stamp);
  1235. json_s = makeJson_Warn(device_status.json_w_platform, "切换平台");
  1236. ef_set_env_blob("json_w_platform", &device_status.json_w_platform, sizeof(device_status.json_w_platform)); // 将修改屏幕参数操作记录保存到Flash中
  1237. if (atoi(device_status.net) == 0)
  1238. DTU_Write("%s", json_s);
  1239. rt_free(json_s);
  1240. rt_thread_delay(1000);
  1241. MA_save();
  1242. }
  1243. }
  1244. // 水稻2000万像素的串口拍照指令
  1245. else if (strstr(item_cmd->valuestring, "mvs_photo") != RT_NULL)
  1246. {
  1247. HK_TakePhoto();
  1248. char *photo = makeJson_Warn("mvs_takephoto", "control");
  1249. DTU_Write("%s", photo);
  1250. rt_free(photo);
  1251. rt_thread_delay(2000);
  1252. }
  1253. else if (strstr(item_cmd->valuestring, "dtu_reboot") != RT_NULL)
  1254. {
  1255. char *restart = makeJson_Warn("sysrem will restart [RTU]", "control");
  1256. rt_kprintf("%s\n", restart);
  1257. DTU_Write("%s", restart);
  1258. rt_thread_delay(2000);
  1259. rt_pin_write(RTU_DTU, OFF);
  1260. CTL_CAM0();
  1261. rt_thread_mdelay(3000);
  1262. Recode_e_code(e_rtu_reboot , 1 , "RTU断电重启");
  1263. rt_hw_cpu_reset();
  1264. }
  1265. else if (strstr(item_cmd->valuestring, "reboot") != RT_NULL)
  1266. {
  1267. char *restart = makeJson_Warn("sysrem will restart", "control");
  1268. rt_kprintf("%s\n", restart);
  1269. rt_thread_delay(2000);
  1270. DTU_Write("%s", restart);
  1271. rt_hw_cpu_reset();
  1272. }
  1273. else if (strstr(item_cmd->valuestring, "reset") != RT_NULL)
  1274. {
  1275. ResetParamDefault();
  1276. char *restart = makeJson_Warn("sysrem will reset", "control");
  1277. DTU_Write("%s", restart);
  1278. rt_free(restart);
  1279. rt_thread_delay(2000);
  1280. }
  1281. else if (strstr(item_cmd->valuestring, "update") != RT_NULL)
  1282. {
  1283. rt_kprintf("准备升级!!!");
  1284. device_status.update_flag = 1;
  1285. ef_set_env_blob("update_flag", &device_status.update_flag, sizeof(device_status.update_flag));
  1286. rt_kprintf("%s\n", makeJson_Warn("system will update", "control"));
  1287. rt_thread_delay(2000);
  1288. DTU_Write("%s", makeJson_Warn("system will update", "control"));
  1289. rt_thread_delay(20);
  1290. rt_hw_cpu_reset(); // 现在升级不能先重启再下载
  1291. }
  1292. else if (strstr(item_cmd->valuestring, "read") != RT_NULL)
  1293. {
  1294. char *readinfo = makeJson_ReadInfo();
  1295. DTU_Write("%s", readinfo);
  1296. rt_kprintf("%s\n", readinfo);
  1297. rt_free(readinfo);
  1298. device_status.hmi_fresh = 2;
  1299. device_status.refresh_num = 15;
  1300. }
  1301. else if (strstr(item_cmd->valuestring, "poweron") != RT_NULL)
  1302. {
  1303. device_status.ds = 1;
  1304. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds)); //
  1305. UpLoad_Data();
  1306. rt_kprintf("UpLoad_Data Mark B \n\n");
  1307. }
  1308. else if (strstr(item_cmd->valuestring, "poweroff") != RT_NULL)
  1309. {
  1310. device_status.ds = 0;
  1311. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds)); //
  1312. UpLoad_Data();
  1313. rt_kprintf("UpLoad_Data Mark C \n\n");
  1314. }
  1315. // else if (strstr(item_cmd->valuestring,"log")!=RT_NULL) {
  1316. // rt_thread_mdelay(2000);
  1317. // //read_all_flash_log();
  1318. // }
  1319. // 设置温湿度
  1320. else if (strstr(item_cmd->valuestring, "sensor") != RT_NULL)
  1321. {
  1322. // 2022-04-12add:485传感器正常,不再解析服务器下发的温湿度数据
  1323. // if(device_status.sensor_485_sta!=0) return 0;
  1324. hum = cJSON_GetObjectItem(item_ext, "new_hum");
  1325. tmp = cJSON_GetObjectItem(item_ext, "new_tem");
  1326. if (hum != NULL && tmp != NULL)
  1327. {
  1328. // 先判断是否是空字符再判断数值是否合理
  1329. if (strcmp(hum->valuestring, "") != 0 && atoi(hum->valuestring) >= 0 && atoi(hum->valuestring) <= 100 && atoi(hum->valuestring) != 30 && device_status.sensor_485_sta == 0)
  1330. {
  1331. if (atoi(hum->valuestring) != atoi(device_status.humidity))
  1332. {
  1333. rt_sprintf(device_status.humidity, "%s", hum->valuestring);
  1334. ef_set_env_blob("env_h", &device_status.humidity, sizeof(device_status.humidity)); // 湿度
  1335. rt_kprintf("保存湿度成功:%d\n", atoi(device_status.humidity));
  1336. }
  1337. LOG_I("设置湿度成功:%d\n", atoi(device_status.humidity));
  1338. }
  1339. else
  1340. {
  1341. rt_kprintf("设置湿度失败:%s!!!\n", hum->valuestring);
  1342. }
  1343. // 先判断是否是空字符再判断数值是否合理
  1344. if (strcmp(tmp->valuestring, "") != 0 && atoi(tmp->valuestring) > -50 && atoi(tmp->valuestring) <= 100 && device_status.sensor_485_sta == 0)
  1345. {
  1346. if (atoi(tmp->valuestring) != atoi(device_status.tempture))
  1347. {
  1348. rt_sprintf(device_status.tempture, "%s", tmp->valuestring);
  1349. ef_set_env_blob("env_t", &device_status.tempture, sizeof(device_status.tempture)); // 湿度
  1350. rt_kprintf("保存温度成功:%d\n", atoi(device_status.tempture));
  1351. }
  1352. LOG_I("设置温度成功:%d\n", atoi(device_status.tempture));
  1353. }
  1354. else
  1355. {
  1356. rt_kprintf("设置温度失败:%s!!!\n", tmp->valuestring);
  1357. }
  1358. }
  1359. sunrise = cJSON_GetObjectItem(item_ext, "sunrise");
  1360. sunset = cJSON_GetObjectItem(item_ext, "sunset");
  1361. if (sunrise != NULL && sunset != NULL)
  1362. {
  1363. char cache[3] = {0};
  1364. char cach1[3] = {0};
  1365. char en_saveswork = 0;
  1366. // rt_kprintf("sunset size %d %s\n", sizeof(sunrise->valuestring) , sunrise->valuestring);
  1367. if (sunrise->valuestring[2] == ':')
  1368. {
  1369. cache[0] = sunrise->valuestring[0];
  1370. cache[1] = sunrise->valuestring[1];
  1371. cache[2] = '\0';
  1372. // rt_kprintf("cache %d\n" , atoi(cache));
  1373. cach1[0] = sunrise->valuestring[3];
  1374. cach1[1] = sunrise->valuestring[4];
  1375. cach1[2] = '\0';
  1376. // rt_kprintf("cach1 %d\n" , atoi(cach1));
  1377. if (atoi(cache) >= 4 && atoi(cache) < 9)
  1378. {
  1379. swork.sunrise_time.Hours = atoi(cache);
  1380. swork.sunrise_time.Minutes = atoi(cach1);
  1381. en_saveswork = 1;
  1382. }
  1383. }
  1384. if (sunset->valuestring[2] == ':')
  1385. {
  1386. cache[0] = sunset->valuestring[0];
  1387. cache[1] = sunset->valuestring[1];
  1388. cache[2] = '\0';
  1389. // rt_kprintf("cache %d\n" , atoi(cache));
  1390. cach1[0] = sunset->valuestring[3];
  1391. cach1[1] = sunset->valuestring[4];
  1392. cach1[2] = '\0';
  1393. // rt_kprintf("cach1 %d\n" , atoi(cach1));
  1394. if (atoi(cache) >= 16 && atoi(cache) < 21)
  1395. {
  1396. swork.sunset_time.Hours = atoi(cache);
  1397. swork.sunset_time.Minutes = atoi(cach1);
  1398. en_saveswork = 1;
  1399. }
  1400. }
  1401. if (en_saveswork)
  1402. {
  1403. LOG_I("rise %d.%d set %d.%d\n", swork.sunrise_time.Hours, swork.sunrise_time.Minutes, swork.sunset_time.Hours, swork.sunset_time.Minutes);
  1404. ef_set_env_blob((const char *)"swork", (void *)&swork, sizeof(swork));
  1405. en_saveswork = 0;
  1406. }
  1407. }
  1408. rt_kprintf("do not report data now\n");
  1409. return;
  1410. }
  1411. else if (strstr(item_cmd->valuestring, "color") != RT_NULL)
  1412. {
  1413. if (item_ext != RT_NULL && strstr(item_ext->valuestring, "turn") != RT_NULL)
  1414. {
  1415. device_status.run_sta = 5;
  1416. }
  1417. else
  1418. {
  1419. LOG_W("Unknow cmd value!");
  1420. }
  1421. }
  1422. else if (strstr(item_cmd->valuestring, "synchronization") != RT_NULL)
  1423. {
  1424. // #if Color_EN == 0
  1425. // if (device_status.dtype == 7)
  1426. // {
  1427. // DTU_Write("%s", "SwversionVXCT");
  1428. // }
  1429. // else if (device_status.dtype == 3)
  1430. // {
  1431. // DTU_Write("%s", "SwversionVXCT");
  1432. // }
  1433. // #endif
  1434. device_status.refresh_timeout = 0;
  1435. // driver_4g = cJSON_GetObjectItem(item_ext,"version");
  1436. driver_4g = cJSON_GetObjectItem(item_ext, "dver");
  1437. // project = cJSON_GetObjectItem(item_ext,"project");
  1438. project = cJSON_GetObjectItem(item_ext, "proj");
  1439. datetime = cJSON_GetObjectItem(item_ext, "datetime");
  1440. lat = cJSON_GetObjectItem(item_ext, "lat");
  1441. lng = cJSON_GetObjectItem(item_ext, "lng");
  1442. csq = cJSON_GetObjectItem(item_ext, "csq");
  1443. net = cJSON_GetObjectItem(item_ext, "net");
  1444. sim = cJSON_GetObjectItem(item_ext, "sim");
  1445. iccid = cJSON_GetObjectItem(item_ext, "iccid");
  1446. imei = cJSON_GetObjectItem(item_ext, "imei");
  1447. gps = cJSON_GetObjectItem(item_ext, "gps");
  1448. volume = cJSON_GetObjectItem(item_ext, "volume");
  1449. mqttcfg1 = cJSON_GetObjectItem(item_ext, "mqttcfg1");
  1450. mqttcfg2 = cJSON_GetObjectItem(item_ext, "mqttcfg2");
  1451. link_sta = cJSON_GetObjectItem(item_ext, "link_sta");
  1452. cJSON *gps_inuse = cJSON_GetObjectItem(item_ext, "gps_inuse");
  1453. cJSON *gps_view = cJSON_GetObjectItem(item_ext, "gps_view");
  1454. // 如果DTU的IMEI和FLash中的不一样,保存到FLASH
  1455. value_commn = cJSON_GetObjectItem(item_ext, "photo_sta");
  1456. if (value_commn != RT_NULL)
  1457. {
  1458. device_status.camsta = value_commn->valueint;
  1459. if (device_status.camsta == 0)
  1460. {
  1461. rt_kprintf("相机已连接 \n");
  1462. HMI_WRITE("menu.va_cam.val=1");
  1463. }
  1464. else
  1465. {
  1466. rt_kprintf("相机未连接 \n");
  1467. HMI_WRITE("menu.va_cam.val=0");
  1468. }
  1469. }
  1470. value_commn = cJSON_GetObjectItem(item_ext, "cpu_tmp");
  1471. if (value_commn != RT_NULL)
  1472. {
  1473. HMI_WRITE("menu.cpu_temp.txt=\"%d.%d℃\"", atoi(value_commn->valuestring) / 1000, atoi(value_commn->valuestring) % 1000);
  1474. }
  1475. if (strstr(device_status.imei, imei->valuestring) == RT_NULL)
  1476. {
  1477. rt_kprintf("Change IMEI:new:%s-old:%s", imei->valuestring, device_status.imei);
  1478. rt_sprintf(device_status.imei, "%s", imei->valuestring);
  1479. ef_set_env_blob("imei", &device_status.imei, sizeof(device_status.imei)); // IMEI
  1480. }
  1481. else
  1482. {
  1483. rt_sprintf(device_status.imei, "%s", imei->valuestring);
  1484. rt_kprintf("IMEI not change:%s-%s", imei->valuestring, device_status.imei);
  1485. }
  1486. // 如果DTU的ICCID和FLash中的不一样,保存到FLASH
  1487. if (strstr(device_status.iccid, iccid->valuestring) == RT_NULL)
  1488. {
  1489. rt_kprintf("Change ICCID:new:%s-old:%s", iccid->valuestring, device_status.iccid);
  1490. rt_sprintf(device_status.iccid, "%s", iccid->valuestring);
  1491. ef_set_env_blob("iccid", &device_status.iccid, sizeof(device_status.iccid)); // Iccid
  1492. }
  1493. else
  1494. {
  1495. rt_sprintf(device_status.iccid, "%s", iccid->valuestring);
  1496. rt_kprintf("ICCID not change:%s-%s", iccid->valuestring, device_status.iccid);
  1497. }
  1498. LOG_I("DTU时间:%s", datetime->valuestring);
  1499. static char year_s[5], month_s[3], day_s[3], hour_s[3], min_s[3], sec_s[3];
  1500. strncpy(year_s, datetime->valuestring, 4);
  1501. strncpy(month_s, datetime->valuestring + 4, 2);
  1502. strncpy(day_s, datetime->valuestring + 6, 2);
  1503. strncpy(hour_s, datetime->valuestring + 8, 2);
  1504. strncpy(min_s, datetime->valuestring + 10, 2);
  1505. strncpy(sec_s, datetime->valuestring + 12, 2);
  1506. if (atoi(year_s) >= 2022 && atoi(year_s) < 3000 && atoi(month_s) > 0 && atoi(month_s) < 13 && atoi(day_s) > 0 && atoi(day_s) < 32 && CHECK_DATE(datetime->valuestring))
  1507. {
  1508. // if (atoi(net->valuestring) == 0 && atoi(year_s) >= 2022)
  1509. if (atoi(year_s) >= 2022)
  1510. {
  1511. if (set_date(atoi(year_s), atoi(month_s), atoi(day_s)) == RT_EOK)
  1512. {
  1513. LOG_I("设置日期:%d年%d月%d日", atoi(year_s), atoi(month_s), atoi(day_s));
  1514. if (atoi(hour_s) > 0 && atoi(hour_s) <= 24 && atoi(min_s) >= 0 && atoi(min_s) <= 60 && atoi(sec_s) >= 0 && atoi(sec_s) <= 60)
  1515. {
  1516. LOG_I("设置时间:%d时%d分%d秒", atoi(hour_s), atoi(min_s), atoi(sec_s));
  1517. set_time(atoi(hour_s), atoi(min_s), atoi(sec_s));
  1518. }
  1519. }
  1520. else
  1521. {
  1522. LOG_E("set_date failed!");
  1523. rt_hw_rtc_init();
  1524. }
  1525. }
  1526. else
  1527. {
  1528. LOG_E("网络连接失败,同步时间失败!");
  1529. }
  1530. }
  1531. LOG_I("参数同步:lat:%s lng:%s", lat->valuestring, lng->valuestring);
  1532. // CSQ
  1533. if (csq != NULL && atoi(csq->valuestring) >= 0 && atoi(csq->valuestring) <= 31)
  1534. {
  1535. rt_sprintf(device_status.csq, "%s", csq->valuestring);
  1536. }
  1537. else
  1538. {
  1539. rt_sprintf(device_status.csq, "0");
  1540. }
  1541. // 更新网线接入状态
  1542. if (link_sta != NULL && atoi(link_sta->valuestring) >= 0 && atoi(link_sta->valuestring) <= 1)
  1543. {
  1544. device_status.link_sta = atoi(link_sta->valuestring);
  1545. LOG_I(">>>>>>>>>>>>>有线接入状态>>>>>>>>>>>>>>:%d", device_status.link_sta);
  1546. }
  1547. // Volume
  1548. if (volume != NULL && atoi(volume->valuestring) >= 0 && atoi(volume->valuestring) <= 31)
  1549. {
  1550. device_status.vol = atoi(volume->valuestring);
  1551. LOG_I("设置音量:%d", device_status.vol);
  1552. }
  1553. else
  1554. {
  1555. device_status.vol = 7;
  1556. }
  1557. // NET
  1558. if (net != NULL && atoi(net->valuestring) >= 0 && atoi(net->valuestring) <= 1)
  1559. {
  1560. LOG_I("网络状态:%s", net->valuestring);
  1561. rt_sprintf(device_status.net, "%s", net->valuestring);
  1562. }
  1563. else
  1564. {
  1565. rt_sprintf(device_status.net, "1");
  1566. }
  1567. // SIM
  1568. if (sim != NULL && atoi(sim->valuestring) >= 0 && atoi(sim->valuestring) <= 1)
  1569. {
  1570. rt_sprintf(device_status.sim, "%s", sim->valuestring);
  1571. }
  1572. else
  1573. {
  1574. rt_sprintf(device_status.sim, "1");
  1575. }
  1576. // GPS
  1577. if (gps != NULL && atoi(gps->valuestring) >= 0 && atoi(gps->valuestring) <= 3)
  1578. {
  1579. rt_sprintf(device_status.gps, "%s", gps->valuestring);
  1580. if (atoi(gps->valuestring) != 0)
  1581. {
  1582. #if BOOT_ERR == 1
  1583. if (atoi(gps->valuestring) == 1)
  1584. rt_sprintf(device_status.gps_state, "%s", "GPS+BD");
  1585. if (gps_inuse != NULL)
  1586. {
  1587. device_status.gps_inuse = atoi(gps_inuse->valuestring);
  1588. }
  1589. if (gps_view != NULL)
  1590. {
  1591. device_status.gps_view = atoi(gps_view->valuestring);
  1592. }
  1593. #endif
  1594. if (strstr(device_status.lat, lat->valuestring) == NULL)
  1595. {
  1596. memset(device_status.lat, 0, sizeof(device_status.lat));
  1597. memset(device_status.lng, 0, sizeof(device_status.lng));
  1598. rt_sprintf(device_status.lat, "%s", lat->valuestring);
  1599. rt_sprintf(device_status.lng, "%s", lng->valuestring);
  1600. ef_set_env_blob("lat", &device_status.lat, sizeof(device_status.lat)); // Iccid
  1601. ef_set_env_blob("lng", &device_status.lng, sizeof(device_status.lng)); // Iccid
  1602. }
  1603. else
  1604. {
  1605. LOG_I("经纬度信息同步:lat-%s,lng-%s", lat->valuestring, lng->valuestring);
  1606. }
  1607. }
  1608. else if (atoi(gps->valuestring) == 0)
  1609. {
  1610. memset(device_status.lat, 0, sizeof(device_status.lat));
  1611. memset(device_status.lng, 0, sizeof(device_status.lng));
  1612. rt_sprintf(device_status.lat, "%s", lat->valuestring);
  1613. rt_sprintf(device_status.lng, "%s", lng->valuestring);
  1614. }
  1615. }
  1616. else
  1617. {
  1618. rt_sprintf(device_status.gps, "0");
  1619. memset(device_status.lat, 0, sizeof(device_status.lat));
  1620. memset(device_status.lng, 0, sizeof(device_status.lng));
  1621. if (sizeof(device_status.lat) < 3)
  1622. {
  1623. sprintf(device_status.lat, "%s", "0");
  1624. sprintf(device_status.lng, "%s", "0");
  1625. }
  1626. else
  1627. {
  1628. sprintf(device_status.lat, "%s", lat->valuestring);
  1629. sprintf(device_status.lng, "%s", lng->valuestring);
  1630. }
  1631. }
  1632. if (driver_4g != RT_NULL)
  1633. sprintf(device_status.driver_4g, "%s", driver_4g->valuestring);
  1634. if (project != RT_NULL)
  1635. sprintf(device_status.project, "%s", project->valuestring);
  1636. if (mqttcfg1 != NULL)
  1637. {
  1638. if (strstr("8.136.98.49", mqttcfg1->valuestring) != RT_NULL)
  1639. {
  1640. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1641. }
  1642. else if (strstr("120.27.222.26", mqttcfg1->valuestring) != RT_NULL)
  1643. {
  1644. rt_sprintf(device_status.mqttcfg1, "120.27.222.26");
  1645. }
  1646. else
  1647. {
  1648. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1649. }
  1650. LOG_I("当前平台1:%s", mqttcfg1->valuestring);
  1651. }
  1652. if (mqttcfg2 != NULL)
  1653. {
  1654. sprintf(device_status.mqttcfg2, "%s", mqttcfg2->valuestring);
  1655. LOG_I("当前平台2:%s", mqttcfg2->valuestring);
  1656. }
  1657. if (device_status.num_updata == 0)
  1658. {
  1659. Beep_Tip(100);
  1660. }
  1661. else if (device_status.num_updata != 0 && device_status.hmi_fresh == 2)
  1662. {
  1663. if (strstr(device_status.project, "A7_DTU_V3") != RT_NULL)
  1664. {
  1665. UpLoad_Data();
  1666. rt_kprintf("UpLoad_Data Mark D \n\n");
  1667. }
  1668. else
  1669. {
  1670. rt_thread_delay(2000);
  1671. UpLoad_Data();
  1672. rt_kprintf("UpLoad_Data Mark E \n\n");
  1673. }
  1674. }
  1675. device_status.hmi_fresh = 0;
  1676. }
  1677. /**
  1678. * @brief 平台端下放控制指令
  1679. *
  1680. */
  1681. if (item_ext != RT_NULL && strstr(item_cmd->valuestring, "paramconf") != RT_NULL)
  1682. {
  1683. char change_coll_time = 0;
  1684. /**
  1685. * @brief 内容获取
  1686. *
  1687. */
  1688. tt = cJSON_GetObjectItem(item_ext, "tt");
  1689. ts = cJSON_GetObjectItem(item_ext, "ts");
  1690. tpl = cJSON_GetObjectItem(item_ext, "tpl");
  1691. tph = cJSON_GetObjectItem(item_ext, "tph");
  1692. ds = cJSON_GetObjectItem(item_ext, "ds");
  1693. inr_data = cJSON_GetObjectItem(item_ext, "dat_f");
  1694. inr_photo = cJSON_GetObjectItem(item_ext, "pho_f");
  1695. limit_temp = cJSON_GetObjectItem(item_ext, "limit_temp");
  1696. limit_rain = cJSON_GetObjectItem(item_ext, "limit_rain");
  1697. collstart = cJSON_GetObjectItem(item_ext, "collstart");
  1698. collend = cJSON_GetObjectItem(item_ext, "collend");
  1699. RunFRMS = cJSON_GetObjectItem(item_ext, "RunFRMS");
  1700. FRMSlseek = cJSON_GetObjectItem(item_ext, "FRMSlseek");
  1701. setLux = cJSON_GetObjectItem(item_ext, "setLux");
  1702. fan_speed = cJSON_GetObjectItem(item_ext, "fan_speed");
  1703. pages = cJSON_GetObjectItem(item_ext, "ecode_pagenum");
  1704. tps = cJSON_GetObjectItem(item_ext, "tps");
  1705. Demo_mode = cJSON_GetObjectItem(item_ext, "Demo_mode");
  1706. no_reply = cJSON_GetObjectItem(item_ext, "no_reply");
  1707. /**
  1708. * @brief 参数设置
  1709. *
  1710. */
  1711. int temp = 0;
  1712. /**
  1713. * @brief 光控定时
  1714. *
  1715. */
  1716. if (tt != NULL)
  1717. {
  1718. temp = cjson_getval(tt);
  1719. if (temp >= 1 && temp <= 10)
  1720. {
  1721. limit.LuxTime = temp;
  1722. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1723. rt_kprintf("光控定时tt:%d\n", temp);
  1724. }
  1725. else
  1726. {
  1727. rt_kprintf("光控定时tt设置失败参数错误!!!\n");
  1728. return 0;
  1729. }
  1730. }
  1731. /**
  1732. * @brief 工作模式
  1733. *
  1734. */
  1735. if (ts != NULL)
  1736. {
  1737. temp = cjson_getval(ts);
  1738. if (temp == 0 || temp == 1)
  1739. {
  1740. workmode = RunLight_wx;
  1741. limit.LuxEN = temp;
  1742. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1743. LOG_I("定时模式ts:%d", temp);
  1744. }
  1745. else
  1746. {
  1747. LOG_E("定时模式ts设置失败参数错误!!!");
  1748. return 0;
  1749. }
  1750. }
  1751. /**
  1752. * @brief 低温保护
  1753. *
  1754. */
  1755. if (tpl != NULL)
  1756. {
  1757. temp = cjson_getval(tpl);
  1758. if (temp >= -10 && temp <= 29)
  1759. {
  1760. limit.temp_dw = temp;
  1761. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1762. rt_kprintf("低温保护tpl:%d\n", temp);
  1763. }
  1764. else
  1765. {
  1766. rt_kprintf("低温保护tpl设置失败参数错误!!! %d \n", temp);
  1767. return 0;
  1768. }
  1769. }
  1770. /**
  1771. * @brief 高温保护
  1772. *
  1773. */
  1774. if (tph != NULL)
  1775. {
  1776. temp = cjson_getval(tph);
  1777. if (temp >= 30 && temp <= 80)
  1778. {
  1779. limit.temp_up = temp;
  1780. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1781. rt_kprintf("高温保护tph:%d\n", temp);
  1782. }
  1783. else
  1784. {
  1785. rt_kprintf("高温保护tph设置失败参数错误!!!\n");
  1786. return 0;
  1787. }
  1788. }
  1789. /**
  1790. * @brief 开关机状态
  1791. *
  1792. */
  1793. if (ds != NULL)
  1794. {
  1795. temp = cjson_getval(ds);
  1796. if (temp >= 0 && temp <= 1)
  1797. {
  1798. device_status.ds = temp;
  1799. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  1800. LOG_I("开关机状态:%d", temp);
  1801. }
  1802. else
  1803. {
  1804. LOG_E("开关机状态设置失败参数错误!!!");
  1805. return 0;
  1806. }
  1807. }
  1808. /**
  1809. * @brief 数据间隔
  1810. *
  1811. */
  1812. if (inr_data != NULL)
  1813. {
  1814. temp = cjson_getval(inr_data);
  1815. if (temp >= 5 && temp <= 120)
  1816. {
  1817. device_status.dattim = temp;
  1818. ef_set_env_blob("dattim", &device_status.dattim, sizeof(device_status.dattim));
  1819. LOG_I("数据上传间隔:%d", temp);
  1820. }
  1821. else
  1822. {
  1823. LOG_E("数据上传间隔设置错误!!!");
  1824. return 0;
  1825. }
  1826. }
  1827. /**
  1828. * @brief 照片间隔
  1829. *
  1830. */
  1831. if (inr_photo != NULL)
  1832. {
  1833. temp = cjson_getval(inr_photo);
  1834. if (temp >= 5 && temp <= 120)
  1835. {
  1836. device_status.photim = temp;
  1837. ef_set_env_blob("photim", &device_status.photim, sizeof(device_status.photim));
  1838. LOG_I("照片上传间隔:%d", temp);
  1839. }
  1840. else
  1841. {
  1842. LOG_E("照片上传间隔设置错误!!!");
  1843. return 0;
  1844. }
  1845. }
  1846. /**
  1847. * @brief 温控开关
  1848. *
  1849. */
  1850. if (limit_temp != NULL)
  1851. {
  1852. temp = cjson_getval(limit_temp);
  1853. if (temp >= 0 && temp <= 1)
  1854. {
  1855. limit.temhumEN = temp;
  1856. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1857. LOG_I("温控开关:%d", temp);
  1858. }
  1859. else
  1860. {
  1861. LOG_E("温控开关设置错误!!!");
  1862. return 0;
  1863. }
  1864. }
  1865. /**
  1866. * @brief 雨控开关
  1867. *
  1868. */
  1869. if (limit_rain != NULL)
  1870. {
  1871. temp = cjson_getval(limit_rain);
  1872. if (temp >= 0 && temp <= 1)
  1873. {
  1874. limit.RainEN = temp;
  1875. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1876. LOG_I("温控开关:%d", temp);
  1877. }
  1878. else
  1879. {
  1880. LOG_E("温控开关设置错误!!!");
  1881. return 0;
  1882. }
  1883. }
  1884. /**
  1885. * @brief 时控开始
  1886. *
  1887. */
  1888. if (collstart != NULL)
  1889. {
  1890. temp = cjson_getval(collstart);
  1891. if (temp >= 0 && temp <= 24)
  1892. {
  1893. if(temp != device_status.collecting_sh1)
  1894. {
  1895. change_coll_time = 1;
  1896. }
  1897. device_status.collecting_sh1 = temp;
  1898. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  1899. LOG_I("时控开始:%d", temp);
  1900. }
  1901. else
  1902. {
  1903. LOG_E("时控开始设置错误!!!");
  1904. return 0;
  1905. }
  1906. }
  1907. /**
  1908. * @brief 时控结束
  1909. *
  1910. */
  1911. if (collend != NULL)
  1912. {
  1913. temp = cjson_getval(collend);
  1914. if (temp >= 0 && temp <= 24)
  1915. {
  1916. if(temp != device_status.collecting_eh1)
  1917. {
  1918. change_coll_time = 1;
  1919. }
  1920. device_status.collecting_eh1 = temp;
  1921. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  1922. LOG_I("时控结束:%d", temp);
  1923. }
  1924. else
  1925. {
  1926. LOG_E("时控结束设置错误!!!");
  1927. return 0;
  1928. }
  1929. }
  1930. // if(change_coll_time) 250624 决定先不重启生效
  1931. // {
  1932. // char readinfo[64] = "{\"TimeChange(%d-%d)\":\"NowReboot\"}";
  1933. // char buff[64] = {0};
  1934. // sprintf(buff,readinfo , device_status.collecting_sh1,device_status.collecting_eh1);
  1935. // DTU_Write("%s", buff);
  1936. // rt_hw_cpu_reset();
  1937. // }
  1938. /**
  1939. * @brief FRMS 开启开关
  1940. *
  1941. */
  1942. if (RunFRMS != NULL)
  1943. {
  1944. temp = cjson_getval(RunFRMS);
  1945. if (temp >= 0 && temp <= 1)
  1946. {
  1947. swork.EN = temp;
  1948. ef_set_env_blob("swork", &swork, sizeof(swork));
  1949. LOG_I("FRMS 开启开关:%d", temp);
  1950. }
  1951. else
  1952. {
  1953. LOG_E("FRMS 开启开关设置错误!!!");
  1954. return 0;
  1955. }
  1956. }
  1957. /**
  1958. * @brief 晨曦偏移
  1959. *
  1960. */
  1961. if (FRMSlseek != NULL)
  1962. {
  1963. temp = cjson_getval(FRMSlseek);
  1964. if (temp >= 10 && temp <= 60)
  1965. {
  1966. swork.lseek = temp;
  1967. ef_set_env_blob("swork", &swork, sizeof(swork));
  1968. LOG_I("晨曦偏移:%d", temp);
  1969. }
  1970. else
  1971. {
  1972. LOG_E("晨曦偏移设置错误!!!");
  1973. return 0;
  1974. }
  1975. }
  1976. /**
  1977. * @brief 晨曦光照阈值
  1978. *
  1979. */
  1980. if (setLux != NULL)
  1981. {
  1982. temp = cjson_getval(setLux);
  1983. if (temp >= 50 && temp <= 1000)
  1984. {
  1985. swork.slux_set = temp;
  1986. ef_set_env_blob("swork", &swork, sizeof(swork));
  1987. lwork.lux_set = temp;
  1988. ef_set_env_blob("lwork", &lwork, sizeof(lwork));
  1989. LOG_I("光照阈值:%d", temp);
  1990. }
  1991. else
  1992. {
  1993. LOG_E("光照阈值设置错误!!!");
  1994. return 0;
  1995. }
  1996. }
  1997. /**
  1998. * @brief 风机调速
  1999. *
  2000. */
  2001. if (fan_speed != NULL)
  2002. {
  2003. temp = cjson_getval(fan_speed);
  2004. if (temp >= 10 && temp <= 100)
  2005. {
  2006. syscfg.fan_speed = temp;
  2007. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  2008. LOG_I("风机调速 set:%d", temp);
  2009. CollFanSetPWM(syscfg.fan_speed);
  2010. }
  2011. else
  2012. {
  2013. LOG_E("风机调速设置错误!!!");
  2014. return 0;
  2015. }
  2016. }
  2017. if (pages != NULL)
  2018. {
  2019. temp = cjson_getval(pages);
  2020. ecode_concent_json(temp);
  2021. return 0;
  2022. }
  2023. /**
  2024. * @brief 温控开关
  2025. *
  2026. */
  2027. if (tps != NULL)
  2028. {
  2029. temp = cjson_getval(tps);
  2030. if (temp >= 0 && temp <= 1)
  2031. {
  2032. limit.temhumEN = temp;
  2033. ef_set_env_blob("limit", &limit, sizeof(limit));
  2034. if (limit.temhumEN == 1)
  2035. LOG_I("温控开关 打开 %d ~ %d℃\n", limit.temp_dw, limit.temp_up);
  2036. else
  2037. LOG_I("温控开关 关闭");
  2038. CollFanSetPWM(syscfg.fan_speed);
  2039. }
  2040. else
  2041. {
  2042. LOG_E("温控开关设置错误!!!");
  2043. return 0;
  2044. }
  2045. }
  2046. /**
  2047. * @brief 演示模式
  2048. *
  2049. */
  2050. if (Demo_mode != NULL)
  2051. {
  2052. temp = cjson_getval(Demo_mode);
  2053. if (temp == 0 || temp == 1)
  2054. {
  2055. syscfg.Demo_mode = temp;
  2056. if (temp)
  2057. LOG_I("演示模式 > 打开");
  2058. else
  2059. LOG_I("演示模式 > 关闭");
  2060. }
  2061. else
  2062. {
  2063. LOG_E("演示模式设置参数错误!!!");
  2064. return 0;
  2065. }
  2066. }
  2067. UpLoad_Data_refresh();
  2068. if (no_reply == NULL)
  2069. {
  2070. rt_thread_mdelay(200);
  2071. LOG_I("执行一次平台端回复");
  2072. UpLoad_Data();
  2073. }
  2074. rt_thread_delay(2000);
  2075. // 2022/06/23,add:
  2076. if (device_status.dtype == 3)
  2077. {
  2078. rt_sprintf(device_status.json_w_clock, "平台操作:修改工作时间:开始-%d,结束-%d,模式-%d(0-光控,1-时控)-%s", device_status.startBar, device_status.stopBar, device_status.timeSwitch, device_status.stamp);
  2079. json_s = makeJson_Warn(device_status.json_w_clock, "修改时间");
  2080. ef_set_env_blob("json_w_clock", &device_status.json_w_clock, sizeof(device_status.json_w_clock)); // 将修改屏幕参数操作记录保存到Flash中
  2081. if (atoi(device_status.net) == 0)
  2082. DTU_Write("%s", json_s);
  2083. rt_free(json_s);
  2084. }
  2085. rt_thread_delay(1000);
  2086. MA_save();
  2087. rt_thread_delay(1000);
  2088. }
  2089. }
  2090. cJSON_Delete(root);
  2091. }
  2092. return 0;
  2093. }
  2094. /**
  2095. * @brief 执行上报状态信息json的动作
  2096. *
  2097. */
  2098. void UpLoad_Data_refresh(void)
  2099. {
  2100. char *updata = makeJson_refresh();
  2101. // rt_kprintf("upload data:%d%s", rt_strlen(updata), updata);
  2102. rt_free(updata);
  2103. DTU_Write("%s", updata);
  2104. // list_mem();
  2105. // 播放数据上传中语音
  2106. }
  2107. /**
  2108. * @brief 执行上报状态信息json的动作
  2109. *
  2110. */
  2111. void UpLoad_Data(void)
  2112. {
  2113. char *updata = makeJson();
  2114. rt_kprintf("upload data:%d%s", rt_strlen(updata), updata);
  2115. rt_free(updata);
  2116. DTU_Write("%s", updata);
  2117. // list_mem();
  2118. // 播放数据上传中语音
  2119. }
  2120. void updata(void)
  2121. {
  2122. UpLoad_Data();
  2123. }
  2124. MSH_CMD_EXPORT(updata, updata);
  2125. static void RESET_ENV_TEST(void)
  2126. {
  2127. ef_env_set_default();
  2128. Recode_e_code(e_para_setdef , 1 ,"强制恢复默认参数");
  2129. }
  2130. MSH_CMD_EXPORT(RESET_ENV_TEST , RESET_ENV_TEST);