【问题标题】:ESP32 Switch Between Promiscuous and STA ModeESP32 在混杂模式和 STA 模式之间切换
【发布时间】:2019-05-23 15:58:39
【问题描述】:

我正在开发一个基于 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");

}

我还注意到循环中的代码卡在了 while 中,并且每次运行数据包处理程序时都会重新启动(我从来没有看到“已连接到网络”,但我看到了“正在建立与 WiFi 的连接.. " 几次。

谁能解释一下这是怎么回事?有没有不同的方法来实现这个结果? 谢谢。

【问题讨论】:

    标签: arduino wifi esp32 promiscuous-mode


    【解决方案1】:

    你可能有两个任务和两个内核,但 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 或硬连线)上发送的所有数据包。

    【讨论】:

      【解决方案2】:

      我知道这才一年多,但感谢 romkey 提供的信息,我想我通过在连接到 WiFi 上传 MAC 数据之前调用此例程在我的应用程序中解决了这个问题。

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

      接着这个...

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

      【讨论】:

      • 很高兴听到这个消息!经过一些经验后,我可能会补充说,将 esp 例程与类似 Arduino 的例程混合起来并不是一个好习惯。您应该考虑安装 ESP SDK 并直接使用它:)
      猜你喜欢
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多