ESP32 Переключение между Случайным и Режимом STA - PullRequest
0 голосов
/ 23 мая 2019

Я работаю над проектом на платформе 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 Ответ

0 голосов
/ 23 мая 2019

У вас может быть две задачи и два ядра, но у 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 или проводной), к которой вы подключены.

...