Arduino ESP32 指南

Arduino ESP32 指南 > API > ESP-NOW

ESP-NOW

ESP-NOW 是一种通信协议,旨在实现 ESP32 设备之间的低功耗、低延迟和高吞吐量通信,无需接入点 (AP)。它非常适合设备需要在本地网络中直接相互通信的场景。ESP-NOW 可用于智能灯、遥控设备、传感器和许多其他应用。

该库提供了一个易于使用的界面,用于设置 ESP-NOW 通信、添加和删除对等节点以及发送和接收数据包。

Arduino-ESP32 ESP-NOW API

ESP-NOW Class 

ESP_NOW_Class 是用于管理 ESP-NOW 通信的主类。

begin  

初始化 ESP-NOW 通信。在使用任何其他 ESP-NOW 功能之前,必须调用此函数。

bool begin(const uint8_t *pmk = NULL);
  • pmk:可选。如果启用了加密,则传递成对主密钥 (PMK)。

如果初始化成功,则返回 true,否则返回 false。

end  

结束 ESP-NOW 通信。此函数释放 ESP-NOW 库使用的所有资源。

bool end();

如果作成功,则返回 true,否则返回 false。

getTotalPeerCount  获取总计对等体计数

获取当前添加的对等节点总数。

int getTotalPeerCount();

返回对等体的总数,如果发生错误,则返回 -1。

getEncryptedPeerCount

获取使用加密的对等节点数。

int getEncryptedPeerCount();

返回使用加密的对等体数,如果发生错误,则返回 -1。

onNewPeer  

您可以使用 onNewPeer 函数注册回调函数来处理来自新对等节点的传入数据。

void onNewPeer(void (*cb)(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg), void *arg);
  • cb:指向回调函数的指针。
  • arg:可选。指向要传递给回调函数的用户定义参数的指针。

cb 函数签名:

void cb(const esp_now_recv_info_t *info, const uint8_t *data, int len, void *arg);

info:有关收到的数据包的信息。 data:指向接收到的数据的指针。 len:接收数据的长度。 arg:传递给回调函数的用户定义参数。

ESP-NOW Peer Class 

ESP_NOW_Peer 类表示 ESP-NOW 网络中的对等设备。它是一个抽象类,必须由正确处理对等连接并实现 _onReceive 和 _onSent 方法的子类继承。

Constructor  构造函数

创建 ESP_NOW_Peer 类的实例。

ESP_NOW_Peer(const uint8_t *mac_addr, uint8_t channel, wifi_interface_t iface, const uint8_t *lmk);
  • mac_addr:对端设备的 MAC 地址。
  • channel:通信通道。
  • iface:Wi-Fi 接口。
  • lmk:可选。如果启用了加密,则传递本地主密钥 (LMK)。

add 

将对等节点添加到 ESP-NOW 网络。

bool add();

如果成功添加对等节点,则返回 true,否则返回 false。

remove  

从 ESP-NOW 网络中删除对等节点。

bool remove();

如果成功删除对等节点,则返回 true,否则返回 false。

send  

将数据发送到对等体。

size_t send(const uint8_t *data, int len);
  • data:指向要发送的数据的指针。
  • len:数据的长度(以字节为单位)。

返回发送的字节数,如果发生错误,则返回 0。

addr  

获取对等体的 MAC 地址。

const uint8_t * addr() const;

返回指向 MAC 地址的指针。

addr 

Set the MAC address of the peer.
设置对等体的 MAC 地址。

void addr(const uint8_t *mac_addr);
  • mac_addr:对等体的 MAC 地址。

getChannel

获取对等体的通信通道。

uint8_t getChannel() const;

返回通信通道。

setChannel

设置 Peer 节点的通信通道。

void setChannel(uint8_t channel);
  • channel:通信通道。

getInterface  

获取对端的 Wi-Fi 接口。

wifi_interface_t getInterface() const;

返回 Wi-Fi 接口。

setInterface  

设置对端的 Wi-Fi 接口。

void setInterface(wifi_interface_t iface);
  • iface:Wi-Fi 接口。

isEncrypted 

检查对等体是否正在使用加密。

bool isEncrypted() const;

如果对等节点正在使用加密,则返回 true,否则返回 false。

setKey

设置对等体的本地主密钥 (LMK)。

void setKey(const uint8_t *lmk);
  • lmk:本地主密钥。

onReceive

回调函数,用于处理来自对等节点的传入数据。这是一个虚拟方法,可以由上层类实现,用于自定义处理。

void onReceive(const uint8_t *data, int len, bool broadcast);
  • data:指向接收到的数据的指针。
  • len:接收数据的长度。
  • broadcast:如果广播数据,则为 true,否则为 false。

onSent

Callback 函数,用于处理向对等节点发送数据的完成。这是一个虚拟方法,可以由上层类实现,用于自定义处理。

void onSent(bool success);
  • success:如果数据发送成功,则为 true,否则为 false。

Examples  例子

ESP-NOW 库的 2 个示例,用于在多个 ESP32 设备(多个主设备、多个从设备)之间使用广播消息发送和接收数据。

  1. ESP-NOW 广播主站示例:
libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Master/ESP_NOW_Broadcast_Master.ino

  1. ESP-NOW 广播从站示例:
libraries/ESP_NOW/examples/ESP_NOW_Broadcast_Slave/ESP_NOW_Broadcast_Slave.ino

使用串行监视器在 2 个 ESP32 设备之间以流的形式发送和接收数据的 ESP-NOW 串行库示例:

libraries/ESP_NOW/examples/ESP_NOW_Serial/ESP_NOW_Serial.ino