我正在基于ESP32平台进行项目。目的是计算该区域中的MAC地址数量,并通过WiFi传输此信息(使用HTTP POST请求(。
第一个任务是通过嗅探wifi数据包并收集包含的地址来实现的,遵循此示例:https://blog.podkalicki.com/esp32-wifi-sniffer/我相信"嗅探"数据包的代码将ESP设置为以滥交模式运行,因此我不能再连接到任何AP。
我尝试了几种解决方案,首先是从计时器中断开始。但是,这种方法总是导致芯片的核心恐慌和重置。我还了解到,我可以使用RTO在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的连接"。"几次。
有人可以向我解释发生了什么事?实现这一结果有不同的方法吗?谢谢。
您可能有两个任务和两个内核,但是ESP32仍然只有一个WiFi芯片。您的代码的编写方式(至少是您共享的代码(,您将尝试在尝试运行滥交模式的同时连接到WiFi网络。您可以一次只做这些事情。
尝试连接到访问点之前,您需要停止混杂模式。现在,您的代码不断尝试连接到WiFi访问点。使用volatile
变量存储当前模式 - 混杂或连接。当您需要更改状态时,请更改它。仅在变量说您要处于连接模式时才尝试连接到WiFi。
在更改状态时,在连接到WiFi访问点之前,您可能需要运行一些代码以关闭混杂模式。
如果您从链接到的示例中使用了wifi_sniffer_init()
,则该代码并不是要在Arduino Core应用程序中运行。它可以执行一些网络初始化,即Arduino Core也将做到。做这两次可能不是安全的(它可能起作用,它可能不行……但是绝对不是打算这样做的(。
您正在设置一个中断的句柄chUpdate()
,您未共享。我敢打赌,这是您核心恐慌的原因。您可以在中断处理程序中做得很少。您绝对不能称呼大多数Arduino Core功能或大多数ESP-IDF功能。大多数代码不受干扰,因此,当数据结构处于不一致的状态时,计时器中断可能会发生。重新输入代码会破坏数据结构并导致您描述的崩溃类型。最好设置一个volatile
变量,并唤醒一项任务,该任务将完成您在不在中断处理程序中所需的工作。
最后,您应该在致电WiFi.begin()
之前致电WiFi.mode(WIFI_STA);
。
对于任何对您为什么无法在滥交模式下连接到WiFi网络的人来说WiFi框架发送了。他们使用"混杂模式"一词与行业其余部分不同。通常,"滥交模式"是指看到您连接到网络上发送的所有数据包(WiFi或Hard Wind(。
我知道它已经刚刚一年多了,但是由于Romkey提供的信息,我认为我在应用程序中通过调用此例程在连接到WiFi上以上传Mac数据来解决此问题。
void end_Scan_WiFi() {
esp_wifi_set_promiscuous(false);
esp_wifi_stop();
}
接着...
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,pass);