Неудачные попытки входа в систему на SoftAP
Я хотел бы настроить точку доступа с помощью esp32, которая регистрирует любые/неудачные попытки доступа
я просмотрел некоторые исходные файлы и наткнулся на esp_event.h, который, кажется, позволяет регистрировать обработчик событий, интересно, можно ли это использовать для ведения журнала.
#include <WiFi.h>
const char* ssid = "tmp-AP";
const char* password = "123456789";
static void all_event_handler(void* handler_args, esp_event_base_t base, int32_t id, void* event_data){
Serial.println("all_event_handler");
}
void setup() {
delay(3000);
Serial.begin(9600);
Serial.println("test started...");
auto result = esp_event_handler_register(ESP_EVENT_ANY_BASE, ESP_EVENT_ANY_ID, all_event_handler,NULL);
Serial.print("result : ");
Serial.printf("result : %d - 0x%04x\n",result,result);
Serial.println("Setting up AP ...");
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
}
void loop(){
}
код компилируется
esp_event_handler_register возвращает 259 для меня, обработчик никогда не вызывается
я собрал этот код из :
Библиотека циклов событий
arduino-esp32/библиотеки/WiFi/src/
default_event_loop
я думаю, я хотел бы подключиться, по крайней мере, к NOT_AUTHED, 802_1X_AUTH_FAILED от
WiFi Драйвер
@matt richards, 👍2
Обсуждение1 ответ
259 == ESP_ERR_INVALID_STATE в
соответствии с этим. Ваша ошибка, скорее всего, произошла отсюда:
esp_err_t esp_event_handler_instance_unregister(esp_event_base_t event_base,
int32_t event_id,
esp_event_handler_instance_t context)
{
if (s_default_loop == NULL) {
return ESP_ERR_INVALID_STATE;
}
...
Возможно, вы вызываете функцию слишком рано, еще до того, как цикл событий по умолчанию существует. Я предполагаю, что обычно этот цикл событий создается библиотеками Wi-Fi, когда вы запускаете вызовы, связанные с Wi-Fi, например, здесь:
static bool _start_network_event_task(){
...
esp_err_t err = esp_event_loop_create_default();
Если вы попытаетесь перенести регистрацию на после вызова SoftAP ()
, вы рискуете пропустить события, в зависимости от того, насколько синхронен этот вызов. Таким образом, вы можете попробовать создать цикл событий самостоятельно явно:
// Создать цикл событий по умолчанию
ESP_ERROR_CHECK(esp_event_loop_create_default());
...прежде чем вы зарегистрируете обработчика. Это должно быть безвредно-все остальное, что пытается создать этот же цикл позже, должно чисто обрабатывать возвращенную ошибку, указывающую на то, что цикл уже существует.
Обновление
Поэтому я попробовал ваш скетч и столкнулся с той же проблемой. Потратив больше времени, чем следовало бы, проблема сводится к совместимости.
Мой ESP32-Arduino core 1.0.6 (и, вероятно, ваш тоже) основан на выпуске ESP-IDF/SDK 3.3.5-выпуске, который содержит довольно старый код, несмотря на то, что он является последним, который может предложить менеджер плат Arduino. Итак, esp_event_loop_init()
выглядел так:
esp_err_t esp_event_loop_init(system_event_cb_t cb, void *ctx)
{
if (s_event_init_flag) {
return ESP_FAIL;
}
s_event_handler_cb = cb;
s_event_ctx = ctx;
s_event_queue = xQueueCreate(CONFIG_SYSTEM_EVENT_QUEUE_SIZE, sizeof(system_event_t));
xTaskCreatePinnedToCore(esp_event_loop_task, "eventTask",
ESP_TASKD_EVENT_STACK, NULL, ESP_TASKD_EVENT_PRIO, NULL, 0);
s_event_init_flag = true;
return ESP_OK;
}
и WiFiGeneric.cpp выглядело этотак:
static bool _start_network_event_task(){
...
return esp_event_loop_init(&_network_event_cb, NULL) == ESP_OK;
Как вы можете видеть, нет никакого упоминания о создании цикла по умолчанию, поэтому вы получаете *INVALID_STATE для любых регистраций.
Даже если вы сами создадите цикл по умолчанию, вы не получите никаких событий в своем обработчике, потому что системные события, начиная с этой версии IDF,не проходят через официальный конвейер
цикла esp_event-esp_event_loop_init()
просто создает задачу, и эта задача получает события от какого-то внешнего вызывающего абонента по мере их возникновения. перенаправление их только на одну прикладную задачу.
Если вы все еще хотите получать события таким образом, вам нужно будет загрузить/установить самое последнее ядро ESP32 Arduino с Github, а не через Диспетчер плат. Это ядро должно иметь более свежую версию SDK, а также совместимый Arduino HAL.
Кроме того, вы можете просто использовать более общедоступный API WiFi.onEvent()
. Он должен охватывать все интересующие вас события, а также включать любые соответствующие коды причин.
ПРАВКА 2
Да, оказывается,
что коды причин SYSTEM_EVENT_AP_STADISCONNECTED, которые вы ищете, просто не отображаются API Espressif на любом уровне стека. И нет никакого другого события, которое дало бы вам эту информацию AFAICT. Вы можете попробовать поднять вопрос на странице ESP-IDF Github, чтобы узнать, могут ли они вам там помочь, но шансы невелики.
я переместил esp_event_handler_register после вызова SoftAP, тот же результат 259 (0x103), @matt richards
я сохранил **esp_event_handler_register** там, где он есть, и добавил **esp_event_loop_create_default** перед этим оба вызова функции возвращают **0 (0x0) - ESP_OK**, но обработчик никогда не вызывается, @matt richards
@mattrichards Вы действительно пытались сделать что-то, что вызвало бы вызов обработчика-например, подключение устройства к точке доступа?, @SoreDakeNoKoto
да, конечно, я пробовал с правильным паролем и неправильным, @matt richards
@mattrichards обновил ответ., @SoreDakeNoKoto
я сделал те же выводы, поэтому решил заказать несколько новых плат [amazon esp32 devkitc](https://www.amazon.co.uk/AITRIP-ESP32-DevKitC-Development-ESP32-WROOM-32D-Arduino/dp/B08DXSMZSB/ref=sr_1_2?crid=5PSP3PX9AMFM&keywords=AITRIP+3+Pack+for+ESP32-DevKitC+core+Board&qid=1645013827&sprefix=aitrip+3+pack+for+esp32-devkitc+core+board%2Caps%2C823&sr=8-2), я опубликую свои результаты здесь в какой-то момент, @matt richards
wifi.onevent был неудачным, я сделал два скетча, пытаясь подробно описать ограничения этого подхода, [wif ap test](https://wokwi.com/arduino/projects/323753838092747348), похоже, код причины не указан для [SYSTEM_EVENT_AP_STADISCONNECTED](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv431wifi_event_ap_stadisconnected_t), [wifi sta test](https://wokwi.com/arduino/projects/323753967587689044), @matt richards
@mattrichards Да, отредактировал ответ, не думаю, что есть какой-то способ получить эти коды причин., @SoreDakeNoKoto
- ESP32 открывает "captive portal" при подключении
- Автоматическая веб-страница ESP32 AP
- SSID softAP ESP32 не является постоянным
- ESP32 не предоставляет IP-адрес шлюза в точке доступа
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- Аналоговое чтение не работает при использовании WiFi
Вы уверены, что возвращаемое значение было 429 (в десятичной системе счисления)? Не думайте, что это связано с чем-то, будь то esp_err_t или errno., @SoreDakeNoKoto
ну, теперь я получаю 259, напечатанный на серийный номер, используя коды из [коды ошибок](https://github.com/espressif/esp-idf/blob/20847eeb96/components/esp_common/include/esp_err.h), @matt richards
Выведите значение в шестнадцатеричном формате, @jsotola