扫描网络时是否可以获取 mac 个地址? ESP32
Is it possible to get mac addresses when scanning networks? ESP32
我需要获取网络的 RSSI,它们 MAC 地址指向一个 IPS(室内定位系统)程序。我能够使用示例代码获得 ssid、信号强度和安全性,但不能获得 mac 地址。我尝试使用它,但它不起作用:
void loop() {
int n = WiFi.scanNetworks();
if(n == 0){
Serial.println("no networks found");
}
else{
for (int i = 0; i < n; ++i) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
Serial.println(WiFi.macAddress(i));
delay(10);
}
}
delay(10000);
}
也许 Arduino 框架不会轻易提供这些信息,但底层 ESP IDF 框架肯定会。 AP-s MAC 称为 BSSID。适应 this example scan.c:
#include "esp_wifi.h"
#define DEFAULT_SCAN_LIST_SIZE 10
void wifi_scan(void) {
uint16_t ap_count = 0;
uint16_t number = DEFAULT_SCAN_LIST_SIZE;
wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
esp_wifi_scan_start(NULL, true);
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
printf("Total APs scanned = %u", ap_count);
for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++) {
printf("SSID \t\t%s", ap_info[i].ssid);
printf("RSSI \t\t%d", ap_info[i].rssi);
printf("BSSID \t\t%02X%02X%02X%02X%02X%02X\n",
ap_info[i].bssid[0], ap_info[i].bssid[1], ap_info[i].bssid[2],
ap_info[i].bssid[3], ap_info[i].bssid[4], ap_info[i].bssid[5]);
}
}
查看 struct wifi_ap_record_t
的官方文档,了解其他可用信息。
@Tarmo 的回答是正确的,但 Arduino 内核确实提供了一个更简单的接口来获取 AP 的接入点,而无需直接调用 ESP-IDF 函数。
使用BSSID
方法获取基站wifi电台的MAC地址
您可以调用 BSSID()
方法获取指向六字节 MAC 地址的指针,或调用 BSSIDstr()
获取字符串形式的 MAC 地址。
例如:
Serial.print(WiFi.BSSIDstr(i));
将 MAC 地址打印为字符串。
当您遇到此类问题时,参考 library's source code 可以帮助您找到比文档和教程更多的信息。
我需要获取网络的 RSSI,它们 MAC 地址指向一个 IPS(室内定位系统)程序。我能够使用示例代码获得 ssid、信号强度和安全性,但不能获得 mac 地址。我尝试使用它,但它不起作用:
void loop() {
int n = WiFi.scanNetworks();
if(n == 0){
Serial.println("no networks found");
}
else{
for (int i = 0; i < n; ++i) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
Serial.println(WiFi.macAddress(i));
delay(10);
}
}
delay(10000);
}
也许 Arduino 框架不会轻易提供这些信息,但底层 ESP IDF 框架肯定会。 AP-s MAC 称为 BSSID。适应 this example scan.c:
#include "esp_wifi.h"
#define DEFAULT_SCAN_LIST_SIZE 10
void wifi_scan(void) {
uint16_t ap_count = 0;
uint16_t number = DEFAULT_SCAN_LIST_SIZE;
wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
esp_wifi_scan_start(NULL, true);
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
printf("Total APs scanned = %u", ap_count);
for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++) {
printf("SSID \t\t%s", ap_info[i].ssid);
printf("RSSI \t\t%d", ap_info[i].rssi);
printf("BSSID \t\t%02X%02X%02X%02X%02X%02X\n",
ap_info[i].bssid[0], ap_info[i].bssid[1], ap_info[i].bssid[2],
ap_info[i].bssid[3], ap_info[i].bssid[4], ap_info[i].bssid[5]);
}
}
查看 struct wifi_ap_record_t
的官方文档,了解其他可用信息。
@Tarmo 的回答是正确的,但 Arduino 内核确实提供了一个更简单的接口来获取 AP 的接入点,而无需直接调用 ESP-IDF 函数。
使用BSSID
方法获取基站wifi电台的MAC地址
您可以调用 BSSID()
方法获取指向六字节 MAC 地址的指针,或调用 BSSIDstr()
获取字符串形式的 MAC 地址。
例如:
Serial.print(WiFi.BSSIDstr(i));
将 MAC 地址打印为字符串。
当您遇到此类问题时,参考 library's source code 可以帮助您找到比文档和教程更多的信息。