ESP-NOW无线通信协议简介
ESP-NOW 是由Espressif开发的基于数据链路层的无线通信协议,它将五层 OSI 上层协议精简为一层,数据传输时无需依次经过网络层、传输层、会话层、表示层、应用层等复杂的层级,也无需层层增加包头和解包,大大缓解了网络拥挤时因为丢包而导致的卡顿和延迟,拥有更高的响应速度。
其特点是短数据包传输,该协议类似于低功耗2.4GHz无线连接。设备之间的配对需要在它们通信之前进行。配对完成后,连接是安全的和对等的,不需要握手。这意味着设备相互配对后,连接是持久的。换句话说,如果您的一块板突然断电或复位,当它重新启动时,它会自动连接到它的对等体以继续通信。能够在无路由器的情况下直接、快速、低功耗地控制智能设备。它能够与 Wi-Fi 和 Bluetooth LE 共存。
加密和未加密的单播通信; 混合加密和未加密的对等设备; 最多可携带250字节的有效数据; 发送回调函数,可以设置为通知传输成功或失败的应用层; Station mode最多支持10个加密对等体,SoftAP或SoftAP +Station mode最多支持6个加密对等体; 支持多个未加密的对等体,但是它们的总数应少于20个,包括加密的对等体;
简而言之,ESP-NOW是一种快速通信协议,可用于在ESP32板之间交换数据(最多250字节)。
ESP-NOW单向通信
一个ESP32板向另一个ESP32板发送数据,如传感器读数或控制GPIOs的开和关命令。
一块ESP32板向不同的ESP32板发送相同或不同的命令。这种配置非常适合构建类似远程控制系统。
一个“从”ESP32从多个“主”ESP32接收数据,例如可以将其配置为web服务器,以显示来自所有其它板的数据。
ESP-NOW双向通信
每个板可以同时成为发送者和接收者。因此,您可以在板之间建立双向通信。
可以向此配置中添加更多的板,并拥有一个看起来像网络的东西(所有ESP32板相互通信)。
ESP32的MAC地址
每个ESP32都有一个唯一的MAC地址,这就是我们如何使用ESP-NOW识别每个板并向其发送数据
#include <WiFi.h>
#include <esp_wifi.h>
void readMacAddress(){
uint8_t baseMac[6];
esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, baseMac);
if (ret == ESP_OK) {
Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
baseMac[0], baseMac[1], baseMac[2],
baseMac[3], baseMac[4], baseMac[5]);
} else {
Serial.println("Failed to read MAC address");
}
}
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin();
Serial.print("[DEFAULT] ESP32 Board MAC Address: ");
readMacAddress();
}
void loop(){
}
上传代码后,以115200的波特率打开串行监视器,然后按下ESP32 RST/EN按钮。MAC地址应该打印如下:
不同的开发板的MAC地址都会不一样,以实际读取到的地址为准
总结
以上介绍了ESP-NOW的基本特性,接下来的文章将举例介绍ESP-NOW的单向和双向通信方式。