ESP8266-Arduino网络编程实例-什么是ESP-Now

什么是ESP-Now

文章目录

1、ESP-Now介绍

根据乐鑫官方文档描述,ESP-Now是一种短数据传输、无连接的快速通信技术,适用于智能灯、遥控控制、传感器数据回传等场景

ESP-Now使用了IEEE802.11 Action Vendor帧技术,结合了乐鑫特有的IE功能和CCMP加密技术,为使用者提供了无连接,安全通信的可行方案。

在这里插入图片描述

ESP-Now具有如下技术特性:

  • 单播包加密或单播包不加密通信
  • 加密配对设备和非加密配对设备混合
  • 可携带长为250字节的有效payload数据
  • 支持设置发送回调函数以通知应用层帧发送或成功

ESP-Now有如下限制:

  • 暂不支持广播包
  • 加密配对设备有限制,Station模式下支持10个加密配对设备;SoftAP或SoftAP + Station模式下支持6个加密设备配对。非加密配对设备支持若干,与加密设备总数和不超过20个。
  • 有效payload限制为250字节。

2、ESP-Now通信方式

2.1 One-Way(单向)通信方式

One-Way通信方式相当于主从通信模式(单向),比如,一个ESP8266与另一个ESP8266通信。

在这里插入图片描述

这种配置非常容易实现,并且非常适合将数据从一块板发送到另一块板,例如传感器读数或控制 GPIO 的 ON 和 OFF 命令。

2.2 One Master-Multi Slave通信方式

在这种通信方式下一个 ESP8266设备可以向多个不同的 ESP8266设备发送相同或不同的命令。 这种通信方式非常适合构建遥控器之类的东西。 比较周围有几个ESP8266设备,由一个主ESP8266设备控制。

在这里插入图片描述

2.3 One Slave-Multi Master通信方式

如果需要将来自多个传感器节点的数据收集到一个 ESP8266 板上,则此配置是理想的选择。 例如,可以将其配置为 Web 服务器以显示来自所有其他设备的数据。

在这里插入图片描述

注意:在ESP-Now文档中,没有”Sender/Master”或”Receiver/Slave”的概念,在这里为了表达清晰,使用了这类词语。每个ESP8266设备都可以成为Sender或Receiver。

2.4 Two-Way(双向)通信方式

在这种模式下,每个ESP8266设备都可以发送或接收数据,通信是双向的。

在这里插入图片描述

多个ESP8266设备可以组成如下网络:

在这里插入图片描述

3、ESP-Now使用步骤

ESP-Now使用步骤分为两部分:

1)发送者(Sender):

  • 初始化ESP-Now
  • 注册数据发送回调函数onDataSentonDataSent函数将在信息发送完成后被执行。这样就可以知道消息是否发送成功。
  • 添加一个从设备(Receiver)。执行这一步骤需要知道消息接收设备的MAC地址。
  • 发送数据到从设备

2)接收者(Receiver)

  • 初始化ESP-Now
  • 注册数据接收回调函数onDataRecv。该函数将在消息接收完成后执行。
  • onDataRecv回调函数中,可以将接收到的消息储存,触发消息处理服务等等。

3.1 MAC地址查询

在使用ESP-Now过程中,需要使用到设备的MAC地址,下面代码演示了如何查询设备的MAC地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <ESP8266WiFi.h>

void setup(){
Serial.begin(115200);
Serial.println();
Serial.print("ESP8266 Board MAC Address: ");
Serial.println(WiFi.macAddress());
}

void loop(){

}

3.2 ESP-Now常用API函数

  • **esp_now_init()**:初始化ESP-Now。在使用ESP-Now通信前,必须初始化ESP-Now。当初始化成功,则返回0。
  • **esp_now_set_self_role(role)**:设置设备在通信过程中的角色。角色有如下类型:
    • ESP_NOW_ROLE_IDLE
    • ESP_NOW_ROLE_CONTROLLER
    • ESP_NOW_ROLE_SLAVE
    • ESP_NOW_ROLE_COMBO
    • ESP_NOW_ROLE_MAX
  • **esp_now_add_peer(uint8 mac_addr, uint8 role, uint8 channel, uint8 key, uint8 key_len)**:添加通信节点。该函数会对设备进行配对。
  • **esp_now_send(uint8 mac_address, uint8 data, int len)**:发送数据
  • **esp_now_register_send_cb()**:注册数据发送回调函数
  • **esp_now_register_rcv_cb()**:注册数据接收回调函数

文章来源: https://iotsmart.blog.csdn.net/article/details/127484512