dtu_uart2.c 78 KB

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