ESP WiFi Mesh是乐鑫基于其芯片实现的一种WiFi网状网。
吃饱了撑的,刚开始了解ESP-MESH,据说要做项目,恰巧又没中文文档,就翻译翻译。
ESP-MDF的无线通信协议基础
https://esp-idf.readthedocs.io/en/latest/api-guides/mesh.html
译文:
ESP-MESH是一种”多跳”网络,至少需要两个无线hops(网络设备中间连接)用于从源设备到目的设备传递信息。ESP-MESH是一种设备传输自身数据同时也作为其它设备数据传输中继的技术。成功的MESH网络的先决条件是所有的MESH节点首先在物理层连接成功,其后MESH网络算法通过物理连接选择数据传输路径。作为一种高可靠度,广覆盖度的WLAN网络,ESP-MESH是理想的覆盖大区域的无线解决方案。
ESP-MESH与传统无线网络不同。传统无线技术提供点对点或者多点的拓扑结构。通常,会有一个中心节点,例如手机通讯系统中的基站或者802.11 WLAN中的AP节点。这个中心节点与每一个无线终端通过单独hop路由连接。除此之外,中心节点通过有线连接到骨干网络(backbone)。相对照的,ESP-MESH采用树状拓扑结构,具有根节点(root node),中间节点(intermediate node)与叶子节点(leaf node),这使得网络更具有扩展性与容错性。所有ESP-MESH网络内的节点都可以成为根节点,如果根节点异常,网络会自动选择一个新的根节点。这些有效减少了树状拓扑结构对于单个节点的依赖,并且允许ESP-MESH内每个节点都参与信息的转发。
ESP-MESH网络拓扑结构示意:
ESP-MESH定义了一种自组织,自恢复,快速组网,便于控制的的网络。
ESP-MESH内包含有三类节点:
<1> RootNode:根节点,ESP-MESH树状拓扑结构的顶端节点,也是ESP-MESH与外部IP网络的唯一接口。它的功能是作为网关转发外部数据包。
<2> IntermediateNode:中间节点,中间节点可以接收、发送、传递来自其父节点与子节点的数据包。
<3> LeafNode:叶子节点,叶子节点可以接收、发送数据,但不能进行传递(forward)。
每个ESP-MESH内的节点与其他节点根据其在MESH网络内的位置构成父子节点关系传递数据。根节点,作为ESP-MESH与外部IP网络连接节点,与路由器直连且可以在其子节点与路由器之间传输数据。ESP-MESH网络内设备数量与路由器带宽直接影响到根节点的数据吞吐量(throughput)。
如下图所示,节点C/D作为中间节点,同时也是根节点的的子节点。叶子节点A/B/E没有子节点。其数据流向如图所示:
路由器在ESP-MESH网络中是强制需求的。用户需要为ESP-MESH内每个节点需要配置SSID,密码与通信信道。如果路由器被隐藏,用户需要为节点配置BSSID。(关于ESP-MESH配置方法,详见《the link to Mesh IoT solutions》,即将推出)
ESP-MESH网络需要的信息包含在“供应商信息元素VIE”信标帧内。这些信息包括有:
节点类型、节点在网络内的层信息、网络各层最大节点数信息、子节点数信息、单个节点允许连接的最大节点数等。
若网络内不存在根节点,ESP-MESH内的所有设备都会广播“实时信号强度RSSI”
信号。每个节点的网络信息,包括信号强度,都会传输在整个ESP-MESH网络内,ESP-MESH网络内的设备会根据这些信息选择信号强度最高的节点作为根节点。
POR,所有ESP-MESH设备被分别扫描。每个都会设备比较其接受到的其他设备相对于路由器的信号强度以及自身相对于路由器的信号强度,并选择其中信号强度最高的设备进行广播,作为根节点申报(root-node candidate)。
接下来,每个ESP-MESH再次扫描MESH网络,选择此时信号强度最高的节点作为根节点申报,这个选择将被再次广播。这个过程会重复直到只剩一个根节点申报。
ESP-MESH也提供方法用于加速根节点选举。
ESP-MESH提供一种用于在MESH网络内选出最优父节点的方法。根据该方法,一个节点会通过VIE消息获取其它节点的信息,并且生成父节点集合。如果父节点集合包括至少两个节点,具有更优表现参数的一个会被选择为父节点。根据该方法,首选的父节点的选择是基于父节点集合内所有节点类型与表现参数。基于这种选择父节点的机制,可以保证首选的父节点是最优的选择,以此来减少丢包提高网络功能。
TODO
自恢复特性使得基于路由的网络能够在节点异常或者连接变得不稳定时继续工作。
如果根节点异常,与根节点直连的第二层节点会很快检测根节点失败并初始化新一轮的根节点选举。如果根节点以及第二层节点全部异常,第三层节点也会进行根节点选举并选出根节点。
若中间节点或者叶子节点出现异常,异常节点会在预设时间内分别重新连接其父节点,(重连失败?)然后重新选择父节点来加入ESP-MESH网络。
用户可以通过调用esp_mesh_waive_root() 转换ESP-MESH内的根节点。根节点可以被用户指定或者由网络自身产生。
多个根节点连接同一个路由器的冲突情况已被处理。多个根节点具有相同的路由SSID不同BSSID的冲突情况未进行处理。
改变ESP-MESH内一个节点的物理位置会导致父节点信号强度下降与通讯出现不确定性(?)。一旦检测到这种情况,父节点转换功能会自动选择一个更优的父节点。
当手机节点(?)不断改变其位置,其与父节点的通讯可能会减弱或者丢失,这种情况被检测到时,手机节点的父节点会被重新选择,以维持与手机节点的通讯
某节点父节点选择期间,该节点路由表内的节点会被排除,所以回环节点的情况可以避免。路径检测机制(path verification mechanism)与能量传输机制(energy transfer mechanism)会检测通讯路径是否出现回环。当检测到回环通路出现,父节点会断开与子节点的通讯并通知子节点出现回环的(预设)原因。
TBD
TBD
ESP-MESH在MESH层内提供点对点P2P重传机制
当ESP-MESH内某节点被选择为父节点,其会为每个子节点的上传数据分配一个可以动态调整大小的接收窗口。子节点在发送数据包之前会首先向父节点发送窗口请求,父节点将对比窗口请求内的序列号与最近从该子节点收到的数据包序列号。接收窗口的大小经过计算返回给子节点,子节点根据接收到的窗口大小发送数据包给父节点。
除此之外,考虑到ESP-MESH内只有根节点可以与外网进行通讯,如果ESP-MESH内的其他节点无法获知根节点与外网的连接情况,与此同时仍不停地向根节点发送数据包,可能会导致数据包丢失或者不必要的数据包发送动作。ESP-MESH提供了一种上传数据的流控机制。流控机制通过监控根节点与外部网络的连接情况稳定ESP-MESH的外出流量,以避免数据包丢失或者不必要的数据包发送。
只有指定的设备可以接收组播包,因此,用户需要指定这些设备通过配置esp_mesh_send()的相关参数。
ESP-MESH提供避免带宽浪费的机制:
<1> 当中间节点接收到来自其父节点的广播包时,会将广播包进行传输并拷贝发送给它的子节点们。
<2> 当中间节点传输自身产生的广播包时,会将广播包发送给它的父节点与子节点。
<3> 当中间节点接收到来自子节点的广播包时,会将广播包传输并发送给父节点与剩余的子节点。
<4> 当叶子节点产生广播包时,直接发送给其父节点。
<5> 根节点自身产生的广播包,发送给其所有子节点。
<6> 根节点接收来自其子节点的广播包,发送给其它子节点
<7> 当节点接收到来自自身地址的广播包时,丢弃
<8> 当节点接收来自父节点的广播包,且该包的源头是该节点的子节点,丢弃
用户通过esp_mesh_set_group_id()接口设置设备的组ID,当数据包的发送目的地址是组时,只有组内设备能接收到它。
<1> 组网时间:50个设备低于15S
<2> 自恢复时间:如果根节点异常,10秒内检测到问题并且产生新的根节点。如果某个父节点异常,5秒内子节点检测到问题并找到新的父节点。50个设备测试。
<3> 层际延时:100个设备组网且所有设备不打开AMPDU的情况下测试30ms
<4> 丢包率:100个设备组网测试,从第二层到第四层最大0.32%最低0%
<5> 网络能力:决定于每个softAP模式允许连接的最大设备数以及网络内允许的最大层数。默认配置为支持最大6个连接,最大6层连接。
软件协议栈如下:
系统事件分发:
<1> 用户应用任务需要通过esp_mesh_set_config注册一个MESH事件回调处理接口。该接口用于处理MESH协议栈与LwIP协议栈的事件回调。
<2> 用户应用可以访问除根节点外的节点并且不经过LwIP协议栈,根节点需要运行LwIP协议栈的原因是需要与外网通讯,esp_mesh_send()与esp_mesh_recv()用于发送/接收来自于MESH的数据
<3> 虽然目前ESP-IDF不建议在初始化系统时不调用tcpip_adapter_init(),应用任务仍然需要执行LwIP初始化,并且停止DHCP服务端与客户端服务。执行顺序:
tcpip_adapter_init -> tcpip_adapter_dhcps_stop -> tcpip_adapter_dhcpc_stop
由于根节点连接到路由器,所以一旦一个节点变为根节点,会直接启动DHCP客户端服务获取IP,除非已经设置了静态IP。