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);
Другие вопросы по тегам