问题描述
我正在尝试将 ESP8266 连接到另一个 ESP8266 托管的 WiFi 网络。问题是 ESP8266 在 WiFi 扫描期间显示 WiFi 网络,但无法连接到它并显示错误:no espnetwork found,reconnect after 1s
。
托管网络的 ESP8266 代码:
#include <osapi.h>
#include <user_interface.h>
void ICACHE_FLASH_ATTR user_init(void) {
// Delays 1 second for my serial monitor to catch up
for (int i = 0; i < 200; i++) os_delay_us(5000);
gpio_init();
uart_init(115200,115200);
wifi_softap_dhcps_stop();
wifi_set_opmode(SOFTAP_MODE);
struct softap_config softAPConfig = {
.ssid = {0},.password = {0},.ssid_len = sizeof("espnetwork"),.authmode = AUTH_OPEN,.max_connection = 4,.beacon_interval = 100,};
os_memcpy(softAPConfig.ssid,"espnetwork",sizeof("espnetwork"));
wifi_softap_set_config(&softAPConfig);
wifi_softap_dhcps_start();
}
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void) {
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
#include <osapi.h>
#include <user_interface.h>
static os_timer_t INIT_TIMER;
void ICACHE_FLASH_ATTR commScanCb(void *arg,STATUS status) {
if (status != OK) return (void)os_printf("Scan Callback Error : %d",status);
struct bss_info *scanInfo = (struct bss_info *)arg;
struct bss_info *network = NULL;
while (scanInfo != NULL) {
if (!os_strcmp(scanInfo->ssid,"espnetwork")) network = scanInfo;
scanInfo = STAILQ_NEXT(scanInfo,next);
}
if (network == NULL) return (void)os_printf("Network Not Found");
else os_printf("Found Network : %s\n",network->ssid);
struct station_config config = { .bssid_set = 0 };
os_memset(config.ssid,32);
os_memcpy(config.ssid,network->ssid,32);
wifi_station_set_config(&config);
wifi_station_connect() ? os_printf("WiFi Connect Started\n") : os_printf("WiFi Connect Failed\n");
}
void ICACHE_FLASH_ATTR afterInit(void *arg) {
os_timer_disarm(&INIT_TIMER);
wifi_station_scan(NULL,commScanCb);
}
void ICACHE_FLASH_ATTR user_init(void) {
// Delays 1 second for my serial monitor to catch up
for (int i = 0; i < 200; i++) os_delay_us(5000);
gpio_init();
uart_init(115200,115200);
wifi_station_set_auto_connect(0);
wifi_set_opmode(STATION_MODE);
os_timer_disarm(&INIT_TIMER);
os_timer_setfn(&INIT_TIMER,(os_timer_func_t *)afterInit,NULL);
os_timer_arm(&INIT_TIMER,1000,1);
}
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void) {
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
从 ESP8266 尝试连接到网络的日志:
mode : sta(5c:cf:7f:f6:54:cb)
add if0
scandone
Found Network : espnetwork
WiFi Connect Started
scandone
no espnetwork found,reconnect after 1s
reconnect
scandone
no espnetwork found,reconnect after 1s
reconnect
此日志显示 ESP8266 找到网络(第 4 行),但连接失败,然后无限期地尝试重新连接。
我尝试更改 WiFi 网络的身份验证模式并给它一个密码,我也尝试将 bssid_set
设置为 1 并传入 WiFi 网络的 bssid 但在这两种情况下都会出现相同的错误.
解决方法
问题出在 SoftAP 代码上。设置 softap_config
时,我使用 sizeof 而不是 strlen 或根本不设置它,导致它托管一个网络,在 SSID 中使用空字符。
固定示例:
#include <osapi.h>
#include <user_interface.h>
void ICACHE_FLASH_ATTR user_init(void) {
// Delays 1 second for my serial monitor to catch up
for (int i = 0; i < 200; i++) os_delay_us(5000);
gpio_init();
uart_init(115200,115200);
wifi_softap_dhcps_stop();
wifi_set_opmode(SOFTAP_MODE);
struct softap_config softAPConfig = {
.ssid = {0},.password = {0},.authmode = AUTH_OPEN,.max_connection = 4,.beacon_interval = 100,};
os_memcpy(softAPConfig.ssid,"espnetwork",sizeof("espnetwork"));
wifi_softap_set_config(&softAPConfig);
wifi_softap_dhcps_start();
}
uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void) {
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
谢谢大家的帮助。