ESP32/ESP8266 MAC地址的获取与设定
目录
首先,凌顺实验室(lingshunlab.com)介绍使用Arduino IDE 编程的方式获取和设定(修改)ESP32/ESP8266的MAC地址。
WiFi.macAddress()
用法一:WiFi.macAddress()
在获取MAC地址中,主要使用WiFi.macAddress()函数
其实macAddress方法调用了 esp_wifi_get_mac 函数,可以查看相关资料。在获取MAC地址之前,我们并不需求连接任何WIFI。
但在查看 esp_wifi_get_mac 时见到该函数有其中一个错误提示 ESP_ERR_WIFI_NOT_INIT: WiFi is not initialized by esp_wifi_init
为WIFI未初始化。
而在实际应用中,添加或者不添加以下WIFI初始化的代码,在ESP32中仍然能获取到MAC地址 。
WiFi.mode(WIFI_MODE_STA); // 如果无法获取MAC地址时,不妨试试添加这行用于WIFI初始化的代码
用法二:WiFi.macAddress(macAddr)
该函数还有另一个用法WiFi.macAddress(macAddr),其中macAddr为可选择项,如果输入参数macAddr,那么ESP32/ESP8266开发板的mac地址将会存储在macAddr的变量中。macAddr必须是一个uint8_t类型的数组,这个数组含有6个元素。
示例代码:
uint8_t macAddr[6];
WiFi.macAddress(macAddr); //MAC地址会储存在这个macAddr数组里面
Serial.printf("用转存到数组的方式获取MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
获取MAC地址代码
// welcome to lingshunlab.com
// 详细说明请访问: http://47.119.142.156/book/esp32/esp32-mac-address-get-and-set
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
void setup(){
Serial.begin(115200); // 设置波特率
Serial.println(); // 串口输出换行
// WiFi.mode(WIFI_MODE_STA); // // 如果无法获取MAC地址时,不妨试试添加这行用于WIFI初始化的代码
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress()); // 串口输出当前ESP32/ESP8266的MAC地址
uint8_t macAddr[6]; // 定义macAddr为uint8_t类型的数组,这个数组含有6个元素。
WiFi.macAddress(macAddr); //MAC地址会储存在这个macAddr数组里面
Serial.printf("用转存到数组的方式获取MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}
void loop(){
}
上传代码,打开串口监视器,波特率设置为115200,可以查看得到如下信息:
修改MAC地址
MAC地址由制造商分配,当然你也可以修改其地址,但修改后并不会覆盖原来的MAC地址,每次您重置电路板或上传新代码时,它都会恢复到其制造商分配的默认 MAC 地址。因此,如果修改MAC地址则需要在每个项目代码中添加修改MAC地址的代码。
// welcome to lingshunlab.com
// 详细说明请访问: http://47.119.142.156/book/esp32/esp32-mac-address-get-and-set
#ifdef ESP32
#include <WiFi.h>
#include <esp_wifi.h>
#else
#include <ESP8266WiFi.h>
#endif
uint8_t newMACAddress[] = {0xAA, 0xBB, 0xCC, 0x11, 0x22, 0x33}; // 设置新的MAC地址,newMACAddress变量为uint8_t类型的数组
void setup(){
Serial.begin(115200); // 设置波特率
WiFi.mode(WIFI_STA); // 设置 WIFI模式 为 WIFI_STA
Serial.print("原厂默认:MAC Address: ");
Serial.println(WiFi.macAddress()); // 串口输出原有的MAC地址
// ESP32 ============
// ESP32 使用以下代码,把ESP8266的代码添加注释
// 在开发板管理中查看 ESP32 的版本 小于 1.0.5 使用以下代码进行设定新MAC地址
//esp_wifi_set_mac(ESP_IF_WIFI_STA, &newMACAddress[0]);
// 在开发板管理中查看 ESP32 的版本 大于 1.0.5 使用以下代码进行设定新MAC地址
esp_wifi_set_mac(WIFI_IF_STA, &newMACAddress[0]);
// ESP8266 END ========
// ESP8266 ============
// ESP8266 使用以下代码,把ESP32的代码添加注释
// 如果ESP8266使用的是AP模式,则使用以下代码设定新MAC地址
//wifi_set_macaddr(SOFTAP_IF, &newMACAddress[0]);
// 如果ESP8266使用的是STATION模式,则使用以下代码设定新MAC地址
//wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
// ESP8266 END ========
Serial.print("最新设定:MAC Address: ");
Serial.println(WiFi.macAddress()); // 串口输出新设定的MAC地址
}
void loop(){
}
上传代码,打开串口监视器,波特率设置为115200,可以查看得到如下信息:
参考引用:
https://randomnerdtutorials.com/get-change-esp32-esp8266-mac-address-arduino/
http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-c-plus-plus-reference/esp8266wifista/macaddress/