ESP_NOW

ESP-NOW
无连接wifi通信协议。在esp-now中,应用程序数据被封装在各个供应商的动作帧中,然后再无连接的情况下,从一个wifi设备传输到另一个wifi设备。CBC-MAC协议(ccmp)可用来保护动帧的安全。ESP-NOW 是由乐鑫开发的另一款无线通信协议,可以使多个设备在没有或不使用 Wi-Fi 的情况下进行通信。这种协议类似常见于无线鼠标中的低功耗 2.4GHz 无线连接——设备在进行通信之前要进行配对。配对之后,设备之间的连接是持续的、点对点的,并且不需要握手协议。它是一种短数据传输、无连接的快速通信技术,可以让低功耗控制器直接控制所有智能设备而无需连接路由器ESP-NOW广泛用于智能照明,远程控制,传感器领域

帧格式:
esp-now使用各个供应商的动作帧传输数据,默认比特率为1Mbps。各个供应商的动作帧格式为:

-----------------------------------------------------------------------------------------
|   MAC 报头   |  分类代码  |  组织标识符  |  随机值  |  供应商特定内容  |   FCS   |
-----------------------------------------------------------------------------------------
   24 字节        1 字节        3 字节      4 字节      7~255 字节       4 字节

分类代码:分类代码:分类代码字段用于指示各个供应商的类别
组织标识符:包含一个唯一的标识符,为乐鑫指定的MAC地址的前三个字节
随机值:防止重放攻击
供应商特定内容:供应商特定内容包含供应商特定字段,如下所示:

----------------------------------------------------------------------------------------
|  元素 ID  |  长度  |  组织标识符  |  类型  |  版本  |     正文     |
----------------------------------------------------------------------------------------
   1 字节     1 字节     3 字节      1 字节   1 字节    0~250 字节

元素 ID:元素 ID 字段可用于指示特定于供应商的元素。
长度:长度是组织标识符、类型、版本和正文的总长度。
组织标识符:组织标识符包含一个唯一标识符 (比如 0x18fe34),为乐鑫指定的 MAC 地址的前三个字节。

类型:类型字段设置为 4,代表 ESP-NOW。

版本:版本字段设置为 ESP-NOW 的版本。

正文:正文包含 ESP-NOW 数据。
由于 ESP-NOW 是无连接的,因此 MAC 报头与标准帧略有不同。FrameControl 字段的 FromDS 和 ToDS 位均为 0。第一个地址字段用于配置目标地址。第二个地址字段用于配置源地址。第三个地址字段用于配置广播地址 (0xff:0xff:0xff:0xff:0xff:0xff)。

安全
ESP-NOW 采用 CCMP 方法保护供应商特定动作帧的安全,具体可参考 IEEE Std. 802.11-2012。Wi-Fi 设备维护一个初始主密钥 (PMK) 和若干本地主密钥 (LMK),长度均为 16 个字节。

  • PMK 可使用 AES-128 算法加密 LMK。请调用 esp_now_set_pmk() 设置 PMK。如果未设置 PMK,将使用默认 PMK。
  • LMK 可通过 CCMP 方法对供应商特定的动作帧进行加密,最多拥有 6 个不同的 LMK。如果未设置配对设备的 LMK,则动作帧不进行加密。

初始化和反初始化
调用 esp_now_init() 初始化 ESP-NOW,调用 esp_now_deinit() 反初始化 ESP-NOW。ESP-NOW 数据必须在 Wi-Fi 启动后传输,因此建议在初始化 ESP-NOW 之前启动 Wi-Fi,并在反初始化 ESP-NOW 之后停止 Wi-Fi。 当调用 esp_now_deinit() 时,配对设备的所有信息都将被删除

、添加配对设备
在将数据发送到其他设备之前,请先调用 esp_now_add_peer() 将其添加到配对设备列表中。配对设备的最大数量是 20。如果启用了加密,则必须设置 LMK。ESP-NOW 数据可以从 Station 或 Softap 接口发送。 确保在发送 ESP-NOW 数据之前已启用该接口。在发送广播数据之前必须添加具有广播 MAC 地址的设备。配对设备的信道范围是从 0 ~14。如果信道设置为 0,数据将在当前信道上发送。否则,必须使用本地设备所在的通道。

发送 ESP-NOW 数据
调用 esp_now_send() 发送 ESP-NOW 数据,调用 esp_now_register_send_cb 注册发送回调函数。如果 MAC 层成功接收到数据,则该函数将返回 ESP_NOW_SEND_SUCCESS 事件。否则,它将返回 ESP_NOW_SEND_FAIL。ESP-NOW 数据发送失败可能有几种原因,比如目标设备不存在、设备的信道不相同、动作帧在传输过程中丢失等。应用层并不一定可以总能接收到数据。如果需要,应用层可在接收 ESP-NOW 数据时发回一个应答 (ACK) 数据。如果接收 ACK 数据超时,则将重新传输 ESP-NOW 数据。可以为 ESP-NOW 数据设置序列号,从而删除重复的数据。
如果有大量 ESP-NOW 数据要发送,则调用 esp_now_send() 一次性发送不大于 250 字节的数据。 请注意,两个 ESP-NOW 数据包的发送间隔太短可能导致回调函数返回混乱。因此,建议在等到上一次回调函数返回 ACK 后再发送下一个 ESP-NOW 数据。发送回调函数从高优先级的 Wi-Fi 任务中运行。因此,不要在回调函数中执行冗长的操作。相反,将必要的数据发布到队列,并交给优先级较低的任务处理。

接收 ESP-NOW 数据
调用 esp_now_register_recv_cb 注册接收回调函数。当接收 ESP-NOW 数据时,需要调用接收回调函数。接收回调函数也在 Wi-Fi 任务任务中运行。因此,不要在回调函数中执行冗长的操作。 相反,将必要的数据发布到队列,并交给优先级较低的任务处理。

https://randomnerdtutorials.com/esp-now-esp32-arduino-ide/
该网址是对espnow 的解释
https://mc.dfrobot.com.cn/thread-308109-1-1.html

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ESP-NOW库是Arduino的一个库,用于简化ESP8266和ESP32之间的通信。通过该库,可以方便地在这两个模块之间建立无线通信。 ESP-NOW库提供了一种直接的点对点通信方式,可以在两个模块之间发送和接收数据。利用这种通信方式,可以在不需要使用路由器或互联网的情况下,实现设备之间的数据传输。 使用ESP-NOW库时,一个设备将被设置为发送器(Sender),另一个设备将被设置为接收器(Receiver)。发送器可以将数据直接发送给接收器,接收器收到数据后可以进行相应的处理。 为了使用ESP-NOW库,首先需要在发送器和接收器上分别初始化和配置ESP-NOW库。然后,在发送器上,将需要发送的数据通过ESP-NOW库发送出去;接收器会监听是否有来自发送器的数据,一旦接收到数据,便可以进行相应的处理。 ESP-NOW库支持一对多和多对一的通信方式。一对多的通信方式允许一个发送器与多个接收器进行通信,可以实现例如广播的功能;多对一的通信方式允许多个发送器将数据发送给一个接收器。 总结来说,ESP-NOW库为Arduino提供了一种简单、直接、低功耗的通信方式,可以实现ESP8266和ESP32之间的无线通信。无论是在物联网应用程序还是远程传感器网络中,ESP-NOW库都可以提供稳定、高效的数据传输。 ### 回答2: Arduino ESP-NOW库是一种专门为ESP8266和ESP32微控制器开发的无线通信库。它允许在这些微控制器之间进行直接通信,无需使用任何中间设备或网络。 ESP-NOW库的主要特点是快速和稳定的数据传输,并且可以在多个设备之间进行广播或点对点通信。这使得它非常适合用于传感器网络、远程控制和物联网应用。 ESP-NOW库的使用相对简单,只需要在发送方和接收方的代码中包含相应的库和函数即可。发送方使用esp_now_send函数将数据发送到目标设备,而接收方使用esp_now_register_recv_cb函数注册一个接收回调函数来接收数据。发送方和接收方都需要通过esp_now_add_peer函数添加对方的MAC地址作为合法设备。 具体使用ESP-NOW库的步骤如下: 1. 在Arduino IDE中下载和安装ESP-NOW库。 2. 根据需要配置发送方和接收方的代码。 3. 在发送方代码中,使用esp_now_add_peer函数添加接收方的MAC地址。 4. 在发送方代码中,使用esp_now_send函数将数据发送到接收方。 5. 在接收方代码中,注册一个接收回调函数并处理接收到的数据。 使用ESP-NOW库有许多潜在的应用场景。例如,可以使用它来构建无线传感器网络,将多个传感器节点的数据传输到一个集中控制器上。此外,还可以使用ESP-NOW库来实现远程控制功能,比如通过手机应用程序控制家居设备。 总之,Arduino ESP-NOW库是一种简便易用的无线通信库,适用于ESP8266和ESP32微控制器之间的直接通信。它为开发者提供了一种快速、稳定和灵活的通信方式,使得许多物联网和无线控制的应用变得更加容易实现。 ### 回答3: Arduino ESP-NOW库是一种用于通信的库,它建立在ESP8266和ESP32芯片上。ESP-NOW是一种低功耗、高效率的无线通信协议,专门用于通过ESP8266和ESP32之间进行点对点和多对多通信。 ESP-NOW库提供了一组简单的函数来实现设备之间的直接通信。使用ESP-NOW库,我们可以在两个或多个ESP8266或ESP32设备之间创建无线通信网络,无需连接到Wi-Fi网络。这使得它非常适合用于物联网(IoT)应用程序,如传感器网络和控制系统等。 ESP-NOW库使用一种基于MAC地址的简单层2协议,通过广播和单播方式发送和接收消息。它的优势是在通信过程中具有低功耗和低时延特性,同时具有高传输速率和可靠性。 使用ESP-NOW库,我们可以轻松地在两个或多个设备之间进行数据交换和控制命令的发送。可以直接使用它来发送和接收数据包,而不需要连接到互联网。例如,我们可以使用ESP-NOW库来构建一个温度传感器网络,其中每个节点都是一个ESP8266或ESP32设备,可以通过ESP-NOW进行数据传输,从而形成一个分布式的温度监测系统。 总而言之,Arduino ESP-NOW库是一种用于建立低功耗、高效率无线通信网络的库,非常适合物联网应用。它提供了简单的函数,使得设备之间的点对点和多对多通信变得容易。使用ESP-NOW库,我们可以轻松构建各种物联网应用,实现设备之间的数据交换和控制命令的传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值