Проблемы с запуском WPS на ESP32
Я пытаюсь реализовать WPS на ESP32. WT32-SC01 Plus если быть точным. Кажется, пока работает, я получаю соединение WPS, но затем требуется около 5 минут [!!!], чтобы получить IP-адрес от маршрутизатора. Также при успешном WPS-подключении после перезагрузки не происходит повторного подключения, а ожидается новая инициализация WPS.
Можете ли вы взглянуть и сказать мне, что я делаю неправильно.
Вот мой код:
#include "WiFi.h"
#include "esp_wps.h"
#define ESP_MANUFACTURER "ESPRESSIF"
#define ESP_MODEL_NUMBER "ESP32"
#define ESP_MODEL_NAME "ESPRESSIF IOT"
#define ESP_DEVICE_NAME "ESP STATION"
struct WiFiHandler
{
bool connected = false;
bool connecting = true;
bool wpsDone = false;
WiFiHandler()
{
WiFi.mode( WIFI_STA );
// WiFi.setAutoReconnect(false);
WiFi.onEvent( [ = ] ( WiFiEvent_t event, arduino_event_info_t info ) -> void
{
switch( event ) {
case ARDUINO_EVENT_WIFI_STA_START:
Output::Message( "Station Mode Started" );
break;
case ARDUINO_EVENT_WPS_ER_PIN:
Output::Message( "PIN: %d", info.wps_er_pin.pin_code );
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Output::StartUpMsg( "Connected" );
connected = true;
connecting = false;
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Output::Message( "Reconnecting" );
WiFi.reconnect();
break;
case ARDUINO_EVENT_WPS_ER_SUCCESS:
Output::StartUpMsg( "WPS Successfull." );
WiFi.disconnect();
wpsStop();
WiFi.begin();
wpsDone = true;
break;
case ARDUINO_EVENT_WPS_ER_FAILED:
Output::StartUpMsg( "WPS Failed!" );
connecting = false;
break;
case ARDUINO_EVENT_WPS_ER_TIMEOUT:
Output::StartUpMsg( "WPS Timedout!" );
connecting = false;
break;
}
} );
}
bool initialise()
{
int cnt = 0;
TaskHandle_t taskHandle = NULL;
xTaskCreate( this->blink, "WiFiConnect", 1000, this, 1, &taskHandle );
Output::StartUpMsg( "Establishing network connection ..." );
if( String( WiFi.SSID().c_str() ).length() ) {
WiFi.begin( WiFi.SSID().c_str(), WiFi.psk().c_str() );
while( ( WiFi.reconnect() != ESP_OK && !this->connected ) && ( ++cnt < 20 ) ) {
lv_bar_set_value( ui_BootProgress, lv_bar_get_value( ui_BootProgress ) + 1, LV_ANIM_ON );
delay( 100 );
}
}
if( !this->connected ) {
WiFi.begin();
Output::StartUpMsg( "Please initialise WPS connection on the router." );
cnt = 0;
if( wpsInit() ) {
if( esp_wifi_wps_start( 1000 ) != ESP_OK ) {
Output::StartUpMsg( "Can't start WPS" );
}
while( WiFi.status() != WL_CONNECTED )
{
delay( 1000 );
if( WiFi.status() == WL_IDLE_STATUS && wpsDone ) {
WiFi.reconnect();
}
// if( WiFi.status() == WL_CONNECTION_LOST && wpsDone ) {
// WiFi.отключить();
// WiFi.begin( WiFi.SSID().c_str(), WiFi.psk().c_str() );
// }
Output::Message( WiFi.SSID().c_str() );
Output::Message( WiFi.localIP().toString().c_str() );
Output::Message( String( WiFi.status() ).c_str() );
}
delay( 2000 );
this->connected = true;
}
}
if( this->connected ) {
while ( !WiFi.SSID().length() )
{
lv_bar_set_value( ui_BootProgress, lv_bar_get_value( ui_BootProgress ) + 1, LV_ANIM_ON );
delay( 100 );
}
Output::StartUpMsg( "Connected to: " + WiFi.SSID() );
while ( !String( WiFi.localIP() ).length() || WiFi.localIP().toString() == "0.0.0.0" )
{
lv_bar_set_value( ui_BootProgress, lv_bar_get_value( ui_BootProgress ) + 1, LV_ANIM_ON );
delay( 100 );
}
Output::StartUpMsg( "IP: " + String( WiFi.localIP().toString() ) );
delay( 500 );
this->connecting = false;
this->connected = true;
}
return this->connected;
}
String getIP()
{
return String( WiFi.localIP().toString() );
}
String getPass()
{
return String( WiFi.psk().c_str() );
}
String getNetworkName()
{
return String( WiFi.SSID() );
}
String getMAC()
{
return String( WiFi.macAddress() );
}
static void blink( void *pvParameter )
{
WiFiHandler *l_pThis = ( WiFiHandler * ) pvParameter;
for( int i = 0; l_pThis->connecting; i++ ) {
i%2 ? lv_obj_add_flag( ui_WiFiStatus1, LV_OBJ_FLAG_HIDDEN ) : lv_obj_clear_flag( ui_WiFiStatus1, LV_OBJ_FLAG_HIDDEN );
delay( 250 );
}
l_pThis->connected ? lv_obj_clear_flag( ui_WiFiStatus1, LV_OBJ_FLAG_HIDDEN ) : lv_obj_add_flag( ui_WiFiStatus1, LV_OBJ_FLAG_HIDDEN );
vTaskDelete( NULL );
}
static bool wpsInit()
{
int cnt = 0;
esp_wps_config_t config;
config.wps_type = WPS_TYPE_PBC;
strcpy( config.factory_info.manufacturer, ESP_MANUFACTURER );
strcpy( config.factory_info.model_number, ESP_MODEL_NUMBER );
strcpy( config.factory_info.model_name, ESP_MODEL_NAME );
strcpy( config.factory_info.device_name, ESP_DEVICE_NAME );
esp_err_t status = esp_wifi_wps_enable( &config );
if( status != ESP_OK ) {
Output::StartUpMsg( "WPS config failed! " + String( esp_err_to_name( status ) ) );
return false;
}
return true;
}
static void wpsStop()
{
if( esp_wifi_wps_disable() ) {
Output::StartUpMsg( "WPS Disable Failed" );
}
}
};
@Radek Suski, 👍0
1 ответ
Лучший ответ:
▲ -1
Люди, мой маршрутизатор явно вел себя странно. Кажется, теперь все работает нормально!
EDIT: Какого черта кто-то заминусовал мой ответ? люди странные
,
@Radek Suski
Смотрите также:
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- ESP32 открывает "captive portal" при подключении
- Аналоговое чтение не работает при использовании WiFi
- Автоматическая веб-страница ESP32 AP
- Чтение данных из Google Таблиц с помощью Nodemcu
- WiFiClient::connected() не работает
как кто-то, кроме вас, может решить проблему? это не Ответ., @Juraj
Никто, потому что это была проблема с маршрутизатором. Но когда я опубликовал это, я предположил, что это что-то с моим кодом., @Radek Suski