void SysResetThread(void *arg) { UINT8 gpio_val; int i; Agent_config_t pConfigData; while (1) { if (system_reset_flag == 0x12345678) { gpio_val = BSP_GPIOGetValue(USER_GPIO_RESET_BUTTON); if (gpio_val == USER_RESET_BUTTON_PRESS) { for (i = 0; i < USER_RESET_PRESS_TIMEOUT; i++) { OSTimeDly(50); /* delay 500ms filter button shake */ gpio_val = BSP_GPIOGetValue(USER_GPIO_RESET_BUTTON); if (gpio_val != USER_RESET_BUTTON_PRESS) { break; } } if (i == USER_RESET_PRESS_TIMEOUT) { memcpy(&pConfigData, &Agent_config_data, sizeof(Agent_config_t)); pConfigData.flag = 0; memset(pConfigData.wifi_ssid, 0x0, sizeof(pConfigData.wifi_ssid)); memset(pConfigData.wifi_key, 0x0, sizeof(pConfigData.wifi_key)); nl6621_SaveConfigData(&pConfigData); /* reset module */ log_warn("RESET button press more than 4 seconds, reseting System.\n"); OSTimeDly(100); nl6621_Reset(); } } } OSTimeDly(100); } }
/* * === FUNCTION ====================================================================== * Name: GAgent_SetDevNetWork * Description: Start to connect to a network when used DirectConfig mode or STA mode, * otherwise, Create a network with AP mode. * Note: This interface will check the gpio 10 level, when it was press, then * set to DirectConfig mode, else read flag from norflash, and judge launch * SoftAP mode or STA mode. * ===================================================================================== */ void GAgent_SetDevNetWork(void) { UINT8 gpio_val; /* if the Directconfig button was pressed(gpio is low level), then set to Directconfig * mode. * */ gpio_val = BSP_GPIOGetValue(USER_GPIO_DIRECTCONFIG); if (gpio_val == 0) { OSTimeDly(20); /* delay 200ms filter button shake */ gpio_val = BSP_GPIOGetValue(USER_GPIO_DIRECTCONFIG); if (gpio_val == 0) { /* Set system to directConfig status */ sys_status.status = SYS_STATUS_WIFI_DIRECTCONFING; /* Launch directconfig mode */ TestDirectConfig(); g_stGAgentConfigData.flag |= XPG_CFG_FLAG_CONNECTED; nl6621_SaveConfigData(&g_stGAgentConfigData); wifiStatus = wifiStatus | WIFI_STATION_STATUS | WIFI_MODE_STATION; /* Set system to STA mode */ sys_status.status = SYS_STATUS_WIFI_STA_CONNECTED; return; } } if (nl6621_GetConfigData(&g_stGAgentConfigData) != 0) { log_info("Get GAgentConfig Data error.\n"); } /* 启动Wifi连接,根据是否获得保存数据, 决定使用AP或者Station模式 * */ if ((g_stGAgentConfigData.flag & XPG_CFG_FLAG_CONNECTED) == XPG_CFG_FLAG_CONNECTED) { //flash 里面有要加入的网络名称 /* Set system to STA status */ sys_status.status = SYS_STATUS_WIFI_DIRECTCONFING; wifiStatus |= WIFI_STATION_STATUS | WIFI_MODE_STATION; log_info("Try to connect wifi...[%08x]\n", g_stGAgentConfigData.flag); log_info("SSID: %s\n", g_stGAgentConfigData.wifi_ssid); log_info("KEY: %s\n", g_stGAgentConfigData.wifi_key); DRV_WiFi_StationCustomModeStart(g_stGAgentConfigData.wifi_ssid, g_stGAgentConfigData.wifi_key); if (wifi_sta_connect_ap_flag != 0) { /* switch to softAP mode */ goto SOFTAP; } /* Set system status to STA mode */ sys_status.status = SYS_STATUS_WIFI_STA_CONNECTED; } else { SOFTAP: wifiStatus = WIFI_MODE_AP; log_info("Connect2LateWiFi, Working at AP mode\r\n"); DRV_WiFi_SoftAPModeStart(); /* Set system status to STA mode */ sys_status.status = SYS_STATUS_WIFI_SOFTAP; } return; }
/************************************************** ************************************************** 建立和云端服务器的连接 MQTT业务处理(订阅/登陆/数据等)由MQTT handle 在此期间建立socket短链接 WIFI CLOUD(HTTP) CLOUD(MQTT) ================================================= REQ_DID -------> handle REQ_DID_ACK <---- DID_INFO REQ_M2MINFO ------> handle REQ_M2MINFO_ACK <-- M2M_INFO MQTT_LOGIN -------- (END) -----------> mqtt handle(login) **************************************************/ void GAgent_Login_Cloud(void) { int ret; char *p_Did = NULL; /* WIFI STATION模式下才能接入cloud */ if( (wifiStatus & WIFI_MODE_STATION) != WIFI_MODE_STATION || (wifiStatus & WIFI_STATION_STATUS) != WIFI_STATION_STATUS) { return ; } switch(g_ConCloud_Status) { case CONCLOUD_REQ_DID: if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if((Mqtt_Register2Server(&g_stMQTTBroker)==0)) { g_ConCloud_Status = CONCLOUD_REQ_DID_ACK; g_Xpg_GlobalVar.send2HttpLastTime = nl6621_GetTime_S(); log_info("MQTT_Register2Server OK!\n"); } else { log_info("Mqtt_Register2Server Fail!\n"); } break; case CONCLOUD_REQ_DID_ACK: /* time out, or socket isn't created , resent CONCLOUD_REQ_DID */ if( nl6621_GetTime_S()-g_Xpg_GlobalVar.send2HttpLastTime>=HTTP_TIMEOUT || g_Xpg_GlobalVar.http_socketid<=0 ) { g_ConCloud_Status = CONCLOUD_REQ_DID_ACK; break; } ret = Http_Recive_Did(g_Xpg_GlobalVar.DID); if (ret == 0) { p_Did = g_Xpg_GlobalVar.DID; DIdLen = GAGENT_DID_LEN; memcpy((unsigned char*)g_stGAgentConfigData.Cloud_DId, (unsigned char*)p_Did, DIdLen); g_stGAgentConfigData.Cloud_DId[DIdLen] = '\0'; nl6621_SaveConfigData(&g_stGAgentConfigData); g_ConCloud_Status = CONCLOUD_REQ_M2MINFO; log_info( "Http Receive DID is:%s[len:%d]\n", p_Did, DIdLen); log_info( "ConCloud Status[%04x]\n", g_ConCloud_Status); } break; case CONCLOUD_REQ_M2MINFO: if( nl6621_GetTime_S()-g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if( Http_Sent_Provision()==0 ) { g_Xpg_GlobalVar.send2HttpLastTime = nl6621_GetTime_S(); g_ConCloud_Status = CONCLOUD_REQ_M2MINFO_ACK; GAgent_Printf( GAGENT_INFO,"Http_Sent_Provision OK! "); } else { GAgent_Printf( GAGENT_INFO,"Http_Sent_Provision Fail!"); } break; case CONCLOUD_REQ_M2MINFO_ACK: /* time out, or socket isn't created ,resent CONCLOUD_REQ_M2MINFO */ if( nl6621_GetTime_S()-g_Xpg_GlobalVar.send2HttpLastTime>=HTTP_TIMEOUT || g_Xpg_GlobalVar.http_socketid<=0 ) { g_ConCloud_Status = CONCLOUD_REQ_M2MINFO; break; } ret = Http_Recive_M2minfo(g_Xpg_GlobalVar.m2m_SERVER, &g_Xpg_GlobalVar.m2m_Port); if( ret==0 ) { g_ConCloud_Status = CONCLOUD_REQ_LOGIN; GAgent_Printf(GAGENT_WARNING, "--HTTP response OK. Goto MQTT LOGIN"); } break; case CONCLOUD_REQ_LOGIN: if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if((Mqtt_Login2Server(&g_stMQTTBroker)==0)) { g_ConCloud_Status = CONCLOUD_RUNNING; g_MQTTStatus = MQTT_STATUS_LOGIN; log_info( "Mqtt_Login2Server OK!\n"); } else { log_info("Mqtt_Login2Server Fail!\n"); } break; case CONCLOUD_RUNNING: /* mqtt handle */ if(g_MQTTStatus == MQTT_STATUS_LOGIN) { if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime >= MQTT_CONNECT_TIMEOUT ) { log_info("MQTT connect timeout.\n"); g_ConCloud_Status = CONCLOUD_REQ_LOGIN; break; } } MQTT_handlePacket(); break; case CONCLOUD_INVALID: default: break; } }