代码思路是:
//station //Esp8266_Station_mode_init(); wifi_set_opmode(STATION_MODE); //Station_mode //定时器任务创建 Esp8266_Timer1_init(1000,1); //1000ms, 1:重复定时
/** timer1 init **/ ICACHE_FLASH_ATTR void Esp8266_Timer1_init(u32 mstime, u8 mode) { os_timer_disarm(&K_Timer01); //先关闭定时器 os_timer_setfn(&K_Timer01,(os_timer_func_t *)K_Timer01_cb,NULL); os_timer_arm(&K_Timer01, mstime, mode); }
/* Timer1回调函数 */ ICACHE_FLASH_ATTR void K_Timer01_cb(void) { u8 K_WIFI_STA_Connect; //表示wifi当前的连接状态 struct ip_info ap_ip_info; u8 ESP8266_IP[4]; u8 K_LED_Flash = 0; K_WIFI_STA_Connect = wifi_station_get_connect_status(); if(K_WIFI_STA_Connect == STATION_GOT_IP) //如果已经连接wifi { wifi_get_ip_info(STATION_IF,&ap_ip_info); ESP8266_IP[0] = ap_ip_info.ip.addr; ESP8266_IP[1] = ap_ip_info.ip.addr>>8; ESP8266_IP[2] = ap_ip_info.ip.addr>>16; ESP8266_IP[3] = ap_ip_info.ip.addr>>24; os_printf("ESP8266_IP:%d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]); //OLED_SHOW for(;K_LED_Flash <=5; K_LED_Flash++) { GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(K_LED_Flash%2)); delay_ms(100); } os_printf(" ESP8266 Connect Wifi success! \n"); os_timer_disarm(&K_Timer01);//关闭定时器, ESP8266_SNTP_Init(); //连接服务器 } else if(K_WIFI_STA_Connect == STATION_NO_AP_FOUND || //如果未能连接wifi,进入智能配网模式 K_WIFI_STA_Connect == STATION_WRONG_PASSWORD || K_WIFI_STA_Connect == STATION_CONNECT_FAIL ) { os_timer_disarm(&K_Timer01);//关闭定时器, 进入配网模式 //wifi_set_opmode(STATION_MODE); smartconfig_set_type(SC_TYPE_AIRKISS); smartconfig_start(ESP8266_Smartconfig_Cb); } else os_printf("uknow error\n"); //ESP8266_NetConnect_Init(); //TCP }
8266上电后进入配网模式.
1.先设置成station模式
2.然后进入1秒重复定时器
3.在定时器的回调函数中定义:
如果flash中保存的wifi 可以连接就自动连接
如果无法连接就进入配网模式.
那么问题来了,在家里测试的时候,很正常,但是在公司测试的时候,
8266的状态都不是 STATION_NO_AP_FOUND, STATION_NO_AP_FOUND, STATION_CONNECT_FAIL
而是IDLE模式. 百度无果.
后来仔细想了想,好像并没有看到扫描wifi结束的提示
于是我有了一个大胆的猜测
1秒定时器,1秒定时器,如果没有进入配网模式,在一秒之后就会重新复位,那么 1秒真的就够了吗?
若然,把1秒定时改成3秒(或更多)就不会出现这种情况了.