ESP32在混杂模式和STA模式之间切换

时间:2019-05-23 15:58:40

标签: arduino wifi esp32 promiscuous-mode

我正在基于ESP32平台开发一个项目。目的是计算该区域中的MAC地址数量,并通过WiFi(使用http POST请求)传输此信息。

第一个任务是通过侦听WIFI数据包并收集包含的地址来完成的,如下例:https://blog.podkalicki.com/esp32-wifi-sniffer/ 我相信“嗅探”数据包的代码会将ESP设置为以混杂模式运行,因此我无法再连接到任何AP。

我尝试了几种解决方案,首先从定时器中断开始。但是,这种方法总是导致内核崩溃和芯片复位。 我还了解到可以使用RTOS在CPU的两个内核上并行运行不同的任务,但这无助于解决问题。

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的连接。 “几次。

任何人都可以解释我的情况吗?是否有其他方法可以达到此结果? 谢谢。

2 个答案:

答案 0 :(得分:0)

您可能有两个任务和两个核心,但是ESP32仍然只有一个wifi芯片。编写代码的方式(至少是您共享的代码),将在尝试运行混杂模式的同时尝试连接到wifi网络。您一次只能执行其中一项操作。

在尝试连接到接入点之前,您需要停止混杂模式。现在,您的代码不断尝试连接到wifi接入点。使用volatile变量存储当前模式-混杂或已连接。需要更改状态时进行更改。仅在变量显示您要进入连接模式时尝试连接wifi。

在连接到wifi接入点之前,更改状态时可能需要运行一些代码以关闭混杂模式。

如果您从所链接的示例中使用wifi_sniffer_init(),则该代码不是要在Arduino Core应用程序中运行。它会执行一些Arduino Core也将执行的网络初始化。重复执行两次操作可能并不安全(它可能会起作用,可能不会...但是绝对不打算这样做)。

您正在设置一个您不共享的中断句柄chUpdate()。我敢打赌,这是造成您的核心恐慌的原因。您可以在中断处理程序中做很少的事情。您绝对不能调用大多数Arduino Core函数或大多数ESP-IDF函数。大多数代码都没有针对中断的保护,因此在数据结构处于不一致状态时,可能会发生计时器中断。重新输入代码可能会破坏数据结构并导致您描述的崩溃。最好设置一个volatile变量,然后唤醒一个任务,该任务将执行您需要在不使用中断处理程序时完成的工作。

最后,您应该先致电WiFi.mode(WIFI_STA);,然后再致电WiFi.begin()

对于任何人为什么在混杂模式下无法连接wifi网络感到困惑-ESP8266和ESP32所谓的“混杂模式”实际上就是“ wifi监控模式”,它使您可以监控wifi无线电频道并查看全部wifi帧发送。他们使用术语“混杂模式”与行业中其他部门不同。通常,“混杂模式”是指看到您所连接的网络(wifi或硬连线)上发送的所有数据包。

答案 1 :(得分:0)

我知道已经过去了一年,但是感谢romkey提供的信息,我想我在连接到WiFi上载MAC数据之前调用此例程来解决了此问题。

void end_Scan_WiFi() {
  esp_wifi_set_promiscuous(false);
  esp_wifi_stop();
}

此之后...

WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pass);