Неудачные попытки входа в систему на SoftAP

esp32 wifi 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 Драйвер

, 👍2

Обсуждение

Вы уверены, что возвращаемое значение было 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


1 ответ


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