要获取特定接口(如 Wi-Fi、蓝牙、以太网)的 MAC 地址,请调用函数 :cpp:func:`esp_read_mac`。
在 ESP-IDF 中,各个网络接口的 MAC 地址是根据单个 *基准 MAC 地址 (Base MAC address)* 计算出来的。默认情况下使用乐鑫指定的基准 MAC 地址,该基准地址在产品生产过程中已预烧录至 {IDF_TARGET_NAME} eFuse。
..only:: not esp32s2
..list-table::
:widths:20 40 40
:header-rows:1
* - 接口
- MAC 地址(默认 4 个全局地址)
- MAC 地址(2 个全局地址)
* - Wi-Fi Station
- base_mac
- base_mac
* - Wi-Fi SoftAP
- base_mac 最后一组字节后加 1
-:ref:`本地 MAC <local-mac-addresses>` (由 Wi-Fi Station MAC 生成)
* - 蓝牙
- base_mac 最后一组字节后加 2
- base_mac 最后一组字节后加 1
* - 以太网
- base_mac 最后一组字节后加 3
-:ref:`本地 MAC <local-mac-addresses>` (由蓝牙 MAC 生成)
..note::
:ref:`配置选项 <CONFIG_{IDF_TARGET_CFG_PREFIX}_UNIVERSAL_MAC_ADDRESSES>` 配置了乐鑫提供的全局 MAC 地址的数量。
..only:: esp32s2
..list-table::
:widths:20 40 40
:header-rows:1
* - 接口
- MAC 地址(默认 2 个全局地址)
- MAC 地址(1 个全局地址)
* - Wi-Fi Station
- base_mac
- base_mac
* - Wi-Fi SoftAP
- base_mac 最后一组字节后加 1
-:ref:`本地 MAC <local-mac-addresses>` (由 Wi-Fi Station MAC 生成)
* - 以太网
-:ref:`本地 MAC <local-mac-addresses>` (由 Wi-Fi SoftAP MAC 生成)
-:ref:`本地 MAC <local-mac-addresses>` (在 base_mac 最后一组字节后加 1 生成,不推荐)
..note::
:ref:`配置选项 <CONFIG_{IDF_TARGET_CFG_PREFIX}_UNIVERSAL_MAC_ADDRESSES>` 配置了乐鑫提供的全局 MAC 地址的数量。
..only:: not SOC_EMAC_SUPPORTED
..note:: {IDF_TARGET_NAME} 内部未集成以太网 MAC 地址,但仍可以计算得出该地址。不过,以太网 MAC 地址只能与外部以太网接口(如 SPI 以太网设备)一起使用,具体请参阅 :doc:`/api-reference/network/esp_eth`。
自定义基准 MAC
^^^^^^^^^^^^^^^
乐鑫已将默认的基准 MAC 地址预烧录至 eFuse {IDF_TARGET_BASE_MAC_BLOCK} 中。如需设置自定义基准 MAC 地址,请在初始化任一网络接口或调用 :cpp:func:`esp_read_mac` 函数前调用 :cpp:func:`esp_base_mac_addr_set` 函数。自定义基准 MAC 地址可以存储在任何支持的存储设备中(例如 flash、NVS)。
分配自定义基准 MAC 地址时,应避免 MAC 地址重叠。请根据上面的表格配置选项 :ref:`CONFIG_{IDF_TARGET_CFG_PREFIX}_UNIVERSAL_MAC_ADDRESSES`,设置可从自定义基准 MAC 地址生成的有效全局 MAC 地址。
..note::
也可以调用函数 :cpp:func:`esp_netif_set_mac`,在网络初始化后设置网络接口使用的特定 MAC。但建议使用此处介绍的自定义基准 MAC 地址的方法,以避免原始 MAC 地址在更改前短暂出现在网络上。
eFuse 中的自定义 MAC 地址
@@@@@@@@@@@@@@@@@@@@@@@@@@@
ESP-IDF 提供了 :cpp:func:`esp_efuse_mac_get_custom` 函数。从 eFuse 读取自定义 MAC 地址时,调用该函数将从 eFuse BLK3 加载 MAC 地址。此函数假定自定义基准 MAC 地址的存储格式如下: