ESP32 Переключение между Случайным и Режимом STA
Я работаю над проектом на платформе ESP32. Цель состоит в том, чтобы подсчитать количество MAC-адресов в этой области и передать эту информацию через WiFi (используя запрос HTTP POST).
Первая задача достигается путем перехвата пакетов WIFI и сбора содержащихся адресов, следуя этому примеру: https://blog.podkalicki.com/esp32-wifi-sniffer/ Я считаю, что код, который "перехватывает" пакеты, устанавливает ESP на работать в случайном режиме, и поэтому я не могу подключиться к любой точке доступа больше.
Я пробовал несколько решений, сначала начиная с прерываний по таймеру. Однако такой подход всегда приводил к базовой панике и перезагрузке чипа. Я также узнал, что могу использовать RTOS для параллельного запуска различных задач на двух ядрах ЦП, но это не помогло решить проблему.
void wifi_sniffer_packet_handler(void* buff, wifi_promiscuous_pkt_type_t type)
{
if (type != WIFI_PKT_MGMT)//aggiungere filtro su RSSI a questa altezza.
return;
const wifi_promiscuous_pkt_t *ppkt = (wifi_promiscuous_pkt_t *)buff;
const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)ppkt->payload;
const wifi_ieee80211_mac_hdr_t *hdr = &ipkt->hdr;
//some analysis and then print the MAC address
}
void setup() {
Serial.begin(115200);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &chUpdate, true);
timerAlarmWrite(timer, 1000000, true);//timer, arr_val, reload=true
delay(4000);
wifi_sniffer_init();
timerAlarmEnable(timer);
}
// the loop function runs over and over again forever
void loop() {
//Serial.print("inside loop");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Establishing connection to WiFi..");
}
Serial.println("Connected to network");
}
Я также заметил, что код в цикле застревает в то время, и перезапускается каждый раз, когда запускается обработчик пакетов (я никогда не вижу, "Подключен к сети", но я вижу "Установление подключения к WiFi.." несколько раз,
Кто-нибудь может объяснить мне, что происходит? Есть ли другой подход для достижения этого результата? Спасибо.
1 ответ
У вас может быть две задачи и два ядра, но у 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 и видеть все отправленные кадры Wi-Fi. в теме. Они используют термин "неразборчивый способ" в отличие от остальной части отрасли. Обычно "случайный режим" означает просмотр всех пакетов, отправляемых в сети (Wi-Fi или проводной), к которой вы подключены.
Я знаю, что прошло чуть больше года, но БЛАГОДАРНОСТЬ информации, предоставленной romkey, я думаю, что решил эту проблему в своем приложении, вызвав эту процедуру перед подключением к Wi-Fi для загрузки данных MAC.
void end_Scan_WiFi() {
esp_wifi_set_promiscuous(false);
esp_wifi_stop();
}
Далее следует это...
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pass);