3、MAC地址基础:什么是MAC地址?如何获取ESP32的MAC地址?MAC地址在ESP-NOW中的作用。

各位同学,咱们今天聊一个基础但极其重要的东西——MAC地址。

说实话,我刚开始玩ESP32的时候,觉得MAC地址就是个编号,没啥大不了的。直到有一次做项目,两台设备死活连不上,查了半天才发现是MAC地址搞混了。嗯,从那以后,我再也不敢小看这串数字了。

3.1 什么是MAC地址?

MAC地址,全称是Media Access Control Address,翻译过来叫“媒体访问控制地址”。

说白了,它就是网络设备的“身份证号”。

你想想看,每个人都有一个身份证号,全球唯一。网络设备也一样,每个网卡、每个Wi-Fi模块,出厂时都会烧录一个全球唯一的MAC地址。

MAC地址长什么样?

通常是一串12位的十六进制数,比如:24:0A:C4:12:34:56

这12位数字分成6组,每组2位。前3组是厂商代码,后3组是设备序列号。

重要概念:

  • MAC地址是硬件地址,烧录在ROM里,一般不会变
  • IP地址是逻辑地址,可以动态分配
  • MAC地址工作在OSI模型的第二层(数据链路层)
  • IP地址工作在第三层(网络层)

我在项目中遇到过一个问题:两台ESP32设备,明明烧录了同样的程序,但通信就是不稳定。后来发现,是因为我手动改了其中一台的MAC地址,结果冲突了。所以,除非你非常清楚自己在做什么,否则不要随意修改MAC地址

3.2 如何获取ESP32的MAC地址?

获取MAC地址其实很简单。ESP-IDF和Arduino框架都提供了现成的API。

方法一:使用Arduino框架

如果你用的是Arduino IDE,代码就几行:

#include <WiFi.h>

void setup() {
  Serial.begin(115200);
  
  // 获取MAC地址
  uint8_t mac[6];
  esp_read_mac(mac, ESP_MAC_WIFI_STA);
  
  // 打印MAC地址
  Serial.printf("MAC地址: %02X:%02X:%02X:%02X:%02X:%02X\n",
                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

void loop() {
  // 啥也不干
}

方法二:使用ESP-IDF框架

如果你用ESP-IDF,代码也差不多:

#include "esp_mac.h"

void app_main() {
    uint8_t mac[6];
    esp_read_mac(mac, ESP_MAC_WIFI_STA);
    
    printf("MAC地址: %02X:%02X:%02X:%02X:%02X:%02X\n",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

方法三:直接看芯片上的标签

嗯,这个方法最原始,但也最直接。有些ESP32开发板上会贴一个标签,上面印着MAC地址。不过,我建议你还是用代码读一下,因为标签可能贴错,或者被磨掉了。

小技巧:

ESP32有多个MAC地址:

  • ESP_MAC_WIFI_STA:Wi-Fi Station模式(默认)
  • ESP_MAC_WIFI_SOFTAP:Wi-Fi AP模式
  • ESP_MAC_BT:蓝牙模式
  • ESP_MAC_ETH:以太网模式

在ESP-NOW中,我们通常使用ESP_MAC_WIFI_STA的MAC地址。

3.3 MAC地址在ESP-NOW中的作用

ESP-NOW是一种无连接通信协议,它不像Wi-Fi那样需要先连接路由器。那么,它怎么知道数据要发给谁?

答案就是:靠MAC地址

在ESP-NOW中,MAC地址扮演了三个关键角色:

3.3.1 设备标识

每个ESP32设备都有一个唯一的MAC地址。当你发送数据时,接收方通过MAC地址知道是谁发来的。就像你收到一封信,看寄信人地址就知道是谁写的。

3.3.2 通信寻址

ESP-NOW支持三种通信模式:

模式 MAC地址使用方式 典型场景
点对点 指定目标MAC地址 两个设备直接通信
广播 使用广播MAC地址 FF:FF:FF:FF:FF:FF 一个发,多个收
组播 指定一组MAC地址 特定设备组通信

我曾经做过一个项目,需要把传感器数据从客厅传到卧室。点对点模式就搞定了,我只需要在发送端指定卧室设备的MAC地址。

3.3.3 安全过滤

ESP-NOW支持白名单机制。你可以设置只接收来自特定MAC地址的数据包。这样,即使别人知道你的通信频率,也收不到你的数据。

注意:

ESP-NOW本身没有加密功能。如果你传输敏感数据,建议在应用层自己加一层加密。我一般用AES-128,简单可靠。

3.4 避坑指南

做ESP-NOW开发时,MAC地址相关的坑不少。我踩过几个,分享给大家:

  • MAC地址写错:我曾经把MAC地址中的字母大小写搞混了。记住,MAC地址不区分大小写,但最好统一用大写。
  • 广播地址用错:广播地址是FF:FF:FF:FF:FF:FF,不是00:00:00:00:00:00。后者是无效地址。
  • MAC地址重复:虽然理论上全球唯一,但某些廉价模块可能会重复。买模块时尽量选正规渠道。
  • 忘记保存MAC地址:我习惯把每个设备的MAC地址贴个标签,或者写死在代码里。不然设备多了,根本记不住谁是谁。

总结一下:

MAC地址是ESP-NOW通信的基石。没有它,设备之间就找不到彼此。获取MAC地址很简单,用esp_read_mac()函数就行。在ESP-NOW中,MAC地址用于设备标识、通信寻址和安全过滤。记住,不要随意修改MAC地址,除非你很清楚后果

好了,这一章就到这里。下一章我们聊聊ESP-NOW的初始化流程,看看怎么让设备准备好通信。