irpas技术客

ESP32 WIFI MESH 网络个人学习笔记整理_哈喽哈嘿哈_esp32 mdf

网络投稿 6358

WIFI MESH ESP32

?

开发注意事项

ESP-MDF是基于ESP32芯片的ESP-WIFI-MESH开发框架,MESH 的WIFI网络通信协议。

参考链接

https://github.com/espressif/esp-mdf/blob/master/README.md 一.特点:

1快速配网

APP、设备间链式配网,大范围快速配网。

2稳定升级

断点续传、数据压缩、版本回退和固件检查

3高效调试

指令终端、无线进行日志传输和调试

4局域网控制

APP传感器控制

5丰富的示例

二.框架

ESP-MDF分为三个部分Utils、Components和Examples,Utils是ESP-IDF APIs的抽象封装以及第三方库,Components是基于Utils API是组成的ESP-MDF功能模块,Examples是基于Compinents完成的ESP-WIFI-MESH解决方案。

各部分的组成:

Utils:

1.Third Party:第三方组件

Driver:常用的按键、LED等驱动

Miniz:无损高性能数据压缩库

Aliyun:阿里云物联网套件

2.Transmission:设备间数据通信方式

Mwifi:对ESP-WIFI-MESH的封装,增加了重包过滤、数据压缩、分包传输和P2P组播

Mespnow:对ESP-NOW的封装,增加了重包过滤、CRC校验、数据分包

3.Mcommon:ESP-MDF各组件之间共用的模块

Event loop :ESP-MDF的时间处理

Error Check:ESP-MDF的错误码管理

Memory Management :ESP-MDF的内存管理

Information Storage:将配置信息存储到flash中

Components:

Mconfig:配网模块

Mupgrade:升级模块

Mdebug:调试模块

Mlink:局域网控制模块

Examples

1.Function demo:功能模块的使用示例

Mwifi:常见的组网方式示例:无路由器、有路由器。先基于此进行开发,在添加配网、升级、无线测试等功能

Mupgrade:设备的升级示例

Mconfig:设备的配网示例

Mcommon:通用模块示例,事件处理、内存管理、信息存储的使用示例

2.Debug:性能测试和调试工具

Console Test :通过串口输入命令的方式。测试ESP-WIFI-MESH吞吐量、网络配置、发包时延。

Wireless Debug:通过无线的方式进行ESP-MDF调试

3.Development Kit:ESP32-Meshkit使用示例

ESP32-MeshKit-Light:板载ESP32芯片的智能灯。

ESP32-MeshKit-Sense:低功耗方案

ESP32-MeshKit-Button:ESP-WIFI-MESH在超低功耗下的使用

4.云平台:ESP-MDF对接云平台

Aliyun Linkkit:ESP-MDF接入阿里飞燕平台示例

AWS:ESP-MDF接入AWS平台示例

三、开发

EPS-WIFI-MESH通信协议和ESP-MDF编程指南。

ESP-WIFI-MESH网络架构示意图

ESP-WIFI-MESH与传统WIFI不同之处:网络中的节点不需要连接中心节点,可与相邻节点连接。各节点均负责相邻节点的数据中继,传输距离远,覆盖范围广,不易于超载。

3.1.1术语:

1.节点: 任何属于或者可以成为ESP-WIFI-MESH网络的一部分设备

2.根节点:网络顶部节点

3.子节点:如节点X连接至节点Y,且X相较Y与根节点距离更远,则称X为Y的子节点

4.父节点: 与子节点对应的概念

5.后裔节点:任何可以从根节点追溯到的节点

6.兄弟节点:连接至同一个父节点的所有节点

7.连接:AP和station之间的传统WIFI关联。

8.上行连接:从节点到其父节点的连接

9.下行连接:从父节点到其一个子节点的连接

10.无线hop:源节点和目标节点间无线连接路径中的一部分。单跳:遍历单个连接的数据包。 多跳:遍历多个连接的数据包。

11.子网:子网指ESP-WIFI-MESH网络中的一部分,包括一个节点以及其所有后代节点。

12.MAC地址:在ESP-WIFI-MESH网络中用于区别每个节点或路由器的唯一地址

13.DS:分布式系统(外部IP网络)

3.1.2树形拓扑

ESP-WIFI-MESH多跳网络,多节点进行通信。网络允许最大层级和每个节点可具有的最大下行连接数,两个参数来判断ESP-WIFI-MESH网络的大小。

3.1.3节点类型

根节点:黄色,网络顶端的节点。是ESP-WIFI-MESH网络和外部IP网络之间的唯一接口,在外部和EWM网络中中继数据,EWM网络中只能由一个根节点,根节点上行只能是路由器。

叶子节点:无下行连接的节点。不转发其他节点的数据包

中间父节点:中间父节点接受发送自己的数据包,可以转发上行和下行的数据包,承上启下。

空闲节点:尚未加入网络的节点。

3.1.4信标帧和RSSI阈值

EWM中会定期传输WIFI信标帧。节点可以通过信标帧让其他节点检测自己的存在和状态。空闲节点将侦听信标帧一生成一个潜在父节点列表,并与其中一个潜在父节点形成上行连接。

潜在上行连接的信号强度可由潜在父节点信标帧的RSSI表示。为了防止节点形成弱上行连接,EWM采用针对信标帧的RSSI阈值控制机制。如果节点检测到某节点的信标帧RSSI过低,则会在尝试形成上行连接时忽略该节点。

3.1.5首选父节点

在网络中所处层级较浅节点为首选分界点。

如果同一层级上存在多个候选父节点,则节点数最少的优先成为首选父节点。

这是一般规律,用户也可自定义选择规则。

3.1.6路由表

EWM中每个节点都会维护自己的路由表,并按照正确的路线发送数据包。某个特定的节点路由表将包含改节点的子网中所有节点的MAC地址,也包括自己的MAC地址。

esp_mesh_get_routing_table()//获取一个节点的路由表 esp_mesh_get_routing_table_size()//获取一个路由表的带线啊哦 esp_mesh_get_subnet_nodes_list()//获取某个子节点的子路由表 esp_mesh_get_subnet_nodes_num()//获取子路由表的大小 3.2建立网络

3.2.1一般过程

在构建EWM前,必须确保所有节点具有相同的配置。相同的MESH网络ID、路由器配置和SoftAP配置

1.根节点的选择

直接指定或通过选举由信号强度最强的节点担任。选择完毕后将与路由器连接,并开始允许下行连接形成。

2.第二层形成

3.其余层形成

4.限制树深度

3.2.2自动根节点选择

每个空闲节点通过WIFI信标帧发送自己的MAC地址和路由器RSSI值,MAC地址可以表示网络中的唯一节点,而路由器RSSI值代表相对于路由器的信号强度。

此后每个节点将同时扫描来自其他空闲节点的信标帧。如果节点检测到具有更强的路由器RSSI的信标帧,则节点将开始传输该信标帧的内容(相当于为这个节点投票)经过最小迭代次数,将选举出路由器RSSI值最强的信标帧。

在到达预设迭代次数后,每个节点将单独检查其得票百分比(得票数/总票数)以确定它是否应该成为根节点。大于阈值则成为根节点。

esp_mesh_set_attempts() 配置选举最小迭代次数,mesh网络越大,迭代次数越高。 esp_mesh_set_vote_precentage() 得票百分比阈值。

3.2.3用户指定根节点

根节点由用户指定,让指定根节点与路由器连接,并放弃选举过程, 网络内其他节点也放弃选举过程,以防止节点冲突。

?

esp_mesh_set_parent()指顶根节点,使其直接与路由器连接 esp_mesh_fix_root()放弃选举过程

3.2.4选择父节点

默认情况下,EWM具有自组网的特点,即每个节点都可以自主选择与其形成上行连接的潜在父节点。自主选择出的父节点称为首选父节点。EWM中也允许用户禁用自组网功能,允许用户自己定义父节点选择标准,或者直接指定父节点。

Mesh手动组网示例:https://github.com/espressif/esp-idf/tree/v4.4/examples/mesh/manual_networking

3.2.5异步上电复位

EWM网络的最终结构可能与所有节点同步上电时的理想情况不同,延迟上电的节点将遵循一下规则:

rule1.若根节点已经存在,则延迟节点不会尝试选举出心的根节点,即使RSSI更强。延迟节点与其他空闲节点一样,通过首选父节点加入网络。若延迟节点为指顶根节点,则网络中其他节点保持空闲状态,直到延迟节点完成上电。

rule2.如果延迟节点形成上行连接,并成为中间父节点,则后续也可能成为其他节点的新首选父节点。此时,其他节点切换上行连接至该延迟节点。

rule3.如果空闲节点的指定父节点上电延迟了,则该空闲节点在没有找到指定父节点前不会尝试形成任何上行连接。空闲节点将无限期地保持空闲,直到其指定的父节点上电完成。

同步上电:所有节点同步上电,此时形成网络结构将于异步上电的情况截然不同。若手动切换根节点,则仍可以达到同步上电的网络结构

esp_mesh_waive_root()

3.2.6环路闭环、检测和处理

环路指特定节点与其后代形成上行连接的情况。打破了MESH网络的树形拓扑结构。

在环路存在的情况下,EWM利用路径验证机制和能量传递机制来检测环路的产生。

3.3管理网络

EWM自修复,可以检测并修正网络路由中的故障。重新选择父节点,形成上行连接,维持网络互联。EWM网络可以处理根节点故障和中间父节点故障。

3.3.1根节点故障

若根节点断开,第二层节点将及时检测到该节点故障。第二层节点将主动尝试与根节点重连。多次失败后,第二层节点将启动新一轮的根节点选举。第二层中的RSSI最强的节点将当选为新的根节点,而剩余的第二层节点将与新的根节点形成上行连接。

如果根节点和下面多层的节点同时断开,则位于最浅层的仍在正常工作的节点将发起根节点选举。

注解:手动指定的根节点断开,则无法进行自动修复。任何节点不会在存在指定根节点的情况下开始选举过程。

3.3.2中间父节点故障

若中间父节点断开,则与之断开的子节点将主动尝试与该父节点重连,在多次尝试重连失败后,每个子节点开始扫描潜在的父节点。

如果存在其他可用的潜在父节点,每个子节点将分别给自己选择一个新的首选父节点,并形成上行连接。如果没有潜在父节点,则保持空闲状态。


注解:如果该子节点的父节点已经被指定,则子节点不会尝试与其他潜在父节点连接。

3.3.3根节点切换

除非根节点断开,否则EWM不会自动切换根节点。即使根节点的路由器RSSI降低至必须断开的情况,根节点也保持不变,。根节点切换是指明确启动新选举过程的行为,即具有更强路由器RSSI的节点选为新的根节点。

当下根节点将指示网络中所有节点开始并扫描信标帧,但同时还保持联网(即不会编程空闲节点)。如果另外一个节点收到的票数超过当前根节点,则将启动根节点切换过程,否则根节点将保持不变。

esp_mesh_waive_root()调用以触发新的选举

新选出的根节点向当前的根节点发送切换请求,而原先的根节点将返回一个应答通知,表示已经准备好切换。一旦接收到应答,新选出的根节点将与其父节点断开连接,并迅速与路由器形成上行连接,进而成为网络新的根节点。原先的根节点将断开与路由器的连接,并与此同时保持其所有下行连接并进入空闲状态。之前的根节点将开始扫描潜在的父节点并选择首选父节点。

注解:根节点的切换必须要求选举,自组网的EWM下支持,指定根节点,不能进行节点切换。

3.3.4父节点切换

父节点切换是指一个子节点将其上行连接切换到更浅一层的另一个父节点。父节点切换是自动的。

所有潜在的父节点将定期发送信标帧,从而允许子节点扫描较浅层的父节点的可用性。

3.4数据传输

3.4.1EWM数据包

EWM网路中使用ESP-WIFI-MESH数据包传输数据。ESP-WIFI-MESH数据包完全包含在WIFI数据帧中。EWM网络中的多跳数据将传输将涉及通过不同WIFI数据帧在每个无线跳上传输的单个EWM数据包。

EWM数据包

EWM数据包的Header包含源节点和目标节点的MAC地址。option字节段包含有关特殊类型EWM数据包的信息,例如组传输或者来自外部IP网络的数据包

option可以参考 MESH_OPT_SEND_GROUP 和MESH_OPT_RECV_DS_ADDR

EWM数据包的Payload包含实际的应用数据。该数据为原始的二进制数据,也可以是使用HTTP、MQTT、和JSON等应用层协议的编码数据

Payload这一块可以见 mesh_proto_t

注解:当外部IP网络发送EWM数据包时,报头的目标地址字段将包含目标服务器的IP地址和端口号,而不是节点的MAC地址(mesh_Addr_t)。此外,根节点将处理外发的TCP/IP数据包的形成。

3.4.2组控制和组播

组播功能允许将单个EWM数据包同时发送给网络中的多个节点。

esp_mesh_send() 指定一个目标节点列表或者预配置一个节点组

如果通过“指定目标节点列表”实现组播,用户必须首先将EWM数据包的目标地址设置为组播组地址,比如(01:00:5E:xx:xx:xx)。这表明EWM数据包是一个拥有一组地址的组播数据包,且该地址应该从报头选择中获得。用户需将目标节点的MAC地址列为选项(mesh_opt_t和MESH_OPT_SEND_GROUP)。这种组播方式不需要提前设置,但是由于每个目标节点的MAC地址均需列为报头的选项字段,因此会产生大量开销数据。

分组组播允许EWM数据包被发送到一个预先配置的节点组。每个分组都有一个具有唯一性的ID标识。分组组播产生的开销更小,但是必须提前将节点加入分组中。

esp_mesh_set_group_id() 将节点加入一个组 MESH_DATA_GROUP 标志位

注解:网络中所有节点在MAC层都接受EWM数据包,但是不在MAC地址列表或目标组中的节点将简单的过滤到这些数据包。

3.4.3广播

广播允许将单个EWM数据包同时发送给网络中所有节点,每个节点可以将一个广播包转发至所有上行和下行连接,使得数据包尽可能快地在整个网络中传播。EWM利用以下方法避免广播期间浪费带宽。

way1:中间父节点收到来自其父节点的广播包时,它会将数据包转发给自己的各个子节点,同时为自己保存一份数据包的副本。

way2:当中间父节点是广播源时,他会将数据包向上发送至其父节点,并向下发送给自己的各个子节点。

way3:当中间父节点接收到来自一个其子节点的广播包时,它会将该数据包转发给其父节点和其余子节点,同时为自己保存一份数据包的副本。

way4:当叶子节点是广播源时,它会将数据包发送至其父节点。

way5:当根节点是广播源时,它会将数据包发送到自己所有的子节点。

way6:当根节点收到来自其子节点的广播包时,它会将该数据包转发给其余子节点,同时为自己保存一份数据包的副本。

way7:当节点接收到一个源地址与自身MAC地址匹配的广播包时,它会将该广播包丢弃。

way8:当中间父节点接收到一个来自其父节点的广播包时(该数据包最初来自该父节点的一个子节点),它会将该广播包丢弃。

3.4.4上行流量控制

EWM依赖父节点来控制其直接子节点的上行数据流,为了防止父节点的消息缓冲因上行传输过载而溢出,父节点将为每个子节点分配一个称为接收窗口的上行传输配额。每个子节点均必须申请接收窗口才允许进行上行传输。接收窗口的大小可以动态调整。步骤如下:

Step1:每次传输前,子节点向其父节点发送窗口请求。窗口请求包括一个序号,与子节点的待传输数据包向对应。

Step2:父节点接收窗口请求,并将序号与子节点发送的前一个数据包的序号进行比较,用计算返回给子节点的接收窗口大小。

Step3:子节点根据夫节点指定的窗口大小发送数据包。如果子节点的接收窗口耗尽,他必须通过发送请求活得另一个接收窗口,然后才允许继续发送。

注解:EWM不支持任何下行流量控制。父节点切换,数据包可能会在上行传输期间丢失。

esp_mesh_post_toDS_state() EWM网络基于检测根节点和外部IP网络连接状态,提供了一种稳定外发数据吞吐量的机制。通过这个函数可以将自身与外部IP网络的连接状态广播给所有其他节点。

3.4.5双向数据流

由于使用路由表,EWM能够在mesh层中完全处理处理包的转发。TCP/IP层仅与mesh网络的根节点有关,可以帮助根节点与外部IP网络的数据包传送。

3.5信号切换

3.5.1背景

信道代表预设的频率范围,物理上相邻的BSS使用相同的工作信道会导致干扰产生和性能下降。WIFI网络中增加了网络信道切换机制。网络信道切换是通过在AP的周期性发送信标帧内嵌入一个信道切换公告(CSA)元素来实现的。在网络信号切换前,该CSA元素用于向所有连接的station广播有关即将发生的网络信道切换,并且将包含在多个信标帧中。

一个CSA元素包含有关新信道号和信道切换计数的信息。其中,信道切换计数指在网络信道切换之前剩余的信标帧间隔(TBTT)数量。因此,信道切换计数依每个信标帧递减,并且允许与之连接的station与AP同步进行信道切换。

3.5.2EWM网络信道切换

EWM网络依赖于通过节点转发CSA元素,从而实现在整个网络中传播

当具有一个或多个子节点的中间父节点接收到包含CSA元素的信标帧时候,该节点会将该元素包含在下一个发生的信标帧(即具有相同的新信道号和信道切换计数)中,从而实现CSA元素的转发。这些节点使用信道切换计数来同步其信道切换,但也会经历因CSA元素转发而造成的延迟。

EWM信道切换由路由器或根节点触发。

路由器触发

当EWM网络连接路由器时候,整个网络必须与路由器采用同一个信道,根节点无法在连接路由器时候触发信道切换。

当根节点从路由器接收到包CSA元素的信标帧时,根节点将CSA元素中的信道切换计数值设定为自定义值,然后再通过信标帧继续向下转发。此后。该信道切换计数将依转发次数为相对自定义值一次递减。该自定义值可以基于诸如网络层级、当前节点数等因素。

根节点触发

由根节点触发的信道切换只能在EWM未连接到路由器时才会发生。

esp_mesh_swirch_channel() 根节点设置一个初始信道切换计数值

3.5.3网络信道切换的影响

F1:由于EWM和路由器信道切换不同步,会出现临时信道差异

F2:存在临时信道差异时,根节点从技术上说仍是保持连接至路由器。

F3:如果根节点无法接收任何路由器CSA信标帧,则路由器将在没有EWM网络情况下切换信道。

3.5.4信道和路由器切换配置

自主信道切换和自主路由器切换取决于以下配置参数和运行时间条件。

允许信道切换:是否允许EWM切换

mesh_cfg_t 结构体中的allow_channel_switch 进行配置

预设信道:EWM可以将mesh_cfg_t结构体中的channel字段设置为相应的信道号,而具备一个预设信道。

允许路由器切换:本参数决定是否允许EWM网络进行自主路由器切换,具体可以通过mesh_router_t结构体中的allow_router_switch字段进行配置。

预设路由器BSSID:EWM网络可以将mesh_router_t结构体的bssid字段设置为目标路由器的BSSID,而预设一个路由器。

存在根节点:跟在根节点也会影响是否允许信信道或者路由器的切换。

3.6性能

EWM性能指标

组网时间:从头开始组件EWM网络所需的总时长。

修复时间:从网络检测到节点断开到执行适当操作以修复网络所需的时间。

每跳延迟:数据经过一次无线hop而经历的延迟

网络节点容量:EWM网络可以同时支持的节点总数。

?

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #ESP32 #mdf #wifi #mesh #的WIFI网络通信协议