dtu_uart2.c 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215
  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_TN.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), 1);
  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!\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_status.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_TN.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)
  660. temp_c = sensor[s_Temp].eValue;
  661. else
  662. temp_c = device_status.tempture;
  663. if (sensor[s_Humi].online)
  664. humi_c = sensor[s_Humi].eValue;
  665. else
  666. humi_c = device_status.humidity;
  667. // rt_kprintf("temp %s humi %s\n",temp_c , humi_c);
  668. // 温度
  669. cJSON_AddStringToObject(pSubJson, "at", temp_c);
  670. // 湿度
  671. cJSON_AddStringToObject(pSubJson, "ah", humi_c);
  672. cJSON_AddStringToObject(pSubJson, "imei", device_status.imei); // IMEI
  673. cJSON_AddStringToObject(pSubJson, "iccid", device_status.iccid); // ICCID
  674. cJSON_AddStringToObject(pSubJson, "stamp", device_status.stamp); // 时间
  675. // 经度
  676. cJSON_AddStringToObject(pSubJson, "lng", device_status.lng);
  677. // 纬度
  678. cJSON_AddStringToObject(pSubJson, "lat", device_status.lat);
  679. // 是否为上电开机
  680. cJSON_AddNumberToObject(pSubJson, "rcnt", device_status.rebootcnt);
  681. // 电流(当前)
  682. cJSON_AddStringToObject(pSubJson, "current", device_status.power);
  683. // 电压
  684. cJSON_AddStringToObject(pSubJson, "vbat", device_status.voltage);
  685. // 数据上传间隔
  686. rt_sprintf(utos, "%d", syscfg.dattim);
  687. cJSON_AddStringToObject(pSubJson, "dat_f", utos);
  688. // 照片上传间隔
  689. rt_sprintf(utos, "%d", syscfg.photim);
  690. cJSON_AddStringToObject(pSubJson, "pho_f", utos);
  691. // 风机调速
  692. rt_sprintf(utos, "%d", RayTigCnt);
  693. cJSON_AddStringToObject(pSubJson, "RayTigCnt", utos);
  694. // 信号强度
  695. cJSON_AddStringToObject(pSubJson, "csq", device_status.csq);
  696. char *p = cJSON_PrintUnformatted(pJsonRoot);
  697. if (NULL == p)
  698. {
  699. cJSON_Delete(pJsonRoot);
  700. rt_kprintf("cJSON_Delete NULL!!!\n");
  701. return NULL;
  702. }
  703. cJSON_Delete(pJsonRoot);
  704. return p;
  705. }
  706. /**
  707. * @brief 组包返回信息的json
  708. *
  709. * @return char* 组包完成后的字符串指针
  710. */
  711. char *makeJson_Return(char *cmd, char *data)
  712. {
  713. // 创建一个JSON对象
  714. cJSON *root = cJSON_CreateObject();
  715. if (root == NULL)
  716. {
  717. fprintf(stderr, "Error creating JSON object\n");
  718. return NULL;
  719. }
  720. // 在JSON对象中添加键值对
  721. cJSON_AddStringToObject(root, cmd, data);
  722. // 将JSON对象转换为字符串
  723. char *json_str = cJSON_Print(root);
  724. if (json_str == NULL)
  725. {
  726. fprintf(stderr, "Error printing JSON string\n");
  727. // 释放JSON对象的内存
  728. cJSON_Delete(root);
  729. return NULL;
  730. }
  731. // 释放JSON对象的内存
  732. cJSON_Delete(root);
  733. return json_str;
  734. }
  735. /***************** 241217 新增控制指令框架 *******************/
  736. static RC_Def rcdList[TypeMAX_rcd] =
  737. {
  738. {read_limit_rcd, "read_limit"},
  739. {TEMP_ON_rcd, "TEMP_ON"},
  740. {TEMP_OFF_rcd, "TEMP_OFF"},
  741. {RAIN_ON_rcd, "RAIN_ON"},
  742. {RAIN_OFF_rcd, "RAIN_OFF"},
  743. {RunLight_rcd, "RunLight"},
  744. {RunTime_rcd, "RunTime"},
  745. {Read_ecode_rcd, "Read_ecode"},
  746. {FBtest_rcd, "FB_TEST"},
  747. {SCMtest_rcd, "SCM_TEST"},
  748. {Clear_log_rcd, "clear_log"},
  749. {Read_status_rcd, "Read_status"}};
  750. static RCD Get_RCType(char *cmd)
  751. {
  752. RCD res = TypeMAX_rcd;
  753. for (uint8_t a = 0; a < TypeMAX_rcd; a++)
  754. {
  755. if (strstr(cmd, rcdList[a].keyword) != NULL)
  756. {
  757. return rcdList[a].rcd;
  758. }
  759. }
  760. return res;
  761. }
  762. static char RC_Res[512] = {0};
  763. /**
  764. * @brief 把收到的请求指令解析出来
  765. *
  766. * @param cmd 指令
  767. */
  768. void prase_Rcmd(char *cmd)
  769. {
  770. if (strstr(cmd, "RC") == NULL || Get_RCType(cmd) == TypeMAX_rcd)
  771. {
  772. rt_kprintf("prase_Rcmd no keyword find \n\n");
  773. return;
  774. }
  775. RCD type = Get_RCType(cmd);
  776. // rt_kprintf("type %d \n", type);
  777. switch (type)
  778. {
  779. case read_limit_rcd:
  780. sprintf(RC_Res, "\"温湿控- %s | 光控-%s | 雨控-%s\"",
  781. limit.temhumEN ? "开" : "关",
  782. limit.LuxEN ? "开" : "关",
  783. limit.RainEN ? "开" : "关");
  784. break;
  785. case TEMP_ON_rcd:
  786. limit.temhumEN = ON;
  787. ef_set_env_blob("limit", &limit, sizeof(Limit));
  788. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  789. break;
  790. case TEMP_OFF_rcd:
  791. limit.temhumEN = OFF;
  792. ef_set_env_blob("limit", &limit, sizeof(Limit));
  793. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  794. break;
  795. case RAIN_ON_rcd:
  796. limit.RainEN = ON;
  797. ef_set_env_blob("limit", &limit, sizeof(Limit));
  798. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  799. break;
  800. case RAIN_OFF_rcd:
  801. limit.RainEN = OFF;
  802. ef_set_env_blob("limit", &limit, sizeof(Limit));
  803. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  804. break;
  805. case RunLight_rcd:
  806. limit.LuxEN = ON;
  807. if (limit.LuxTime == 0)
  808. {
  809. limit.LuxTime = gktime_def;
  810. }
  811. ef_set_env_blob("limit", &limit, sizeof(Limit));
  812. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  813. break;
  814. case RunTime_rcd:
  815. limit.LuxEN = OFF;
  816. ef_set_env_blob("limit", &limit, sizeof(Limit));
  817. sprintf(RC_Res, "\"%s\"", rcdList[type].keyword);
  818. break;
  819. case Read_ecode_rcd:
  820. getEcodeData(1);
  821. break;
  822. case Read_status_rcd:
  823. status_Pri(0);
  824. break;
  825. case FBtest_rcd:
  826. jts.FBtest = ON;
  827. status_Pri(2);
  828. break;
  829. case SCMtest_rcd:
  830. jts.scm_test = ON;
  831. status_Pri(3);
  832. break;
  833. case Clear_log_rcd:
  834. ef_log_clean();
  835. char static_array[] = "{\"cmd\":\"data\",\"ext\":{\"RC\":\"Ecode 已清空\"}}";
  836. DTU_Write(static_array);
  837. break;
  838. default:
  839. break;
  840. }
  841. if (type != Read_ecode_rcd)
  842. {
  843. // rt_kprintf("\n");
  844. // rt_kprintf(return_modle, RC_Res);
  845. // rt_kprintf("\n");
  846. DTU_Write(return_modle, RC_Res);
  847. }
  848. }
  849. /***************** 241217 新增控制指令框架 *******************/
  850. /**
  851. * @brief 获取Cjson数值
  852. *
  853. * @return int
  854. */
  855. int cjson_getval(cJSON *json)
  856. {
  857. if (json->type == cJSON_Number)
  858. {
  859. return json->valueint;
  860. }
  861. else if (json->type == cJSON_String)
  862. {
  863. return atoi(json->valuestring);
  864. }
  865. else
  866. {
  867. return -99;
  868. }
  869. }
  870. // #include "Work_TN.h"
  871. struct tm time_c = {0}; // 缓存 同时用于返回时间
  872. /**
  873. * @brief 检查将要对时的时间是否合法
  874. *
  875. * @param cmd 字符串的时间
  876. * @return NULL-非法 other-合法
  877. */
  878. static struct tm *CHECK_DATE(char *cmd)
  879. {
  880. if (cmd == NULL)
  881. {
  882. return NULL;
  883. }
  884. ReFlash_RTC();
  885. #define TIME_STEP 10 // 时间差值在30分钟内的 可以直接对时
  886. char datetime[16] = {0};
  887. strncpy(datetime, cmd, 16);
  888. // uint32_t ntc_time = atoi(datetime);
  889. uint32_t yyyy = 2000 + GetDate.Year;
  890. uint32_t mm = GetDate.Month;
  891. uint32_t dd = GetDate.Date;
  892. uint32_t hh = GetTime.Hours;
  893. uint32_t min = GetTime.Minutes;
  894. // uint32_t now_time = (yyyy * 1000000) + (mm * 10000) + (dd * 100) + hh;
  895. int32_t diff_val = 0;
  896. static char year_s[5], month_s[3], day_s[3], hour_s[3], min_s[3], sec_s[3];
  897. strncpy(year_s, datetime, 4);
  898. strncpy(month_s, datetime + 4, 2);
  899. strncpy(day_s, datetime + 6, 2);
  900. strncpy(hour_s, datetime + 8, 2);
  901. strncpy(min_s, datetime + 10, 2);
  902. strncpy(sec_s, datetime + 12, 2);
  903. if (strlen(cmd) != 14)
  904. {
  905. return NULL;
  906. }
  907. if (yyyy < 2024)
  908. {
  909. goto _USE_NTP;
  910. }
  911. if (atoi(year_s) == yyyy && atoi(month_s) == mm && atoi(day_s) == dd) // 年月日相同
  912. {
  913. diff_val = (atoi(hour_s) * 60 + atoi(min_s)) - (hh * 60 + min);
  914. if (abs(diff_val) > TIME_STEP)
  915. {
  916. if (diff_val > 0)
  917. {
  918. goto _TRUN_RIGHT;
  919. }
  920. else
  921. {
  922. goto _TRUN_LIFT;
  923. }
  924. }
  925. else
  926. {
  927. goto _USE_NTP;
  928. }
  929. }
  930. else // 年月日不同
  931. {
  932. if (atoi(year_s) > yyyy)
  933. {
  934. goto _TRUN_RIGHT;
  935. }
  936. if (atoi(year_s) < yyyy)
  937. {
  938. goto _TRUN_LIFT;
  939. }
  940. if (atoi(month_s) > mm)
  941. {
  942. goto _TRUN_RIGHT;
  943. }
  944. if (atoi(month_s) < mm)
  945. {
  946. goto _TRUN_LIFT;
  947. }
  948. if (atoi(day_s) > dd)
  949. {
  950. goto _TRUN_RIGHT;
  951. }
  952. if (atoi(day_s) < dd)
  953. {
  954. goto _TRUN_LIFT;
  955. }
  956. }
  957. _USE_NTP:
  958. // LOG_I("CHECK_DATE OUT A %s\n" , cmd);
  959. time_c.tm_year = atoi(year_s);
  960. time_c.tm_mon = atoi(month_s);
  961. time_c.tm_mday = atoi(day_s);
  962. time_c.tm_hour = atoi(hour_s);
  963. time_c.tm_min = atoi(min_s);
  964. time_c.tm_sec = atoi(sec_s);
  965. 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);
  966. return &time_c;
  967. _TRUN_LIFT: // 向后对时(当前时间过快)
  968. if ((min + (hh * 60) - TIME_STEP) > 0)
  969. {
  970. time_c.tm_year = GetDate.Year + 2000;
  971. time_c.tm_mon = GetDate.Month;
  972. time_c.tm_mday = GetDate.Date;
  973. time_c.tm_hour = (min + (hh * 60) - TIME_STEP) / 60;
  974. time_c.tm_min = (min + (hh * 60) - TIME_STEP) % 60;
  975. // LOG_E("CHECK_DATE OUT B %s\n" , cmd);
  976. 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);
  977. return &time_c;
  978. }
  979. else
  980. {
  981. return NULL;
  982. }
  983. return &time_c;
  984. _TRUN_RIGHT: // 向前对时(当前时间过慢)
  985. if ((min + (hh * 60) + TIME_STEP) < 1440)
  986. {
  987. time_c.tm_year = GetDate.Year + 2000;
  988. time_c.tm_mon = GetDate.Month;
  989. time_c.tm_mday = GetDate.Date;
  990. time_c.tm_hour = (min + (hh * 60) + TIME_STEP) / 60;
  991. time_c.tm_min = (min + (hh * 60) + TIME_STEP) % 60;
  992. // LOG_E("CHECK_DATE OUT C %s\n" , cmd);
  993. 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);
  994. return &time_c;
  995. }
  996. else
  997. {
  998. return NULL;
  999. }
  1000. return &time_c;
  1001. }
  1002. extern holdon_rtcreflash;
  1003. /**
  1004. * @brief 设置NTP时间
  1005. *
  1006. * @param ntptime
  1007. */
  1008. void EXE_NTP_SETTIME(struct tm *ntptime)
  1009. {
  1010. if (ntptime == NULL)
  1011. {
  1012. return;
  1013. }
  1014. static char err_cnt = 0;
  1015. 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)
  1016. {
  1017. if (atoi(device_status.net) == 0 && ntptime->tm_year >= 2022)
  1018. {
  1019. holdon_rtcreflash = 1;
  1020. rt_thread_mdelay(300);
  1021. if (set_date(ntptime->tm_year, ntptime->tm_mon, ntptime->tm_mday) == RT_EOK)
  1022. {
  1023. LOG_I("设置日期:%d年%d月%d日", ntptime->tm_year, ntptime->tm_mon, ntptime->tm_mday);
  1024. 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)
  1025. {
  1026. LOG_I("设置时间:%d时%d分%d秒", ntptime->tm_hour, ntptime->tm_min, ntptime->tm_sec);
  1027. set_time(ntptime->tm_hour, ntptime->tm_min, ntptime->tm_sec);
  1028. rt_thread_mdelay(1500);
  1029. if (GetDate.Year > 200)
  1030. {
  1031. err_cnt++;
  1032. LOG_W("set_time failed . %d", err_cnt);
  1033. if (err_cnt > 9)
  1034. {
  1035. Recode_e_code(e_rtc_fail, GetDate.Year, "RTC时间写入失败");
  1036. rt_hw_cpu_reset();
  1037. }
  1038. }
  1039. else if (err_cnt > 0)
  1040. {
  1041. err_cnt--;
  1042. }
  1043. }
  1044. else
  1045. {
  1046. rt_kprintf("else B %d:%d:%d\n" , ntptime->tm_hour, ntptime->tm_min, ntptime->tm_sec);
  1047. }
  1048. }
  1049. else
  1050. {
  1051. LOG_E("set_date failed!");
  1052. rt_hw_rtc_init();
  1053. }
  1054. }
  1055. else
  1056. {
  1057. LOG_E("网络连接失败,同步时间失败!");
  1058. }
  1059. }
  1060. holdon_rtcreflash = 0;
  1061. }
  1062. extern Reflash_test_sta rts;
  1063. extern void Get_work_mode(void);
  1064. extern char errcnt_getinfo;
  1065. volatile char Demo_Mode_NEW = 0;
  1066. // JSON数据解析
  1067. /**
  1068. * @brief 解析dtu发来的指令
  1069. *
  1070. * @param json_string 收到的json字符串
  1071. * @return int 0 完成
  1072. */
  1073. int parseDtu(char *json_string)
  1074. {
  1075. extern int rt_hw_rtc_init(void);
  1076. char *json_s = NULL;
  1077. cJSON *item_cmd = NULL; // 嵌套ext
  1078. cJSON *item_ext = NULL; // 嵌套ext
  1079. cJSON *item_checkself = NULL; //
  1080. /**
  1081. * 有用的小虫体指令
  1082. *
  1083. */
  1084. cJSON *collstart = NULL; // 时控开始(整型 / 时)
  1085. cJSON *collend = NULL; // 时控结束(整型 / 时)
  1086. cJSON *tt = NULL; // 光控定时时长(整型 / 时)
  1087. cJSON *ts = NULL; // 工作模式(整型 / 0-时控 1-光控)
  1088. cJSON *tpl = NULL; // 低温保护阈值
  1089. cJSON *tph = NULL; // 高温保护阈值
  1090. cJSON *inr_data = NULL; // 数据上传间隔(整型 / min)
  1091. cJSON *inr_photo = NULL; // 拍照间隔(整型 / min)
  1092. cJSON *limit_temp = NULL; // 设置温控开关(bool / 0-关闭 1-开启)
  1093. cJSON *limit_rain = NULL; // 设置雨控开关(bool / 0-关闭 1-开启)
  1094. cJSON *Demo_mode = NULL;
  1095. cJSON *ntp_time = NULL;
  1096. cJSON *CONTROL = NULL;
  1097. /**
  1098. * 有用的小虫体指令
  1099. *
  1100. */
  1101. cJSON *gps = NULL; // 定位状态
  1102. cJSON *datetime = NULL;
  1103. cJSON *lat = NULL;
  1104. cJSON *lng = NULL;
  1105. cJSON *csq = NULL;
  1106. cJSON *net = NULL;
  1107. cJSON *iccid = NULL;
  1108. cJSON *imei = NULL;
  1109. cJSON *sim = NULL;
  1110. cJSON *volume = NULL;
  1111. cJSON *driver_4g = NULL; // 版本号
  1112. cJSON *project = NULL; // Project
  1113. cJSON *ds = NULL; // 设备状态
  1114. // cJSON *vt = NULL; // 版本类型
  1115. // cJSON* account_status = NULL; //卡状态
  1116. // cJSON* data_plan = NULL; //套餐
  1117. // cJSON* data_usage = NULL; //已使用
  1118. // cJSON* expiry_date = NULL; //到期时间
  1119. cJSON *mqttcfg1 = NULL;
  1120. cJSON *mqttcfg2 = NULL;
  1121. cJSON *type = NULL;
  1122. cJSON *hum = NULL;
  1123. cJSON *tmp = NULL;
  1124. cJSON *link_sta = NULL;
  1125. cJSON *value_commn = NULL;
  1126. cJSON *fan_speed = NULL;
  1127. if (strlen(json_string) < 5)
  1128. {
  1129. return;
  1130. }
  1131. // rt_kprintf("parseDtu : %s\n", json_string);
  1132. const char *error_ptr = NULL;
  1133. cJSON *root = cJSON_ParseWithOpts(json_string, &error_ptr, 1);
  1134. if (!root)
  1135. {
  1136. rt_kprintf("Parse error: ->%s<-\n", error_ptr);
  1137. return -1;
  1138. }
  1139. else if (strstr(json_string, "RC") != NULL) // 私有测试指令
  1140. {
  1141. prase_Rcmd(json_string);
  1142. cJSON_Delete(root);
  1143. }
  1144. else if (strstr(json_string, "DEVICE_SERIAL_NUMBER") != NULL) // 解析新协议指令
  1145. {
  1146. prase_NewCmd(json_string);
  1147. cJSON_Delete(root);
  1148. }
  1149. else
  1150. {
  1151. item_cmd = cJSON_GetObjectItem(root, "cmd");
  1152. item_ext = cJSON_GetObjectItem(root, "ext");
  1153. item_checkself = cJSON_GetObjectItem(root, "selfcheck");
  1154. // item_data = cJSON_GetObjectItem(root,"data");
  1155. if (item_checkself != NULL)
  1156. { // 自检签名
  1157. LOG_I("自检签名:%s", item_checkself->valuestring);
  1158. // 执行一键测试任务
  1159. jts.autotest = ON;
  1160. device_status.test_flag = 10;
  1161. }
  1162. if (item_cmd != RT_NULL)
  1163. {
  1164. if (strstr(item_cmd->valuestring, "takephoto") != RT_NULL)
  1165. {
  1166. rts.takephoto_t = ON;
  1167. rt_kprintf("拍照测试:打开\n");
  1168. char *photo = makeJson_Warn("takephoto", "control");
  1169. DTU_Write("%s", photo);
  1170. rt_free(photo);
  1171. }
  1172. else if (strstr(item_cmd->valuestring, "json_w_clock") != RT_NULL)
  1173. {
  1174. rt_kprintf("查询时间配置!\n");
  1175. json_s = makeJson_Warn(device_status.json_w_clock, "主动查询");
  1176. DTU_Write("%s", json_s);
  1177. rt_free(json_s);
  1178. rt_thread_delay(1000);
  1179. }
  1180. else if (strstr(item_cmd->valuestring, "json_w_reset") != RT_NULL)
  1181. {
  1182. rt_kprintf("查询重置配置!\n");
  1183. json_s = makeJson_Warn(device_status.json_w_reset, "主动查询");
  1184. DTU_Write("%s", json_s);
  1185. rt_free(json_s);
  1186. rt_thread_delay(1000);
  1187. }
  1188. else if (strstr(item_cmd->valuestring, "json_w_platform") != RT_NULL)
  1189. {
  1190. rt_kprintf("查询平台配置!\n");
  1191. json_s = makeJson_Warn(device_status.json_w_platform, "主动查询");
  1192. DTU_Write("%s", json_s);
  1193. rt_free(json_s);
  1194. rt_thread_delay(1000);
  1195. }
  1196. else if (strstr(item_cmd->valuestring, "shake") != RT_NULL)
  1197. {
  1198. ctr_shake(ON, 30);
  1199. char *shake = makeJson_Warn("shake", "control");
  1200. DTU_Write("%s", shake);
  1201. rt_free(shake);
  1202. rt_thread_delay(2000);
  1203. }
  1204. // 远程给rtu重新上电
  1205. else if (strstr(item_cmd->valuestring, "ctrl") != RT_NULL)
  1206. {
  1207. type = cJSON_GetObjectItem(item_ext, "type");
  1208. if (strstr(type->valuestring, "rtu_off_on") != RT_NULL)
  1209. {
  1210. LOG_W("DTU 12V Power down");
  1211. ctr_RTU_DTU(OFF);
  1212. rt_thread_delay(5000);
  1213. ctr_RTU_DTU(ON);
  1214. }
  1215. // 对焦拍照
  1216. else if (strstr(type->valuestring, "auto_takephoto") != RT_NULL)
  1217. {
  1218. device_status.autotakepic = 1;
  1219. rt_thread_delay(2000);
  1220. char *auto_takephoto = makeJson_Warn("send cmd success:auto_takephoto", "control");
  1221. DTU_Write("%s", auto_takephoto);
  1222. rt_free(auto_takephoto);
  1223. }
  1224. else if (strstr(type->valuestring, "takephoto") != RT_NULL)
  1225. {
  1226. rts.takephoto_t = ON;
  1227. rt_kprintf("拍照测试:打开\n");
  1228. }
  1229. else if (strstr(type->valuestring, "led_on") != RT_NULL)
  1230. {
  1231. rts.switchled_t = ON;
  1232. rt_kprintf("补光测试:打开\n");
  1233. }
  1234. else if (strstr(type->valuestring, "led_off") != RT_NULL)
  1235. {
  1236. rts.switchled_t = OFF;
  1237. rt_kprintf("补光测试:关闭\n");
  1238. }
  1239. }
  1240. // 切换平台
  1241. else if (strstr(item_cmd->valuestring, "platform") != RT_NULL)
  1242. {
  1243. type = cJSON_GetObjectItem(item_ext, "type");
  1244. if (strstr(type->valuestring, "8.136.98.49") != RT_NULL)
  1245. {
  1246. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1247. ef_set_env_blob("platform", &device_status.mqttcfg1, sizeof(device_status.mqttcfg1));
  1248. // 给RTU发送切换指令
  1249. DTU_Write("%s", makeJson_platform("8.136.98.49"));
  1250. rt_free(makeJson_platform("8.136.98.49"));
  1251. rt_thread_delay(1000);
  1252. rt_sprintf(device_status.json_w_platform, "平台操作:切换平台>大数据,操作时间:%s", device_status.stamp);
  1253. json_s = makeJson_Warn(device_status.json_w_platform, "切换平台");
  1254. ef_set_env_blob("json_w_platform", &device_status.json_w_platform, sizeof(device_status.json_w_platform)); // 将修改屏幕参数操作记录保存到Flash中
  1255. if (atoi(device_status.net) == 0)
  1256. DTU_Write("%s", json_s);
  1257. rt_free(json_s);
  1258. rt_thread_delay(1000);
  1259. MA_save();
  1260. }
  1261. else if (strstr(type->valuestring, "120.27.222.26") != RT_NULL)
  1262. {
  1263. rt_sprintf(device_status.mqttcfg1, "120.27.222.26");
  1264. ef_set_env_blob("platform", &device_status.mqttcfg1, sizeof(device_status.mqttcfg1));
  1265. // 给RTU发送切换指令
  1266. DTU_Write("%s", makeJson_platform("120.27.222.26"));
  1267. rt_free(makeJson_platform("120.27.222.26"));
  1268. rt_thread_delay(1000);
  1269. rt_sprintf(device_status.json_w_platform, "平台操作:切换平台>四情,操作时间:%s", device_status.stamp);
  1270. json_s = makeJson_Warn(device_status.json_w_platform, "切换平台");
  1271. ef_set_env_blob("json_w_platform", &device_status.json_w_platform, sizeof(device_status.json_w_platform)); // 将修改屏幕参数操作记录保存到Flash中
  1272. if (atoi(device_status.net) == 0)
  1273. DTU_Write("%s", json_s);
  1274. rt_free(json_s);
  1275. rt_thread_delay(1000);
  1276. MA_save();
  1277. }
  1278. }
  1279. // 水稻2000万像素的串口拍照指令
  1280. else if (strstr(item_cmd->valuestring, "mvs_photo") != RT_NULL)
  1281. {
  1282. HK_TakePhoto();
  1283. char *photo = makeJson_Warn("mvs_takephoto", "control");
  1284. DTU_Write("%s", photo);
  1285. rt_free(photo);
  1286. rt_thread_delay(2000);
  1287. }
  1288. else if (strstr(item_cmd->valuestring, "reboot") != RT_NULL)
  1289. {
  1290. char *restart = makeJson_Warn("sysrem will restart", "control");
  1291. rt_kprintf("%s\n", restart);
  1292. rt_thread_delay(2000);
  1293. DTU_Write("%s", restart);
  1294. rt_hw_cpu_reset();
  1295. }
  1296. else if (strstr(item_cmd->valuestring, "reset") != RT_NULL)
  1297. {
  1298. ResetParamDefault();
  1299. char *restart = makeJson_Warn("sysrem will reset", "control");
  1300. DTU_Write("%s", restart);
  1301. rt_free(restart);
  1302. rt_thread_delay(2000);
  1303. }
  1304. else if (strstr(item_cmd->valuestring, "update") != RT_NULL)
  1305. {
  1306. rt_kprintf("准备升级!!!");
  1307. device_status.update_flag = 1;
  1308. ef_set_env_blob("update_flag", &device_status.update_flag, sizeof(device_status.update_flag));
  1309. rt_kprintf("%s\n", makeJson_Warn("system will update", "control"));
  1310. rt_thread_delay(2000);
  1311. DTU_Write("%s", makeJson_Warn("system will update", "control"));
  1312. rt_thread_delay(20);
  1313. rt_hw_cpu_reset();
  1314. }
  1315. else if (strstr(item_cmd->valuestring, "read") != RT_NULL)
  1316. {
  1317. SendReadInfo('A');
  1318. device_status.hmi_fresh = 2;
  1319. device_status.refresh_num = 15;
  1320. }
  1321. else if (strstr(item_cmd->valuestring, "poweron") != RT_NULL)
  1322. {
  1323. device_status.ds = 1;
  1324. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds)); //
  1325. UpLoad_Data(0); // 开启设备开关回复
  1326. rt_kprintf("UpLoad_Data Mark B \n\n");
  1327. }
  1328. else if (strstr(item_cmd->valuestring, "poweroff") != RT_NULL)
  1329. {
  1330. device_status.ds = 0;
  1331. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds)); //
  1332. UpLoad_Data(0); // 关闭设备开关回复
  1333. rt_kprintf("UpLoad_Data Mark C \n\n");
  1334. }
  1335. // else if (strstr(item_cmd->valuestring,"log")!=RT_NULL) {
  1336. // rt_thread_mdelay(2000);
  1337. // //read_all_flash_log();
  1338. // }
  1339. // 设置温湿度
  1340. else if (strstr(item_cmd->valuestring, "sensor") != RT_NULL)
  1341. {
  1342. // 2022-04-12add:485传感器正常,不再解析服务器下发的温湿度数据
  1343. // if(device_status.sensor_485_sta!=0) return 0;
  1344. hum = cJSON_GetObjectItem(item_ext, "new_hum");
  1345. tmp = cJSON_GetObjectItem(item_ext, "new_tem");
  1346. if (hum != NULL && tmp != NULL)
  1347. {
  1348. // 先判断是否是空字符再判断数值是否合理
  1349. if (strcmp(hum->valuestring, "") != 0 && atoi(hum->valuestring) >= 0 && atoi(hum->valuestring) <= 100 && atoi(hum->valuestring) != 30 && device_status.sensor_485_sta == 0)
  1350. {
  1351. if (atoi(hum->valuestring) != atoi(device_status.humidity))
  1352. {
  1353. rt_sprintf(device_status.humidity, "%s", hum->valuestring);
  1354. ef_set_env_blob("env_h", &device_status.humidity, sizeof(device_status.humidity)); // 湿度
  1355. rt_kprintf("保存湿度成功:%d\n", atoi(device_status.humidity));
  1356. }
  1357. rt_kprintf("设置湿度成功:%d\n", atoi(device_status.humidity));
  1358. }
  1359. else
  1360. {
  1361. rt_kprintf("设置湿度失败:%s!!!\n", hum->valuestring);
  1362. }
  1363. // 先判断是否是空字符再判断数值是否合理
  1364. if (strcmp(tmp->valuestring, "") != 0 && atoi(tmp->valuestring) > -50 && atoi(tmp->valuestring) <= 100 && device_status.sensor_485_sta == 0)
  1365. {
  1366. if (atoi(tmp->valuestring) != atoi(device_status.tempture))
  1367. {
  1368. rt_sprintf(device_status.tempture, "%s", tmp->valuestring);
  1369. ef_set_env_blob("env_t", &device_status.tempture, sizeof(device_status.tempture)); // 湿度
  1370. rt_kprintf("保存温度成功:%d\n", atoi(device_status.tempture));
  1371. }
  1372. rt_kprintf("设置温度成功:%d\n", atoi(device_status.tempture));
  1373. }
  1374. else
  1375. {
  1376. rt_kprintf("设置温度失败:%s!!!\n", tmp->valuestring);
  1377. }
  1378. }
  1379. }
  1380. else if (strstr(item_cmd->valuestring, "color") != RT_NULL)
  1381. {
  1382. if (item_ext != RT_NULL && strstr(item_ext->valuestring, "turn") != RT_NULL)
  1383. {
  1384. device_status.run_sta = 5;
  1385. }
  1386. else
  1387. {
  1388. LOG_W("Unknow cmd value!");
  1389. }
  1390. }
  1391. else if (strstr(item_cmd->valuestring, "synchronization") != RT_NULL)
  1392. {
  1393. errcnt_getinfo = 0; //收到rtu消息了
  1394. #if Color_EN == 0
  1395. if (device_status.dtype == 7)
  1396. {
  1397. DTU_Write("%s", VERSION);
  1398. }
  1399. else if (device_status.dtype == 3)
  1400. {
  1401. DTU_Write("%s", VERSION);
  1402. }
  1403. #endif
  1404. device_status.refresh_timeout = 0;
  1405. // driver_4g = cJSON_GetObjectItem(item_ext,"version");
  1406. driver_4g = cJSON_GetObjectItem(item_ext, "dver");
  1407. // project = cJSON_GetObjectItem(item_ext,"project");
  1408. project = cJSON_GetObjectItem(item_ext, "proj");
  1409. datetime = cJSON_GetObjectItem(item_ext, "datetime");
  1410. lat = cJSON_GetObjectItem(item_ext, "lat");
  1411. lng = cJSON_GetObjectItem(item_ext, "lng");
  1412. csq = cJSON_GetObjectItem(item_ext, "csq");
  1413. net = cJSON_GetObjectItem(item_ext, "net");
  1414. sim = cJSON_GetObjectItem(item_ext, "sim");
  1415. iccid = cJSON_GetObjectItem(item_ext, "iccid");
  1416. imei = cJSON_GetObjectItem(item_ext, "imei");
  1417. gps = cJSON_GetObjectItem(item_ext, "gps");
  1418. volume = cJSON_GetObjectItem(item_ext, "volume");
  1419. mqttcfg1 = cJSON_GetObjectItem(item_ext, "mqttcfg1");
  1420. mqttcfg2 = cJSON_GetObjectItem(item_ext, "mqttcfg2");
  1421. link_sta = cJSON_GetObjectItem(item_ext, "link_sta");
  1422. cJSON *gps_inuse = cJSON_GetObjectItem(item_ext, "gps_inuse");
  1423. cJSON *gps_view = cJSON_GetObjectItem(item_ext, "gps_view");
  1424. // 如果DTU的IMEI和FLash中的不一样,保存到FLASH
  1425. value_commn = cJSON_GetObjectItem(item_ext, "photo_sta");
  1426. if (value_commn != RT_NULL)
  1427. {
  1428. device_status.camsta = value_commn->valueint;
  1429. if (device_status.camsta == 0)
  1430. {
  1431. rt_kprintf("相机已连接 \n");
  1432. HMI_WRITE("menu.va_cam.val=1");
  1433. }
  1434. else
  1435. {
  1436. rt_kprintf("相机未连接 \n");
  1437. HMI_WRITE("menu.va_cam.val=0");
  1438. }
  1439. }
  1440. value_commn = cJSON_GetObjectItem(item_ext, "cpu_tmp");
  1441. if (value_commn != RT_NULL)
  1442. {
  1443. HMI_WRITE("menu.cpu_temp.txt=\"%d.%d℃\"", atoi(value_commn->valuestring) / 1000, atoi(value_commn->valuestring) % 1000);
  1444. }
  1445. if (strstr(device_status.imei, imei->valuestring) == RT_NULL)
  1446. {
  1447. rt_kprintf("Change IMEI:new:%s-old:%s", imei->valuestring, device_status.imei);
  1448. rt_sprintf(device_status.imei, "%s", imei->valuestring);
  1449. ef_set_env_blob("imei", &device_status.imei, sizeof(device_status.imei)); // IMEI
  1450. }
  1451. else
  1452. {
  1453. rt_sprintf(device_status.imei, "%s", imei->valuestring);
  1454. rt_kprintf("IMEI not change:%s-%s", imei->valuestring, device_status.imei);
  1455. }
  1456. // 如果DTU的ICCID和FLash中的不一样,保存到FLASH
  1457. if (strstr(device_status.iccid, iccid->valuestring) == RT_NULL)
  1458. {
  1459. rt_kprintf("Change ICCID:new:%s-old:%s", iccid->valuestring, device_status.iccid);
  1460. rt_sprintf(device_status.iccid, "%s", iccid->valuestring);
  1461. ef_set_env_blob("iccid", &device_status.iccid, sizeof(device_status.iccid)); // Iccid
  1462. }
  1463. else
  1464. {
  1465. rt_sprintf(device_status.iccid, "%s", iccid->valuestring);
  1466. rt_kprintf("ICCID not change:%s-%s", iccid->valuestring, device_status.iccid);
  1467. }
  1468. LOG_I("DTU时间:%s", datetime->valuestring);
  1469. static char year_s[5], month_s[3], day_s[3], hour_s[3], min_s[3], sec_s[3];
  1470. static char Fail_time_cnt = 0; //计数
  1471. strncpy(year_s, datetime->valuestring, 4);
  1472. strncpy(month_s, datetime->valuestring + 4, 2);
  1473. strncpy(day_s, datetime->valuestring + 6, 2);
  1474. strncpy(hour_s, datetime->valuestring + 8, 2);
  1475. strncpy(min_s, datetime->valuestring + 10, 2);
  1476. strncpy(sec_s, datetime->valuestring + 12, 2);
  1477. struct tm *ntptime = CHECK_DATE(datetime->valuestring);
  1478. if (atoi(year_s) >= 2025 && GetDate.Year < 25) // 250701 修正此处作为保底时间
  1479. {
  1480. Fail_time_cnt++;
  1481. if(Fail_time_cnt > 10)
  1482. {
  1483. EXE_NTP_SETTIME(ntptime);
  1484. Fail_time_cnt = 0;
  1485. Recode_e_code(e_rtc_fail,GetDate.Year , "req_ntp× 使用rtu时间");
  1486. }
  1487. }
  1488. // else
  1489. // {
  1490. // rt_kprintf("GetDate.Year right > %d\n" ,GetDate.Year);
  1491. // }
  1492. LOG_I("参数同步:lat:%s lng:%s", lat->valuestring, lng->valuestring);
  1493. // CSQ
  1494. if (csq != NULL && atoi(csq->valuestring) >= 0 && atoi(csq->valuestring) <= 31)
  1495. {
  1496. rt_sprintf(device_status.csq, "%s", csq->valuestring);
  1497. }
  1498. else
  1499. {
  1500. rt_sprintf(device_status.csq, "0");
  1501. }
  1502. // 更新网线接入状态
  1503. if (link_sta != NULL && atoi(link_sta->valuestring) >= 0 && atoi(link_sta->valuestring) <= 1)
  1504. {
  1505. device_status.link_sta = atoi(link_sta->valuestring);
  1506. LOG_I(">>>>>>>>>>>>>有线接入状态>>>>>>>>>>>>>>:%d", device_status.link_sta);
  1507. }
  1508. // Volume
  1509. if (volume != NULL && atoi(volume->valuestring) >= 0 && atoi(volume->valuestring) <= 31)
  1510. {
  1511. device_status.vol = atoi(volume->valuestring);
  1512. LOG_I("设置音量:%d", device_status.vol);
  1513. }
  1514. else
  1515. {
  1516. device_status.vol = 7;
  1517. }
  1518. // NET
  1519. if (net != NULL && atoi(net->valuestring) >= 0 && atoi(net->valuestring) <= 1)
  1520. {
  1521. LOG_I("网络状态:%s", net->valuestring);
  1522. rt_sprintf(device_status.net, "%s", net->valuestring);
  1523. ReFlash_RTC();
  1524. if (GetDate.Year > 200)
  1525. {
  1526. Request_ntp();
  1527. }
  1528. // rt_kprintf("GetDate.Year %d/n",GetDate.Year);
  1529. }
  1530. else
  1531. {
  1532. rt_sprintf(device_status.net, "1");
  1533. }
  1534. // SIM
  1535. if (sim != NULL && atoi(sim->valuestring) >= 0 && atoi(sim->valuestring) <= 1)
  1536. {
  1537. rt_sprintf(device_status.sim, "%s", sim->valuestring);
  1538. }
  1539. else
  1540. {
  1541. rt_sprintf(device_status.sim, "1");
  1542. }
  1543. // GPS
  1544. if (gps != NULL && atoi(gps->valuestring) >= 0 && atoi(gps->valuestring) <= 3)
  1545. {
  1546. rt_sprintf(device_status.gps, "%s", gps->valuestring);
  1547. if (atoi(gps->valuestring) != 0)
  1548. {
  1549. #if BOOT_ERR == 1
  1550. if (atoi(gps->valuestring) == 1)
  1551. rt_sprintf(device_status.gps_state, "%s", "GPS+BD");
  1552. if (gps_inuse != NULL)
  1553. {
  1554. device_status.gps_inuse = atoi(gps_inuse->valuestring);
  1555. }
  1556. if (gps_view != NULL)
  1557. {
  1558. device_status.gps_view = atoi(gps_view->valuestring);
  1559. }
  1560. #endif
  1561. if (strstr(device_status.lat, lat->valuestring) == NULL)
  1562. {
  1563. memset(device_status.lat, 0, sizeof(device_status.lat));
  1564. memset(device_status.lng, 0, sizeof(device_status.lng));
  1565. rt_sprintf(device_status.lat, "%s", lat->valuestring);
  1566. rt_sprintf(device_status.lng, "%s", lng->valuestring);
  1567. ef_set_env_blob("lat", &device_status.lat, sizeof(device_status.lat)); // Iccid
  1568. ef_set_env_blob("lng", &device_status.lng, sizeof(device_status.lng)); // Iccid
  1569. }
  1570. else
  1571. {
  1572. LOG_I("经纬度信息同步:lat-%s,lng-%s", lat->valuestring, lng->valuestring);
  1573. }
  1574. }
  1575. else if (atoi(gps->valuestring) == 0)
  1576. {
  1577. memset(device_status.lat, 0, sizeof(device_status.lat));
  1578. memset(device_status.lng, 0, sizeof(device_status.lng));
  1579. rt_sprintf(device_status.lat, "%s", lat->valuestring);
  1580. rt_sprintf(device_status.lng, "%s", lng->valuestring);
  1581. }
  1582. }
  1583. else
  1584. {
  1585. rt_sprintf(device_status.gps, "0");
  1586. memset(device_status.lat, 0, sizeof(device_status.lat));
  1587. memset(device_status.lng, 0, sizeof(device_status.lng));
  1588. if (sizeof(device_status.lat) < 3)
  1589. {
  1590. sprintf(device_status.lat, "%s", "0");
  1591. sprintf(device_status.lng, "%s", "0");
  1592. }
  1593. else
  1594. {
  1595. sprintf(device_status.lat, "%s", lat->valuestring);
  1596. sprintf(device_status.lng, "%s", lng->valuestring);
  1597. }
  1598. }
  1599. if (driver_4g != RT_NULL)
  1600. sprintf(device_status.driver_4g, "%s", driver_4g->valuestring);
  1601. if (project != RT_NULL)
  1602. sprintf(device_status.project, "%s", project->valuestring);
  1603. if (mqttcfg1 != NULL)
  1604. {
  1605. if (strstr("8.136.98.49", mqttcfg1->valuestring) != RT_NULL)
  1606. {
  1607. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1608. }
  1609. else if (strstr("120.27.222.26", mqttcfg1->valuestring) != RT_NULL)
  1610. {
  1611. rt_sprintf(device_status.mqttcfg1, "120.27.222.26");
  1612. }
  1613. else
  1614. {
  1615. rt_sprintf(device_status.mqttcfg1, "8.136.98.49");
  1616. }
  1617. LOG_I("当前平台1:%s", mqttcfg1->valuestring);
  1618. }
  1619. if (mqttcfg2 != NULL)
  1620. {
  1621. sprintf(device_status.mqttcfg2, "%s", mqttcfg2->valuestring);
  1622. LOG_I("当前平台2:%s", mqttcfg2->valuestring);
  1623. }
  1624. if (device_status.num_updata == 0)
  1625. {
  1626. Beep_Tip(100);
  1627. }
  1628. // else if (device_status.num_updata != 0 && device_status.hmi_fresh == 2)
  1629. // {
  1630. // if (strstr(device_status.project, "A7_DTU_V3") != RT_NULL)
  1631. // {
  1632. // UpLoad_Data(0);
  1633. // rt_kprintf("UpLoad_Data Mark D \n\n");
  1634. // }
  1635. // else
  1636. // {
  1637. // rt_thread_delay(2000);
  1638. // UpLoad_Data(0);
  1639. // rt_kprintf("UpLoad_Data Mark E \n\n");
  1640. // }
  1641. // }
  1642. device_status.hmi_fresh = 0;
  1643. }
  1644. /**
  1645. * @brief 平台端下放控制指令
  1646. *
  1647. */
  1648. if (item_ext != RT_NULL && strstr(item_cmd->valuestring, "paramconf") != RT_NULL)
  1649. {
  1650. /**
  1651. * @brief 内容获取
  1652. *
  1653. */
  1654. tt = cJSON_GetObjectItem(item_ext, "TT");
  1655. ts = cJSON_GetObjectItem(item_ext, "TS");
  1656. tpl = cJSON_GetObjectItem(item_ext, "TPL");
  1657. tph = cJSON_GetObjectItem(item_ext, "TPH");
  1658. ds = cJSON_GetObjectItem(item_ext, "DS");
  1659. inr_data = cJSON_GetObjectItem(item_ext, "DATT");
  1660. inr_photo = cJSON_GetObjectItem(item_ext, "PHO_T");
  1661. if (inr_data == NULL)
  1662. {
  1663. inr_data = cJSON_GetObjectItem(item_ext, "DATT");
  1664. }
  1665. if (inr_photo == NULL)
  1666. {
  1667. inr_photo = cJSON_GetObjectItem(item_ext, "PHO_T");
  1668. }
  1669. limit_temp = cJSON_GetObjectItem(item_ext, "limit_temp");
  1670. limit_rain = cJSON_GetObjectItem(item_ext, "limit_rain");
  1671. collstart = cJSON_GetObjectItem(item_ext, "START_TIME");
  1672. collend = cJSON_GetObjectItem(item_ext, "END_TIME");
  1673. fan_speed = cJSON_GetObjectItem(item_ext, "fan_speed");
  1674. Demo_mode = cJSON_GetObjectItem(item_ext, "Demo_mode");
  1675. ntp_time = cJSON_GetObjectItem(item_ext, "ntp_time");
  1676. CONTROL = cJSON_GetObjectItem(item_ext, "CONTROL");
  1677. /**
  1678. * @brief 参数设置
  1679. *
  1680. */
  1681. int temp = 0;
  1682. /**
  1683. * @brief 光控定时
  1684. *
  1685. */
  1686. if (tt != NULL)
  1687. {
  1688. temp = cjson_getval(tt);
  1689. if (temp >= 1 && temp <= 10)
  1690. {
  1691. limit.LuxTime = temp;
  1692. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1693. rt_kprintf("光控定时tt:%d\n", temp);
  1694. }
  1695. else
  1696. {
  1697. rt_kprintf("光控定时tt设置失败参数错误!!!\n");
  1698. }
  1699. }
  1700. /**
  1701. * @brief 工作模式
  1702. *
  1703. */
  1704. if (ts != NULL)
  1705. {
  1706. temp = cjson_getval(ts);
  1707. if (temp == 0 || temp == 1)
  1708. {
  1709. limit.LuxEN = temp;
  1710. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1711. LOG_I("定时模式ts:%d", temp);
  1712. }
  1713. else
  1714. {
  1715. LOG_E("定时模式ts设置失败参数错误!!!");
  1716. }
  1717. }
  1718. /**
  1719. * @brief 低温保护
  1720. *
  1721. */
  1722. if (tpl != NULL)
  1723. {
  1724. temp = cjson_getval(tpl);
  1725. if (temp >= -50 && temp <= 50)
  1726. {
  1727. limit.temp_dw = temp;
  1728. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1729. rt_kprintf("低温保护tpl:%d\n", temp);
  1730. }
  1731. else
  1732. {
  1733. rt_kprintf("低温保护tpl设置失败参数错误!!! %d \n", temp);
  1734. }
  1735. }
  1736. /**
  1737. * @brief 高温保护
  1738. *
  1739. */
  1740. if (tph != NULL)
  1741. {
  1742. temp = cjson_getval(tph);
  1743. if (temp >= 50 && temp <= 80)
  1744. {
  1745. limit.temp_up = temp;
  1746. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1747. rt_kprintf("高温保护tph:%d\n", temp);
  1748. }
  1749. else
  1750. {
  1751. rt_kprintf("高温保护tph设置失败参数错误!!!\n");
  1752. }
  1753. }
  1754. /**
  1755. * @brief 开关机状态
  1756. *
  1757. */
  1758. if (ds != NULL)
  1759. {
  1760. temp = cjson_getval(ds);
  1761. if (temp >= 0 && temp <= 1)
  1762. {
  1763. device_status.ds = temp;
  1764. ef_set_env_blob("ds", &device_status.ds, sizeof(device_status.ds));
  1765. LOG_I("开关机状态:%d", temp);
  1766. }
  1767. else
  1768. {
  1769. LOG_E("开关机状态设置失败参数错误!!!");
  1770. }
  1771. }
  1772. /**
  1773. * @brief 数据间隔
  1774. *
  1775. */
  1776. if (inr_data != NULL)
  1777. {
  1778. temp = cjson_getval(inr_data);
  1779. if (temp >= 5 && temp <= 120)
  1780. {
  1781. syscfg.dattim = temp;
  1782. INR_DAT = syscfg.dattim * 60 - 10; // 减去30 消除上报所耗时间
  1783. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  1784. LOG_I("数据上传间隔:%d\n", temp);
  1785. }
  1786. else
  1787. {
  1788. LOG_E("数据上传间隔设置错误!!!\n");
  1789. }
  1790. }
  1791. /**
  1792. * @brief 照片间隔
  1793. *
  1794. */
  1795. if (inr_photo != NULL)
  1796. {
  1797. temp = cjson_getval(inr_photo);
  1798. if (temp >= 5 && temp <= 240)
  1799. {
  1800. syscfg.photim = temp;
  1801. (syscfg.photim >= 5) ? (INR_PIC = (syscfg.photim * 60)) : (INR_PIC = (TakeINR * 60));
  1802. ef_set_env_blob("syscfg", &syscfg, sizeof(syscfg));
  1803. LOG_I("照片上传间隔:%d\n", temp);
  1804. }
  1805. else
  1806. {
  1807. LOG_E("照片上传间隔设置错误!!!\n");
  1808. }
  1809. }
  1810. /**
  1811. * @brief 温控开关
  1812. *
  1813. */
  1814. if (limit_temp != NULL)
  1815. {
  1816. temp = cjson_getval(limit_temp);
  1817. if (temp >= 0 && temp <= 1)
  1818. {
  1819. limit.temhumEN = temp;
  1820. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1821. LOG_I("温控开关:%d", temp);
  1822. }
  1823. else
  1824. {
  1825. LOG_E("温控开关设置错误!!!");
  1826. }
  1827. }
  1828. /**
  1829. * @brief 雨控开关
  1830. *
  1831. */
  1832. if (limit_rain != NULL)
  1833. {
  1834. temp = cjson_getval(limit_rain);
  1835. if (temp >= 0 && temp <= 1)
  1836. {
  1837. limit.RainEN = temp;
  1838. ef_set_env_blob("limit", &limit, sizeof(Limit));
  1839. LOG_I("温控开关:%d", temp);
  1840. }
  1841. else
  1842. {
  1843. LOG_E("温控开关设置错误!!!");
  1844. }
  1845. }
  1846. /**
  1847. * @brief 时控开始
  1848. *
  1849. */
  1850. if (collstart != NULL)
  1851. {
  1852. temp = cjson_getval(collstart);
  1853. if (temp >= 0 && temp <= 24)
  1854. {
  1855. device_status.collecting_sh1 = temp;
  1856. ef_set_env_blob("collecting_sh1", &device_status.collecting_sh1, sizeof(device_status.collecting_sh1));
  1857. LOG_I("时控开始:%d", temp);
  1858. }
  1859. else
  1860. {
  1861. LOG_E("时控开始设置错误!!!");
  1862. }
  1863. }
  1864. /**
  1865. * @brief 时控结束
  1866. *
  1867. */
  1868. if (collend != NULL)
  1869. {
  1870. temp = cjson_getval(collend);
  1871. if (temp >= 0 && temp <= 24)
  1872. {
  1873. device_status.collecting_eh1 = temp;
  1874. ef_set_env_blob("collecting_eh1", &device_status.collecting_eh1, sizeof(device_status.collecting_eh1));
  1875. LOG_I("时控结束:%d", temp);
  1876. }
  1877. else
  1878. {
  1879. LOG_E("时控结束设置错误!!!");
  1880. }
  1881. }
  1882. /**
  1883. * @brief 演示模式
  1884. *
  1885. */
  1886. if (Demo_mode != NULL)
  1887. {
  1888. temp = cjson_getval(Demo_mode);
  1889. if (temp >= 0 && temp <= 1)
  1890. {
  1891. Demo_Mode_NEW = temp;
  1892. if (temp)
  1893. LOG_I("演示模式 > 打开");
  1894. else
  1895. LOG_I("演示模式 > 关闭");
  1896. }
  1897. else
  1898. {
  1899. LOG_E("演示模式设置参数错误!!!");
  1900. return 0;
  1901. }
  1902. }
  1903. if (CONTROL != NULL)
  1904. {
  1905. char temp = cjson_getval(CONTROL);
  1906. if (temp >= 2)
  1907. {
  1908. rt_kprintf("错误的CONTROL: %d\n", temp);
  1909. cJSON_Delete(root);
  1910. return;
  1911. }
  1912. else
  1913. {
  1914. syscfg.en_tigmode = temp;
  1915. ef_set_env_blob("syscfg", (const char *)&syscfg, sizeof(syscfg));
  1916. rt_kprintf("Change Workmod %d OK\n", temp);
  1917. LOG_I("CONTROL: %d\n", temp);
  1918. Get_work_mode();
  1919. }
  1920. }
  1921. if (ntp_time != NULL && (strlen(ntp_time->valuestring) == 14))
  1922. {
  1923. rt_kprintf(" ntp_time get time >> %s \n\n", ntp_time->valuestring);
  1924. struct tm ntptime = {0};
  1925. char year_s[5], month_s[3], day_s[3], hour_s[3], min_s[3], sec_s[3];
  1926. strncpy(year_s, ntp_time->valuestring, 4);
  1927. strncpy(month_s, ntp_time->valuestring + 4, 2);
  1928. strncpy(day_s, ntp_time->valuestring + 6, 2);
  1929. strncpy(hour_s, ntp_time->valuestring + 8, 2);
  1930. strncpy(min_s, ntp_time->valuestring + 10, 2);
  1931. strncpy(sec_s, ntp_time->valuestring + 12, 2);
  1932. ntptime.tm_year = atoi(year_s);
  1933. ntptime.tm_mon = atoi(month_s);
  1934. ntptime.tm_mday = atoi(day_s);
  1935. ntptime.tm_hour = atoi(hour_s);
  1936. ntptime.tm_min = atoi(min_s);
  1937. ntptime.tm_sec = atoi(sec_s);
  1938. EXE_NTP_SETTIME(&ntptime);
  1939. cJSON_Delete(root);
  1940. return 0;
  1941. }
  1942. else if (ntp_time != NULL)
  1943. {
  1944. rt_kprintf(" ntp_time illagl >> %s \n\n", ntp_time->valuestring);
  1945. }
  1946. UpLoad_Data(0); // 指令下发后回复
  1947. rt_thread_delay(2000);
  1948. // 2022/06/23,add:
  1949. if (device_status.dtype == 3)
  1950. {
  1951. 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);
  1952. json_s = makeJson_Warn(device_status.json_w_clock, "修改时间");
  1953. ef_set_env_blob("json_w_clock", &device_status.json_w_clock, sizeof(device_status.json_w_clock)); // 将修改屏幕参数操作记录保存到Flash中
  1954. if (atoi(device_status.net) == 0)
  1955. DTU_Write("%s", json_s);
  1956. rt_free(json_s);
  1957. }
  1958. rt_thread_delay(1000);
  1959. MA_save();
  1960. rt_thread_delay(1000);
  1961. }
  1962. }
  1963. cJSON_Delete(root);
  1964. }
  1965. return 0;
  1966. }
  1967. /**
  1968. * @brief 执行上报状态信息json的动作
  1969. *
  1970. * 0-数据上报 1-指令响应 2-计数上报
  1971. */
  1972. void UpLoad_Data(uint8_t type)
  1973. {
  1974. char *updata;
  1975. if (type == 0)
  1976. {
  1977. updata = makeJson_NEW(0); // 上报数据时
  1978. }
  1979. else
  1980. {
  1981. updata = makeJson_NEW(type); // 刷新状态时
  1982. }
  1983. if (strlen(updata) > 5 && updata != NULL)
  1984. {
  1985. rt_kprintf("upload data:%d %s type %d \n", rt_strlen(updata), updata, type);
  1986. DTU_Write("%s", updata);
  1987. rt_free(updata);
  1988. list_mem();
  1989. }
  1990. // 播放数据上传中语音
  1991. }
  1992. void updata(void)
  1993. {
  1994. UpLoad_Data(0);
  1995. }
  1996. MSH_CMD_EXPORT(updata, updata);