app.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. #include "led.h"
  2. #include "app.h"
  3. #include "device.h"
  4. #include "ch455g.h"
  5. #include "net_proc.h"
  6. #include "bsp.h"
  7. #include "at_module.h"
  8. #include "net_ctrl.h"
  9. #include "me3616.h"
  10. #include "./gateway_collect/gateway_collect.h"
  11. #include "downlink.h"
  12. #include "uart_conf.h"
  13. #include "../APP/network/nettimer.h"
  14. #include "../APP/network_mgr/net_proc.h"
  15. extern ME3616 air;
  16. /*
  17. *********************************************************************************************************
  18. * LOCAL VARIABLES
  19. *********************************************************************************************************
  20. */
  21. extern float Temp_test(void);
  22. OS_TCB LED_TASK_HandleTCB;
  23. CPU_STK LED_TASK_HandleStk[APP_TASK_START_STK_SIZE];
  24. void LED_TASK_Handle(void * p_arg);
  25. OS_TCB UART_TASK_HandleTCB;
  26. CPU_STK UART_TASK_HandleStk[UART_TASK_START_STK_SIZE];
  27. void UART_TASK_Handle(void * p_arg);
  28. OS_TCB PROG_TASK_HandleTCB;
  29. CPU_STK PROG_TASK_HandleStk[PROG_TASK_START_STK_SIZE];
  30. void PROG_TASK_Handle(void * p_arg);
  31. OS_TCB SVC_TASK_HandleTCB;
  32. CPU_STK SVC_TASK_HandleStk[SVC_TASK_START_STK_SIZE];
  33. void SVC_TASK_Handle(void * p_arg);
  34. OS_TCB LORA_TASK_HandleTCB;
  35. CPU_STK LORA_TASK_HandleStk[LORA_TASK_START_STK_SIZE];
  36. void LORA_TASK_Handle(void * p_arg);
  37. OS_TCB INFO_TASK_HandleTCB;
  38. CPU_STK INFO_TASK_HandleStk[INFO_TASK_START_STK_SIZE];
  39. void INFO_TASK_Handle(void * p_arg);
  40. /*
  41. *********************************************************************************************************
  42. * STARTUP TASK
  43. *
  44. * Description : This is an example of a startup task. As mentioned in the book's text, you MUST
  45. * initialize the ticker only once multitasking has started.
  46. *
  47. * Arguments : p_arg is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
  48. *
  49. * Returns : none
  50. *
  51. * Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
  52. * used. The compiler should not generate any code for this statement.
  53. *********************************************************************************************************
  54. */
  55. extern u8 USART3_RX_BUF[128]; //接收缓冲,最大USART_REC_LEN个字节.
  56. //接收状态
  57. //bit15, 接收完成标志
  58. //bit14, 接收到0x0d
  59. //bit13~0, 接收到的有效字节数目
  60. extern u16 USART3_RX_STA;
  61. extern int rcv_flag;
  62. int len;
  63. void init_powerup_ledstatus(void)
  64. {
  65. uint16_t ledstatus = 0;
  66. volatile uint32_t i = 0;
  67. ledstatus = (~ledstatus&0xFFFF);
  68. set_led_no_init_sn(ledstatus);
  69. for(i=0;i<500000;i++);
  70. //ledstatus = (~ledstatus&0x0FFF);
  71. // set_led_no_init_sn(ledstatus);
  72. }
  73. void AppTaskStart (void *p_arg)
  74. {
  75. OS_ERR err;
  76. uint16_t flash_size, ram_size;
  77. uint8_t chip_id[12];
  78. uint16_t data = 0;
  79. uint8_t usmflag = 0;
  80. g_ptTest.bTestStart = 0;
  81. BSP_Init(); // Initialize BSP functions
  82. CPU_Init(); // Initialize the uC/CPU services
  83. CH455_Init();
  84. // cmd_init(UART_DEBUG);
  85. init_powerup_ledstatus();
  86. cpuidGetId(); //读取芯片ID
  87. getcpuTypeIdcode();
  88. printf("\r\ App Start \r\n");
  89. data = BKP_ReadBackupRegister(BKP_DR2); // 升级标志
  90. if(data != 0){
  91. if(updata_state_cmp(data)){
  92. if((data&0x00ff) == 0x82){ // 升级成功
  93. data = set_updata_state(UPDATE_SUCCESS);
  94. BKP_WriteBackupRegister(BKP_DR3, data);
  95. printf("\r\n send to net update sucess\r\n");
  96. }
  97. else if((data&0x00ff) == 0x83) { // 回退成功
  98. data = set_updata_state(UPDATE_RETURN_SUCESS);
  99. BKP_WriteBackupRegister(BKP_DR3, data);
  100. printf("\r\n send to net return sucess\r\n");
  101. }
  102. printf("\r\n update status1 = %x\r\n",data);
  103. data = BKP_ReadBackupRegister(BKP_DR3);
  104. BKP_WriteBackupRegister(BKP_DR2, 0);
  105. g_runData.bsendUpdateStatus = data&0xFF;
  106. data = BKP_ReadBackupRegister(BKP_DR5);
  107. if(data == UP_PROG_FROM_NET) g_runData.bResetUpdate = 1;
  108. else g_runData.bResetUpdate = 2;
  109. BKP_WriteBackupRegister(BKP_DR5, 0);
  110. }
  111. }
  112. else{
  113. g_runData.bResetUpdate = 0;
  114. printf("\r\n no update program, data = %x\r\n",data);
  115. }
  116. // printf("coll_msg size = %d\r\n",sizeof(collect_conf_t));
  117. check_usim_status(0);
  118. #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默认使能)了统计任务
  119. OSStatTaskCPUUsageInit(&err); //计算没有应用任务(只有空闲任务)运行时 CPU 的(最大)
  120. #endif //容量(决定 OS_Stat_IdleCtrMax 的值,为后面计算 CPU
  121. //使用率使用)。
  122. board_info_get(&flash_size, &ram_size, chip_id);
  123. #if 0//for test
  124. adc_test();
  125. SPI_FLASH_Test();
  126. SPI_E2PROM_Test();
  127. I2C_Test();
  128. can_test();
  129. #endif
  130. OSTaskCreate((OS_TCB *)&LED_TASK_HandleTCB,
  131. (CPU_CHAR *)"LED TASK Handle",
  132. (OS_TASK_PTR )LED_TASK_Handle,
  133. (void *)0,
  134. (OS_PRIO )LED_TASK_PRIO,
  135. (CPU_STK *)&LED_TASK_HandleStk[0],
  136. (CPU_STK_SIZE)APP_TASK_START_STK_SIZE / 10,
  137. (CPU_STK_SIZE)APP_TASK_START_STK_SIZE,
  138. (OS_MSG_QTY )0,
  139. (OS_TICK )0,
  140. (void *)0,
  141. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  142. (OS_ERR *)&err);
  143. OSTaskCreate((OS_TCB *)&UART_TASK_HandleTCB,
  144. (CPU_CHAR *)"UART TASK Handle",
  145. (OS_TASK_PTR )UART_TASK_Handle, //串口数据查询
  146. (void *)0,
  147. (OS_PRIO )UART_TASK_PRIO,
  148. (CPU_STK *)&UART_TASK_HandleStk[0],
  149. (CPU_STK_SIZE)UART_TASK_START_STK_SIZE / 10,
  150. (CPU_STK_SIZE)UART_TASK_START_STK_SIZE,
  151. (OS_MSG_QTY )0,
  152. (OS_TICK )0,
  153. (void *)0,
  154. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  155. (OS_ERR *)&err);
  156. OSTaskCreate((OS_TCB *)&LORA_TASK_HandleTCB,
  157. (CPU_CHAR *)"LORA TASK Handle",
  158. (OS_TASK_PTR )LORA_TASK_Handle, // lora数据处理
  159. (void *)0,
  160. (OS_PRIO )LORA_TASK_PRIO,
  161. (CPU_STK *)&LORA_TASK_HandleStk[0],
  162. (CPU_STK_SIZE)LORA_TASK_START_STK_SIZE / 10,
  163. (CPU_STK_SIZE)LORA_TASK_START_STK_SIZE,
  164. (OS_MSG_QTY )0,
  165. (OS_TICK )0,
  166. (void *)0,
  167. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  168. (OS_ERR *)&err);
  169. OSTaskCreate((OS_TCB *)&PROG_TASK_HandleTCB,
  170. (CPU_CHAR *)"PROG TASK Handle",
  171. (OS_TASK_PTR )PROG_TASK_Handle, // 4G模块收发处理
  172. (void *)0,
  173. (OS_PRIO )PROG_TASK_PRIO,
  174. (CPU_STK *)&PROG_TASK_HandleStk[0],
  175. (CPU_STK_SIZE)PROG_TASK_START_STK_SIZE / 10,
  176. (CPU_STK_SIZE)PROG_TASK_START_STK_SIZE,
  177. (OS_MSG_QTY )0,
  178. (OS_TICK )0,
  179. (void *)0,
  180. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  181. (OS_ERR *)&err);
  182. OSTaskCreate((OS_TCB *)&SVC_TASK_HandleTCB,
  183. (CPU_CHAR *)"SVC TASK Handle",
  184. (OS_TASK_PTR )SVC_TASK_Handle, // 设备初始化
  185. (void *)0,
  186. (OS_PRIO )SVC_TASK_PRIO,
  187. (CPU_STK *)&SVC_TASK_HandleStk[0],
  188. (CPU_STK_SIZE)SVC_TASK_START_STK_SIZE / 10,
  189. (CPU_STK_SIZE)SVC_TASK_START_STK_SIZE,
  190. (OS_MSG_QTY )0,
  191. (OS_TICK )0,
  192. (void *)0,
  193. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  194. (OS_ERR *)&err);
  195. OSTaskCreate((OS_TCB *)&INFO_TASK_HandleTCB,
  196. (CPU_CHAR *)"INFO TASK Handle",
  197. (OS_TASK_PTR )INFO_TASK_Handle, //网关查询采集器的信息 0x86 0x83 0x89这组协议是明文
  198. (void *)0,
  199. (OS_PRIO )INFO_TASK_PRIO,
  200. (CPU_STK *)&INFO_TASK_HandleStk[0],
  201. (CPU_STK_SIZE)INFO_TASK_START_STK_SIZE / 10,
  202. (CPU_STK_SIZE)INFO_TASK_START_STK_SIZE,
  203. (OS_MSG_QTY )0,
  204. (OS_TICK )0,
  205. (void *)0,
  206. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  207. (OS_ERR *)&err);
  208. OSTaskDel(&AppTaskStartTCB, &err);
  209. }
  210. uint8_t rcv_buf_pt[128], rcv_size = 0;
  211. uint8_t lora_buf[13] = "this is gw";
  212. void LED_TASK_Handle(void * p_arg)//信息传输装置
  213. {
  214. uint8_t i = 0;
  215. uint8_t key = 0;
  216. char val = 0;
  217. OS_ERR err;
  218. float vol=0.0,sumVol = 0.0,temperature = 0.0, sumTemperature = 0.0;
  219. uint16_t temp=0,updata_state_save= 0;
  220. static uint16_t times = 0,ledstatus = 0;
  221. static uint8_t flag = 0;
  222. (void)p_arg;
  223. SysTick_init();
  224. g_ledStatus.ledM = LED_M_LOW;
  225. while (1)
  226. {
  227. if(flag>=g_ledStatus.ledM){
  228. LED_RUN = !LED_RUN;
  229. flag = 0;
  230. if(downlink_config.gateway_id==0x00000000 || downlink_config.gateway_id==0xFFFFFFFF) {
  231. ledstatus = (~ledstatus&0x0FFF);
  232. ledstatus = ((g_firmwareExpl.dd<<4)&0xF000) | ledstatus;
  233. set_led_no_init_sn(ledstatus);
  234. }
  235. }
  236. flag++;
  237. key=KEY_Scan(0); //
  238. if(key == KEY0_PRES){
  239. printf("\n this is key \n");
  240. printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间
  241. }
  242. else if(key == KEY1_PRES){ //
  243. if(key_info.state == 0){
  244. key_info.state = 1;
  245. key_info.num = 0;
  246. timeout_setValue(&key_info.tt_key_state,5*1000);//
  247. timeout_start(&key_info.tt_key_state);
  248. }
  249. key_info.num++;
  250. key_info.keyvalue = key;
  251. printf("key num:%d\n",key_info.num);
  252. }
  253. else if(key == KEY2_PRES){
  254. printf("按键k2 \n");
  255. updata_state = UPDATA_DATA_SUCCESS;
  256. updata_state_save = set_updata_state(updata_state);
  257. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  258. //置升级标志
  259. updata_state_info.updata_flag = set_updata_state(UPDATA_FLAG);
  260. BKP_WriteBackupRegister(BKP_DR2, updata_state_info.updata_flag);
  261. }
  262. if(key_info.keyvalue == KEY1_PRES) {
  263. if(timeout_isOut(&key_info.tt_key_state))//按键计时
  264. {
  265. key_info.state = 0;
  266. if(key_info.num == 3) { // 5S内按三次,进行升级任务
  267. printf("key = 3\r\n");
  268. gateway_update_gateway_proc();
  269. }
  270. key_info.num = 0;
  271. }
  272. //lora组号灯计时
  273. if(timeout_isOut(&key_info.tt_key_state))//灯亮超时
  274. {
  275. if(key_info.optcmd == 3){
  276. key_info.optcmd = 0;
  277. }
  278. key_info.keyvalue = 0;
  279. }
  280. }
  281. if(times<5) {
  282. temp = get_adc(ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
  283. vol = (float)temp*3300/4096;
  284. sumVol += vol;//
  285. temp = get_adc(ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
  286. temperature = (1.42 - temp*3.3/4096)*1000/4.35;// + 25;
  287. sumTemperature += temperature;//
  288. if(times>=4){
  289. vol = sumVol/5.0;
  290. sumVol = 0.0;
  291. g_firmwareMsg.gatewayMsg.fVol.fvoltage = vol/1000.0;
  292. temperature = sumTemperature/5.0;
  293. sumTemperature = 0.0;
  294. g_firmwareMsg.gatewayMsg.fTemper.ftemperature = temperature;
  295. // printf("ADC_Channel_0 Voltage measurement is : %f mV\r\n",vol); //
  296. // printf("ADC_Channel_16 Temper measurement is : %f C\r\n",temperature); //
  297. times= 0;
  298. }
  299. else
  300. times++;
  301. }
  302. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  303. /******************************/
  304. /*
  305. //屏蔽// uart_rs232_init(Console_UID, cmd_rcv);
  306. */
  307. rcv_size = uart_blocking_read((char *)rcv_buf_pt, UART_DEBUG, 10);
  308. if(rcv_size)
  309. {
  310. uart_cmd_task(rcv_buf_pt,rcv_size);
  311. }
  312. /******************************/
  313. }
  314. }
  315. extern u8 uart_redirect_cfg[UART_MAX];
  316. static int uart_rcv(u8 uartid, void *arg, u8 *pbuf, u16 buflen,u8 version)
  317. {
  318. int i;
  319. #if 0
  320. if(uart_redirect_cfg[uartid]) {
  321. uart_msg_send(uart_redirect_cfg[uartid] - 1, pbuf, buflen);
  322. } else {
  323. uart_msg_send(uartid, pbuf, buflen);
  324. }
  325. #endif
  326. printf("uart%d receive %d %s:\r\n", uartid+1, buflen, pbuf);
  327. for(i = 0;i < buflen;i++) {
  328. printf("%c", *(pbuf + i));
  329. }
  330. printf("\r\n");
  331. return 0;
  332. }
  333. u8 gps_buff[100];
  334. u8 gps_index = 0;
  335. static int gps_data_rcv(u8 uartid, void *arg, u8 *pbuf, u16 buflen,u8 version)
  336. {
  337. int i;
  338. for(i = 0;i < buflen;i++) {
  339. gps_buff[gps_index] = *(pbuf+i);
  340. if(gps_buff[gps_index] == '$') {
  341. gps_index = 0;
  342. gps_buff[gps_index] = *(pbuf+i);
  343. } else if((gps_buff[gps_index] == 0x0a)&&
  344. (gps_buff[gps_index-1] == 0x0d)) {
  345. if(strstr(gps_buff, "RMC")) {
  346. //printf("%s", gps_buff);
  347. }
  348. memset(gps_buff, 0 , gps_index);
  349. gps_index = 0;
  350. continue;
  351. }
  352. gps_index++;
  353. }
  354. return 0;
  355. }
  356. void UART_TASK_Handle(void * p_arg)//信息传输装置
  357. {
  358. u8 i;
  359. OS_ERR err;
  360. (void)p_arg;
  361. //char hello[32] = "hello world!!\n"
  362. SysTick_init();
  363. for(i = 0;i < UART_MAX;i++) {
  364. if(i == UART_DEBUG) {
  365. uart_rs232_init(i, NULL);
  366. continue;
  367. }
  368. else if(i == UART2_ID) {
  369. uart_rs232_init(i, gps_data_rcv);
  370. continue;
  371. } else {
  372. uart_rs232_init(i, NULL);
  373. continue;
  374. }
  375. }
  376. while (1)
  377. {
  378. for(i = 0;i < UART_MAX;i++) { //5个串口数据接收
  379. uart_rcv_process(i);
  380. //uart_msg_send(i, hello, sizeof(hello));
  381. OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_DLY, &err);
  382. }
  383. }
  384. }
  385. void PROG_TASK_Handle(void * p_arg)//信息传输装置
  386. {
  387. (void)p_arg;
  388. //char hello[32] = "hello world!!\n"
  389. SysTick_init();
  390. net_proc();
  391. }
  392. void SVC_TASK_Handle(void * p_arg)//信息传输装置
  393. {
  394. sys_eeprom_info_t info;
  395. (void)p_arg;
  396. SysTick_init();
  397. system_info_get(&info);
  398. gateway_power_info_get();
  399. info.DevId = g_firmwareMsg.gatewayMsg.hardwareMsg.gateway_sn;
  400. svc_proc(info.DevType, info.DevId);
  401. }
  402. void LORA_TASK_Handle(void * p_arg)//信息传输装置
  403. {
  404. OS_ERR err;
  405. (void)p_arg;
  406. SysTick_init();
  407. lora_init("golden_beans");
  408. while(1) {
  409. if(g_ptTest.bTestStart == PT_OFF ){
  410. lora_task();
  411. ota_process_handle();
  412. }
  413. OSTimeDlyHMSM(0, 0, 0, 1, OS_OPT_TIME_DLY, &err);
  414. }
  415. }
  416. extern void lora_send(char *tx_data, uint32_t tx_len);
  417. float tmper = 0.0;
  418. void INFO_TASK_Handle(void * p_arg)//
  419. {
  420. static uint8_t flag = 0;
  421. uint8_t ret = 0;
  422. OS_ERR err;
  423. (void)p_arg;
  424. SysTick_init();
  425. nettimer_init();
  426. timeout_setValue(&g_usmTimeOut,60*1000);
  427. // tax_init1();
  428. while(1) {
  429. if(g_ptTest.bTestStart == PT_ON ){
  430. OSTimeDlyHMSM(0, 0, 17, 0, OS_OPT_TIME_DLY, &err);
  431. continue;
  432. }
  433. if(sys_net.net_hdl && (downlink_config.config_flag == CONFIG_WRITE) && (g_runData.bInitNetProc==1))
  434. {
  435. gateway_net_send_gatewayMsg();
  436. gateway_reset_send_update_status();// 上报服务器网关自己的升级状态
  437. }
  438. if(((g_runData.cregStatus!=1) || (g_data4G.errorTime>=2) || (air.State.MQTT_State==0)) \
  439. && (sys_net.net_hdl!=NULL) && (g_runData.bUpdate==0)) { // 网络注册失败
  440. ret = check_usim_status(1);
  441. if((ret!=0) && (timeout_isOut(&g_usmTimeOut) ||(g_data4G.errorTime>=2) )){
  442. timeout_stop(&g_usmTimeOut);
  443. sys_net.net_hdl = NULL;
  444. sys_net.net_hdl = uplink_net_init((char*)g_upLinkTopic);
  445. sys_net.uplink_send = uplink_net_send; //上传数据的函数指针 4G
  446. sys_net.downlink_send = lora_send; // 下发数据的函数指针 lora
  447. device_init(0x0101, downlink_config.gateway_id);
  448. flag++;
  449. if(flag==1) timeout_setValue(&g_usmTimeOut,3*60*1000);
  450. else if(flag==2) timeout_setValue(&g_usmTimeOut,5*60*1000);
  451. else {
  452. flag = 3;
  453. timeout_setValue(&g_usmTimeOut,10*60*1000);
  454. }
  455. timeout_start(&g_usmTimeOut);
  456. if(g_data4G.errorTime>=2){
  457. printf("mqtt can not connect\r\n");
  458. }
  459. g_data4G.errorTime = 0;
  460. g_mqttRunDa.connectNum++;
  461. if(g_mqttRunDa.connectNum>=3) {
  462. g_mqttRunDa.bChangeSuc = 2; // 切换连接失败
  463. }
  464. }
  465. }
  466. else if(g_runData.cregStatus==1 && flag!=0){
  467. flag = 0;
  468. timeout_setValue(&g_usmTimeOut,60*1000);
  469. timeout_stop(&g_usmTimeOut);
  470. }
  471. if(g_mqttRunDa.bChangeMqtt == 1){ // 切换mqtt
  472. if(air.State.MQTT_State==1) { // 切换成功// 保存mqtt地址
  473. memset(&(g_firmwareMsg.mqttidport),0,sizeof(MqttIdPort));
  474. memcpy(g_firmwareMsg.mqttidport.ip,g_mqttRunDa.mqttMsg.ip,g_mqttRunDa.mqttIdlen);
  475. memcpy(g_firmwareMsg.mqttidport.port,g_mqttRunDa.mqttMsg.port,g_mqttRunDa.mqttPortlen);
  476. memcpy(g_firmwareMsg.mqttidport.admin,g_mqttRunDa.mqttMsg.admin,g_mqttRunDa.mqttUserlen);
  477. memcpy(g_firmwareMsg.mqttidport.password,g_mqttRunDa.mqttMsg.password,g_mqttRunDa.mqttPwdlen);
  478. g_firmwareMsg.mqttidport.flag = 1;
  479. fram_write_mqtt_msg();
  480. printf("mqtt 切换成功,并保存mqtt的地址\r\n");
  481. g_mqttRunDa.bChangeMqtt = 0;
  482. g_mqttRunDa.connectNum = 0;
  483. }
  484. else if((air.State.MQTT_State==0) && (g_mqttRunDa.bChangeSuc==2)){ // 切换失败
  485. // 恢复mqtt地址,进行重新连接
  486. g_mqttRunDa.bChangeMqtt = 0;
  487. g_mqttRunDa.connectNum = 0;
  488. timeout_stop(&g_usmTimeOut);
  489. printf("mqtt 切换失败,切换到原来的地址上\r\n");
  490. }
  491. }
  492. OSTimeDlyHMSM(0, 0, 17, 0, OS_OPT_TIME_DLY, &err);
  493. }
  494. }