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的初始化流程,看看怎么让设备准备好通信。