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
// 详细说明请访问: https://lingshunlab.com/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,可以查看得到如下信息:

esp32-get-mac-address-serial-output

修改MAC地址

MAC地址由制造商分配,当然你也可以修改其地址,但修改后并不会覆盖原来的MAC地址,每次您重置电路板或上传新代码时,它都会恢复到其制造商分配的默认 MAC 地址。因此,如果修改MAC地址则需要在每个项目代码中添加修改MAC地址的代码。

// welcome to lingshunlab.com
// 详细说明请访问: https://lingshunlab.com/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,可以查看得到如下信息:

esp32-get-mac-address-serial-set-output

参考引用:
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/