ESP-NOW是ESP8266和ESP32的替代通信协议。基本概念



ESP-NOW是用于发送对配对的设备,开发和释放之间的短分组的简化WiFi协议Espressif为ESP8266和ESP32微控制器在2016.07。同时,不使用与WiFi协议支持有关的其他过程,从而加快了数据包交换的过程。

ESP-NOW可以在物联网上用于控制智能光源,继电器,插座,其他远程控制设备,从传感器和其他应用程序接收信息。

ESP-NOW支持以下功能


  • 配对设备之间的加密和未加密通信。
  • 配对设备之间的加密和非加密混合通信。
  • 最多传输250个字节的有用信息。
  • 设置回调函数以通知应用程序层,尤其是传输成功或失败的信息。


ESP-NOW还具有以下功能和限制。


  • 传输速度-在2.4 GHz频率下不超过1 Mbps,即 ESP-NOW在与WiFi路由器相同的频率和信道上运行。
  • 未使用WiFi协议
  • 类似于2.4 GHz无线鼠标中使用的低功耗协议。
  • 仅需要初始配对。
  • 配对后,连接不会中断。
  • 不支持广播-仅向配对的设备对进行多次分发。
  • 一台设备(包括加密对)最多支持20对(包括加密对)。
  • 工作站模式下最多支持10个加密对。
  • 在SoftAP或SoftAP + Station模式下最多6个。
  • 不支持多播加密。

安全


ESP-NOW使用具有Espressif开发的IE功能和CCMP加密技术的IEEE802.11 Action Vendor帧技术,可提供安全,无连接的通信解决方案。Wi-Fi设备支持主主密钥(PMK)和多个本地主密钥(LMK)

  • PMK用于使用AES-128算法对LMK进行加密。
  • LMK配对设备用于使用CCMP加密用户信息。不同LMK的最大数量为6。如果未为配对设备设置LMK,则不会对用户数据进行加密。

基本水平


在ESP_NOW协议的较低级别,维护一个链表,其中包含有关本地设备和配对设备的信息,包括MAC地址和密钥。ESP-NOW还为应用程序层存储常用数据,以避免重新处理链表的开销。有关设备的信息用于发送和接收数据,其中包括

有关本地设备的信息:

  • PMK:16个字节-用于加密所连接设备上的密钥的主主密钥(API中的KOK)ESP_NOW默认情况下支持PMK,因此不需要进行配置。如有必要,您可以验证PMK值是否与本地设备匹配。
  • 模式:1字节-本地设备模式,用于定义发送WiFi接口(SoftAP或STA)ESP-NOW。配对的设备模式不会影响任何功能,而只会保存应用程序层的模式信息。在STA WiFi模式下,仅Station适用,而SoftAP WiFi仅是SoftAP。
    本地设备操作模式ESP_NOW
    WiFi
    IDLE
    CONTROLLERSTA
    SLAVESoftAP

    COMBO&SoftAP


配对的设备信息(包括常用信息和其他用户信息):

  • LMK:16字节-本地主密钥,用于在此对通信期间对有用信息的密钥进行加密。
  • MAC-: 6 — , . , Station, MAC- Station.
  • : 1 — (SoftAP STA) ESP-NOW.
  • : 1 — , , . 0..255. , . . , 0 , ; 1 ~ 14 ; , .

在发送/发送数据包时,Espressif不建议在回调函数中使用冗长的操作,这可能与使用中断机制实现算法有关。回调函数中与动态内存分配相关的问题也支持此假设,可以通过优先使用静态变量以及使用MicroPython异常机制的歧义来解决该问题没有描述

开始/结束过程,配对,接收/发送Espressif数据包异步的实现,这也不利于异步 MicroPython意识形态的应用

ESP-NOW软件包格式


  • MAC标头:24个字节。
  • 类别:1个字节,指示包创建者的类别。该值已设置(127)。
  • 组织ID:3个字节,包含一个唯一的标识符,它是Espressif使用的MAC地址的前三个字节。设定值(0x18fe34)
  • 随机值:4个字节,用于保护数据。
  • 软件包创建者数据:7-255Bytes

程序包创建者数据包含以下字段:

  • ID:1个字节,设置为(221)。
  • 长度:1个字节,组织ID,类型,版本和用户数据的总长度。
  • 组织ID:3个字节,包含一个唯一的标识符,它是Espressif使用的MAC地址的前三个字节。设定值(0x18fe34)
  • 类型:1字节,ESP-NOW协议。设定值(4)
  • 版本:1个字节,ESP-NOW的当前版本。已安装(1)
  • 内容:0-250字节的用户数据。
  • FCS:4个字节,校验和

由于ESP-NOW不使用WiFi协议,因此MAC标头与标准数据包标头略有不同。FrameControl字段的FromDS和ToDS位为0。目标地址在第一个地址字段中指定。第二个地址字段显示源地址。第三个地址字段设置为广播地址(0xff:0xff:0xff:0xff:0xff:0xff)。

基本应用算法


开始和结束


在使用ESP-NOW之前,建议您将Wi-Fi接口设置为所需的模式。通常,将Station界面设置为CONTROLLER,将SoftAP界面设置为SLAVECOMBO还建议在使用ESP-NOW后停止Wi-Fi。

要立即开始ESP,请调用esp_now_init()esp_now_deinit()完成。调用esp_now_deinit()时,将删除有关已配对设备的所有信息。

绑定回调函数


发送数据包esp_now_register_send_cb()时的呼叫处理功能可用于告知发送方成对的应用级别传输成功或失败的信息,例如,是否成功传输了MAC子层的信息。

使用esp_now_register_send_cb()时,请考虑以下因素:

在链接对中:

  • 如果应用程序层未收到数据包,但回调函数返回“成功”,则原因可能是:
    -来自欺诈设备的攻击
    -加密密钥安装错误
    -乐鑫应用程序级别的数据包丢失
  • 如果应用程序层收到了数据包,但是回调函数返回了错误,则原因可能是:
    -信道繁忙,并且未接收到ACK。

与本地设备的所有对进行多次通信:

  • 如果回调返回“成功”,则表示数据包已成功发送。
  • 如果回调函数返回错误,则表示未成功发送数据包。

收到esp_now_register_receive_cb()数据包后,呼叫处理功能将返回包括一对发送设备的MAC地址和有用信息的信息。它也可以用于通知与接收器配对的发送设备的应用层成功接收到数据包。

添加一对配对的设备


发送数据之前,必须通过调用esp_now_add_peer()将设备添加到配对设备对列表中在将数据发送到一组已建立的对之前,必须添加具有多播MAC地址的设备。配对设备的通道范围是0到14。如果通道设置为0,数据将在当前通道上发送。否则,必须将通道设置为本地设备所在的通道。

安全


如果密钥需要加密,则可以调用esp_now_set_pmk()将其配置为设置PMK。如果未安装PMK,则默认情况下将使用PMK,并为所有设备选择相同的密钥。同时为选定对设置LMK。

使用ESP-NOW软件包发送数据


使用esp_now_send()发送ESP-NOW数据同时,如果在MAC级别成功接收到数据,则在发送回调函数时,先前在esp_now_register_send_cb()中设置的函数将返回ESP_NOW_SEND_SUCCESS否则,ESP_NOW_SEND_FAIL将返回有几种原因可能导致ESP-NOW无法发送数据。特别是,

  • 目标设备不存在;
  • 设备通道不匹配;
  • 传输期间数据丢失。

不能保证应用程序层一定会接受数据。如有必要,您可以在收到ESP-NOW数据后发送确认。如果发生确认超时,则应重复ESP-NOW数据传输。也可以将序列号分配给ESP-NOW数据以删除重复的数据。

通过esp_now_send()发送ESP-NOW数据时请注意一次发送的信息不能超过250字节。

注意!发送两个ESP-NOW数据包之间的时间间隔太短会导致回调函数执行错误,因此建议在回调函数成功完成上一个发送的处理之后再发送下一个数据包ESP-NOW。回调功能是从高优先级的Wi-Fi任务发送的。因此,不建议在回调函数中执行冗长的操作。相反,您可以将必要的数据放在静态队列中,并从优先级较低的进程中进行处理。

如果发送功能返回一个MAC地址,则它将使用该MAC地址发送到设备。如果send函数返回NULL,则该数据包将被发送到连接到发送设备的所有设备,这可能导致传输失败或由于网络拥塞而造成的延迟。

ESP-NOW现在接收数据


回调功能还从Wi-Fi任务开始。因此,不建议在回调函数中执行冗长的操作。相反,您可以将必要的数据放在静态队列中,并以较低优先级的流程进行处理。

总之,前述


我在使用ESP-NOW 构建Espressif IDEMicroPython方面的经验,描述了我在组装过程中遇到的错误,并在获得稳定的结果后将其修复。然后,我将对MicroPython上的ESP-NOW库进行描述,其中包含检测到的错误以及解决这些错误的方法。不幸的是,由于ESP-NOW的源代码是封闭的并且仅以二进制形式分发,因此对ESP-NOW协议的算法的理解是经验性的,并且已经发现了许多问题,对于这些问题,并非总是可以通过逻辑方式克服,而通常在ESP中-NOW已基于GitHub上提供的300多个应用程序成功地应用于C用户和Pythonist社区。Espressif

对ESP-NOW C库的描述

MicroPython ESP-NOW描述和开源

All Articles