У вас может быть две задачи и два ядра, но у ESP32 все еще есть только один чип Wi-Fi. Как написан ваш код (по крайней мере, код, которым вы поделились), вы будете пытаться подключиться к сети Wi-Fi в то же время, когда вы пытаетесь запустить случайный режим. Вы можете делать только одну из этих вещей одновременно.
Вам нужно остановить беспорядочный режим, прежде чем пытаться подключиться к точке доступа. Сейчас ваш код постоянно пытается подключиться к точке доступа Wi-Fi. Используйте переменную volatile
для хранения текущего режима - случайного или подключенного. Измените это, когда вам нужно изменить состояние. Попытайтесь подключиться к Wi-Fi, только когда переменная говорит, что вы хотите быть в режиме подключения.
Возможно, вам потребуется выполнить код, чтобы отключить неразборчивый режим при изменении состояний перед подключением к точке доступа Wi-Fi.
Если вы используете wifi_sniffer_init()
из примера, на который вы ссылались, этот код не предназначен для запуска в приложении Arduino Core. Он выполняет некоторую инициализацию сети, что и ядро Arduino. Это может быть небезопасно делать дважды (это может сработать, а может и нет ... но это определенно не предназначено для этого).
Вы устанавливаете дескриптор прерывания chUpdate()
, которым вы не поделились. Могу поспорить, что это причина вашей основной паники. Вы можете сделать очень мало в обработчике прерываний. Вы определенно не можете вызывать большинство функций Arduino Core или большинство функций ESP-IDF. Большая часть кода не защищена от прерываний, поэтому прерывание по таймеру может происходить, когда структуры данных находятся в несогласованном состоянии. Повторный ввод кода может повредить структуры данных и вызвать описанный вами сбой. Лучше всего установить переменную volatile
и активировать задачу, которая будет выполнять ту работу, которая вам нужна, но не в обработчике прерываний.
Наконец, вам следует позвонить WiFi.mode(WIFI_STA);
, прежде чем позвонить WiFi.begin()
.
Для всех, кто не понимает, почему вы не можете подключиться к сети Wi-Fi, когда находитесь в смешанном режиме - то, что ESP8266 и ESP32 называют «смешанным режимом», на самом деле является «режимом мониторинга Wi-Fi», который позволяет вам контролировать радиоканал Wi-Fi и видеть все на него отправлены кадры wifi. Они используют термин «неразборчивый способ» в отличие от остальной части отрасли. Обычно «случайный режим» означает просмотр всех пакетов, отправляемых в сети (Wi-Fi или проводной), к которой вы подключены.