ESP-Mesh-Lite 用户指南

ESP-MESH-LITE

本指南提供有关 Mesh-Lite 协议的介绍。

概述

ESP-MESH-LITE 是一套建立在 Wi-Fi 协议之上的网络协议。ESP-MESH-LITE 允许分布在大范围区域内(室内和室外)的大量设备(下文称节点)在同一个 WLAN(无线局域网)中相互连接。ESP-MESH-LITE 与 ESP-MESH(又称 ESP-WIFI-MESH)最大的不同是 ESP-MESH-LITE 允许组网内的子设备独立访问外部网络,传输信息对于父节点无感,大大降低了应用层开发难度,ESP-MESH-LITE 具有自组网和自修复的特性,也就是说 Mesh 网络可以自主地构建和维护。

本 ESP-MESH-LITE 指南分为以下几个部分:

  1. 简介
  2. ESP-MESH-LITE 概念
  3. 建立网络
  4. 管理网络
  5. 数据传输
  6. 性能
  7. ESP-MESH-LITE 与 ESP-MESH 差异
  8. 移植指南
  9. 更多注意事项

简介

乐鑫 ESP-Mesh-Lite 方案已经适配乐鑫多种芯片:

芯片ESP-IDF Release/v4.3ESP-IDF Release/v4.4ESP-IDF Release/v5.0ESP-IDF Release/v5.1
ESP32supportedsupportedsupportedsupported
ESP32-C3supportedsupportedsupportedsupported
ESP32-S2supportedsupportedsupportedsupported
ESP32-S3N/Asupportedsupportedsupported
ESP32-C2N/AN/Asupportedsupported
ESP32-C6N/AN/AN/Asupported

传统网络架构示意图

传统 Wi-Fi 网络架构

传统基础设施 Wi-Fi 网络是一个“单点对多点”的网络。这种网络架构的中心节点为接入点 (AP),其他节点 (station) 均与 AP 直接相连。其中,AP 负责各个 station 之间的仲裁和转发,一些 AP 还会通过路由器与外部 IP 网络交换数据。在传统 Wi-Fi 网络架构中:

  1. 由于所有 station 均需与 AP 直接相连,不能距离 AP 太远,因此覆盖区域相对有限。
  2. 受到 AP 容量的限制,网络中允许的 station 数量相对有限,很容易超载。

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

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

ESP-MESH-LITE 与传统 Wi-Fi 网络的不同之处在于:网络中的节点不需要连接到中心节点,而是可以与相邻节点连接。各节点均通过 Wi-Fi 连接的方式负责相邻节点的数据转发。由于无需受限于距离中心节点的位置,ESP-MESH-LITE 网络的覆盖区域更广。类似地,由于不再受限于中心节点的容量限制,ESP-MESH-LITE 允许更多节点接入,也不易于超载。同时,每个节点会由父节点分配得到 IP 地址,故可以像单个设备接入路由器一样访问网络,其父节点对该数据只做网络层的转发,对应用层无感。

ESP-MESH-LITE 概念

术语

术语描述
节点任何 属于可以成为 ESP-MESH-LITE 网络一部分的设备
根节点网络顶部的节点
子节点如节点 X 连接至节点 Y,且 X 相较 Y,到根节点的层级更多,则称 X 为 Y 的子节点
父节点与子节点对应的概念
后代节点任何可以从根节点追溯到的节点
兄弟节点连接至同一个父节点的所有节点
连接AP 和 station 之间的传统 Wi-Fi 关联。ESP-MESH-LITE 中的节点使用 station 接口与另一个节点的 SoftAP 接口产生关联,进而形成连接。连接包括 Wi-Fi 网络中的身份验证和关联过程
上行连接从节点到其父节点的连接
下行连接从父节点到其一个子节点的连接
子网子网指 ESP-MESH-LITE 网络的一部分,包括一个节点及其所有后代节点。因此,根节点的子网包括 ESP-MESH-LITE 网络中的所有节点

树型拓扑

ESP-MESH-LITE 建立在传统 Wi-Fi 协议之上,可被视为一种将多个独立 Wi-Fi 网络组合为一个单一 WLAN 网络的组网协议。在 Wi-Fi 网络中,station 在任何时候都仅限于与 AP 建立单个连接(上行连接),而 AP 则可以同时被多个 station 连接(下行连接)。然而,ESP-MESH-LITE 网络则允许节点同时充当 station 和 AP。因此,ESP-MESH-LITE 中的节点可以使用 其 SoftAP 接口建立多个下行连接,同时使用 其 station 接口建立一个上行连接。这将自然产生一个由多层父子结构组成的树型网络拓扑结构。

ESP-MESH-LITE 树型拓扑图

ESP-MESH-LITE 树型拓扑

ESP-MESH-LITE 中每个节点都会获得由父节点所分配得到 IP 地址,其可以直接向外部网络发起通信,并且该通信数据对于其父节点来说无感。

备注

ESP-MESH-LITE 网络中的大小(节点总数)取决于网络中允许的最大层级,以及每个节点可以具有的最大下行连接数。因此,这两个变量可用于配置 ESP-MESH-LITE 网络的大小。

网络中允许的最大层级:1-16

每个节点可以具有的最大下行连接数:1-10

节点类型

ESP-MESH-LITE 节点类型图

ESP-MESH-LITE 节点类型

根节点:网络顶部的节点,是 ESP-MESH-LITE 网络和外部 IP 网络之间的唯一接口。根节点直接连接至传统的 Wi-Fi 路由器,在 ESP-MESH-LITE 网络的节点和外部 IP 网络之间起桥接作用。 正常情况下,ESP-MESH-LITE 网络中只能有一个根节点,且根节点的上行连接只能是路由器。如上图所示,节点 A 即为该 ESP-MESH-LITE 网络的根节点。

叶子节点:不允许拥有任何子节点(即无下行连接)的节点。如果节点处于 ESP-MESH-LITE 网络的最大允许层级,则该节点将成为叶子节点。叶子节点不会再产生下行连接,确保网络层级不会超出限制。由于建立下行连接必须使用 SoftAP 接口,因此一些没有 SoftAP 接口的节点(仅有 station 接口)也将被分配为叶子节点。如上图所示,位于网络最外层的 L/M/N 节点即为叶子节点。

中间父节点:既不是属于根节点也不属于叶子节点的节点即为中间父节点。中间父节点必须有且仅有一个上行连接(即一个父节点),但可以具有 0 个或多个下行连接(即 0 个或多个子节点)。因此,中间父节点可以发送和接收自己的数据包,也可以转发其上行和下行连接的数据包。如上图所示,节点 B 到 J 即为中间父节点。 注意,E/F/G/I/J 等没有下行连接的中间父节点并不等同于叶子节点,原因在于这些节点仍允许形成下行连接。

空闲节点:尚未加入网络的节点即为空闲节点。空闲节点将尝试与中间父节点形成上行连接,或者在有条件的情况下(参见 自动根节点选择 )成为一个根节点。如上图所示,K 和 O 节点即为空闲节点。

信标帧

ESP-MESH-LITE 中能够形成下行连接的每个节点(即具有 SoftAP 接口)都会定期传输 Wi-Fi 信标帧。节点可以通过信标帧让其他节点检测自己的存在和状态。空闲节点将侦听信标帧以生成一个潜在父节点列表,并与其中一个潜在父节点形成上行连接。ESP-MESH-LITE 使用“供应商信息元素”来存储元数据,例如:

  • Mesh-Lite 版本号
  • 节点当前所处的层级
  • 当前子节点数量
  • 可接受的最大下行连接数量

首选父节点

当一个空闲节点有多个候选父节点(潜在父节点)时,空闲节点将与其中的 首选父节点 形成上行连接。首选父节点基于以下条件确定:

  • 候选父节点所处的层级
  • 候选父节点的信号强度

在网络中所处层级较浅的候选父节点(包括根节点)将优先成为首选父节点。这有助于在形成上行连接时控制 ESP-MESH-LITE 网络中的总层级使之最小。例如,在位于第二层和第三层的候选父节点间选择时,位于第二层的候选父节点将始终优先成为首选父节点,除非第二层的候选父节点的 RSSI 强度低于预设阈值。

如果同一层上存在多个候选父节点,RSSI 强度最高的将优先成为首选父节点。

首选父节点选择示意图

首选父节点选择

上图(A 侧) 展示了空闲节点 G 如何在 B/C/D/E/F 五个候选父节点中选择首选父节点。首先,B/C 节点优于 D/E/F 节点,因为这两个节点所处的层级更浅。其次,C 节点优于 B 节点,因为 C 节与 G 节点距离更近,RSSI 信号强度更优。

上图(B 侧) 展示了空闲节点 G 如何在根节点 A 和其他候选父节点中选择首选父节点。此时,根节点 A 处于空闲节点 G 范围之内(即空闲节点 G 接收到的根节点 A 信标帧 RSSI 强度高于预设阈值),由于根节点 A 处于网络中最浅的层,因此将成为首选父节点。

备注

用户还可以通过 esp_mesh_lite_set_allowed_levelesp_mesh_lite_set_disallowed_level 自行定义选择节点固定哪个层级或者禁用哪个层级(见 Mesh-Lite API 详解)。

建立网络

一般过程

警告

ESP-MESH-LITE 正式开始构建网络前,必须确保网络中所有节点具有相同的配置(见 esp_mesh_lite_config_t)。每个节点必须配置 相同 MESH_LITE 网络 ID、最大层级数量和 SoftAP 配置

ESP-MESH-LITE 网络将首先选择根节点,然后逐层形成下行连接,直到所有节点均加入网络。网络的布局可能取决于诸如根节点选择、父节点选择和异步上电复位等因素。但简单来说,一个 ESP-MESH-LITE 网络的构建过程可以概括为以下步骤:

ESP-MESH-LITE 网络构建过程示意图

ESP-MESH-LITE 网络构建过程
1. 根节点选择

根节点直接进行指定(见 用户指定根节点)或通过融合的方式决定最终的根节点(见 自动根节点选择)。一旦选定,其余节点开始连接根节点并与其形成上行连接。

2. 第二层形成

一旦根节点连接到路由器,根节点范围内的其余节点以及后面上电的相同配置的节点将会扫描到根节点的存在(根节点在没有达到最大连接数量的情况下,若达到最大连接数量,节点将会选择更高层级的节点作为首选父节点),从而形成第二层网络。一旦连接,第二层节点成为中间父节点(假设最大允许层级大于 2 层),并进而形成下一层。如上图所示,节点 B 到节点 D 都在根节点的连接范围内。因此,节点 B 到节点 D 将与根节点形成上行连接,并成为中间父节点。

3. 其余层形成

剩余的空闲节点将与所处范围内的中间父节点连接,并形成新的层。一旦连接,根据网络的最大允许层级,空闲节点成为中间父节点或叶子节点。此后重复该步骤,直到网络中的所有空闲节点均加入网络或达到网络最大允许层级。如上图所示,节点 E/F/G 分别与节点 B/C/D 连接,并成为中间父节点。

4. 限制树深度

为了防止网络超过最大允许层级,最大允许层级上的节点将在完成连接后成为叶子节点。这样一来,其他空闲节点将无法与这些最大允许层上的叶子节点形成连接,因此不会超过最大允许层级。然而,如果空闲节点无法找到其他潜在父节点,则将无限期地保持空闲状态。如上图所示,网络的最大允许层级为四。因此,节点 H 在完成连接后将成为叶子节点,以防止任何下行连接的形成。

自动根节点选择

在自动模式下,根节点的选择取决于相对于路由器的信号强度。

ESP-MESH-LITE 默认首先上电的设备作为根节点,若存在多个设备同时上电,每个设备将首先连接至已配置的 Wi-Fi 路由器,之后每个设备将通过向路由器发出竞选广播,其中带有自己的 MAC 地址以及路由器 RSSI 值,MAC 地址可以表示网络中的唯一节点,而 路由器 RSSI 值 代表相对于路由器的信号强度。

所有连接到同一路由器的 Mesh-Lite 设备(满足同一 Mesh-Lite ID)收到后,如果节点检测到具有更强的路由器 RSSI 的广播,则停止发送,即 “弃权”。经过一定的等待时间后(默认 10 s),所有弃权的设备将与路由器断开连接,重新扫描潜在父节点并选出首选父节点形成上行连接(即连接到根节点上作为二级节点,若二级节点连满,相应的会作为三级节点)。

提示

  • 该方案也同时可解决根节点冲突。若在 Mesh-Lite 组网建立连接成功之后,出现了同一配置的设备连接到了同一路由器上(手动指定或者意外连接),那么也将通过该方式解决根节点冲突
  • 若想避免大量设备同时去连接路由器,建议将子节点上电和根节点上电时间错开,待根节点成功上电之后,再大批量上电子节点,这样子节点就能够及时发现根节点并形成连接。

下图展示了在 ESP-MESH-LITE 网络中,根节点的自动选择过程。

根节点选举示例

1. 节点 A/B/C 同时上电后连接到路由器上,通过竞选,节点 C 具有最强的路由器 RSSI 值 (-10 dB)。

2. 节点 A/B 从路由器上断开,重新扫描潜在父节点,节点 C 将成为节点 A/B 的首选父节点,并与之连接。节点 A/B 将形成网络的第二层。

3. 节点 D/E 上电后,首先扫描是否存在潜在父节点,节点 C 将成为节点 D/E 的首选父节点(即最浅的节点),并与这些节点连接。节点 A/B/D/E 形成网络的第二层。

4. 节点 F 和节点 G 分别连接节点 D 和节点 E,并完成网络构建过程。

用户指定根节点

根节点也可以由用户指定,即直接让指定的根节点与路由器连接。当根节点指定后,如果存在同样连接到路由器的节点,就会主动断开并去寻找新的父节点,以防止根节点冲突的发生。下图展示了在 ESP-MESH-LITE 网络中,根节点的手动选择过程。

根节点指定过程示例图

根节点指定示例(根节点 = A,最大层级 = 4)

1. 节点 A 是由用户指定的根节点,因此直接与路由器连接。

2. 节点 C 和节点 D 将节点 A 选为自己的首选父节点,并与其形成连接。这两个节点将形成网络的第二层。

3. 类似地,节点 B 和节点 E 扫描到有合适的父节点节点 C,将与节点 C 连接,节点 F 将与节点 D 连接。这三个节点将形成网络的第三层。

4. 节点 G 将与节点 E 连接,形成网络的第四层。然而,由于该网络的最大允许层级已配置为 4,因此节点 G 将成为叶子节点,以防止形成任何新层。

选择父节点

默认情况下,ESP-MESH-LITE 具有可以自组网的特点,也就是每个节点都可以自主选择与其形成上行连接的潜在父节点。自主选择出的父节点被称为首选父节点。用于选择首选父节点的标准旨在减少 ESP-MESH-LITE 网络的层级,并使节点具有更优的连接稳定性(参见 首选父节点)。

异步上电复位

ESP-MESH-LITE 网络构建可能会受到节点上电顺序的影响。如果网络中的某些节点为异步上电(即相隔几分钟上电),网络的最终结构可能与所有节点同步上电时的理想情况不同。延迟上电的节点将遵循以下规则:

规则 1:如果网络中已存在根节点,则延迟节点上电后即使自身的路由器 RSSI 更强也不会尝试去连接路由器。相反,延迟节点与任何其他空闲节点无异,将通过与首选父节点连接来加入网络。如果该延迟节点为用户指定的根节点,其会直接连接至路由器,原根节点(非用户指定根节点,仅仅是 Mesh 组网逻辑竞选出的根节点)便会从路由器断开作为新根节点的子节点。

规则 2:如果空闲节点被用户指定层级,则该空闲节点在没有找到指定层级上一层的父节点之前不会尝试形成任何上行连接。空闲节点将无限期地保持空闲,直到其寻找到满足自己所指定层级的父节点。

下方示例展示了异步上电对网络构建的影响。

网络构建(异步电源)示例

1. 节点 A/C/D/F/G/H 同步上电,均连接到路由器上,节点 A 的 RSSI 最强,竞选 A 为根节点,其他节点与路由器断开并开始扫描潜在父节点。

2. 一旦节点 A 成为根节点,其余的节点就开始与其首选父节点逐层形成上行连接,并最终形成一个具有五层的网络。

3. 节点 B/E 由于存在上电延迟,因此即使路由器 RSSI 比节点 A 更强(-20 dB 和 -10 dB)也不会尝试成为根节点。相反,这两个上电延迟节点均将与对应的首选父节点 A 和 C 形成上行连接。加入网络后,节点 B/E 均将成为中间父节点。

同步上电:如果所有节点均同步上电,节点 E (-10 dB)由于路由器 RSSI 最强而成为根节点。此时形成的网络结构将与异步上电的情况截然不同。

环路避免、检测和处理

环路是指特定节点与其后代节点(特定节点子网中的节点)形成上行连接的情况。因此产生的循环连接路径将打破 Mesh 网络的树型拓扑结构。ESP-MESH-LITE 内部具有一定的环路检测机制来避免意外情况下节点与其子网中的节点建立上行连接并形成环路。

管理网络

作为一个自修复网络,ESP-MESH-LITE 可以检测并修正 Mesh 网络中的故障。当具有一个或多个子节点的父节点断开或父节点与其子节点之间的连接不稳定时,会发生故障。ESP-MESH-LITE 中的子节点将会重新寻找更合适的父节点,并与其形成上行连接,以维持网络互连。ESP-MESH-LITE 可以处理根节点故障和中间父节点故障。

根节点故障

对于根节点来说,如果其子节点有变动(连接或断开),都将会启动一轮候选根节点选举过程。如果根节点断开,则与其连接的节点(第二层节点)将及时检测到该根节点故障。第二层节点将主动尝试与根节点重连。但是在多次尝试失败后,第二层最新的候选根节点将会直接与路由器连接,成为新的根节点,其余第二层节点将与新的根节点(如果不在范围内的话,也可与相邻父节点连接)形成上行连接。

如果根节点和下面多层的节点(例如根节点、第二层节点和第三层节点)同时断开,则位于最浅层的仍在正常工作的节点多次尝试重连失败后,将会重新扫描潜在父节点,若扫描到将选择新的首选父节点形成上行连接,若扫描不到则连接至路由器。

根节点故障的自修复示意

1. 节点 C 是网络的根节点。节点 A/B/D/E 是连接到节点 C 的第二层节点,由于节点 B 的 RSSI 最强,被选为候选根节点。

2. 节点 C 断开。在多次重连尝试失败后,第二层候选根节点连接至路由器,其他节点开始从原根节点上断开。

3. 节点 B 被选为根节点,并开始接受下行连接。剩余的第二层节点 A/D/E 形成与节点 B 的上行连接,因此网络已经恢复,并且可以继续正常运行。

备注

如果除了断开的根节点外,其他节点都被设定不允许作为 Level 1,则无法进行自动修复。

中间父节点故障

如果中间父节点断开,则与之断开的子节点将主动尝试与该父节点重连。在多次重连尝试失败后,每个子节点开始扫描潜在父节点(请见 信标帧)。

如果存在其他可用的潜在父节点,每个子节点将分别给自己选择一个新的首选父节点(请见 首选父节点),并与它形成上行连接。

下方示例展示了网络从中间父节点断开故障中进行自修复。

中间父节点故障的自修复示意图

中间父节点故障的自修复

1. 网络中存在节点 A 至 G。

2. 节点 C 断开。节点 F/G 检测到节点 C 的断开故障,并尝试与节点 C 重新连接。在多次重连尝试失败后,节点 F/G 将开始选择新的首选父节点。

3. 节点 G 因其范围内不存在任何父节点而暂时保持空闲。节点 F 的范围中有 B 和 E 两个节点,但节点 B 因为所处层级更浅而当选新的父节点。节点 F 将与节点 B 连接后,并成为一个中间父节点,节点 G 将于节点 F 相连。这样一来,网络已经恢复了,但结构发生了变化(网络层级增加了 1 层)。

备注

如果子节点的层级已被指定,则子节点不会将非指定层级的上一级的节点选为潜在父节点。例如 G 被指定只能作为 Level 3,则 G 节点不会尝试与 F 节点连接,此时,G 节点将无限期地保持空闲状态直到发现一个合适的二级节点。

根节点切换(自荐)

对于根节点自动切换的方式大体有两种,一种是同时多个设备连接至路由器后触发的融合场景(见 自动根节点选择)。

另外有一种情况,对于相同 SSID Password 的 Mesh 路由器,如果根节点连接路由器 A,此时整个 Mesh 组网都在路由器 A 下,如果此时路由器 A 意外掉线,则整个网络均失去上网能力,此时所有节点启动自荐模式,若能够发现相同 SSID Password 的 Mesh 路由器 B,则节点会向根节点自荐,附上自己的 MAC 地址以及路由器 RSSI,根节点会选择最优的的自荐节点,最优的自荐节点收到通知后与父节点断开连接去连接路由器 B,同时原根节点通知其子节点重新去扫描发现新的潜在父节点,自己也进入扫描状态。

数据传输

ESP-Mesh-Lite 对于每个节点来说,都会使能 LWIP 协议栈,都可以看作直连路由器的一个设备,可以在应用层独立的调用 Socket、MQTT、HTTP 等网络接口。

双向数据流

下图展示了 ESP-MESH-LITE 叶子节点网络通信时双向数据流涉及的各种网络层。

ESP-MESH-LITE 双向数据流

性能

ESP-MESH-LITE 网络的性能可以基于以下多个指标进行评估:

组网时长:从头开始构建 ESP-MESH-LITE 网络所需的总时长。

修复时间:从网络检测到节点断开到执行适当操作(例如生成新的根节点或形成新的连接等)以修复网络所需的时间。

每跳延迟:数据每经过一次无线 hop 而经历的延迟,即从父节点向子节点(或从子节点向父节点)发送一个数据包所需的时间。

网络节点容量:ESP-MESH-LITE 网络可以同时支持的节点总数。该指标取决于节点可以接受到的最大下行连接数和网络中允许的最大层级。

ESP-MESH-LITE 网络的常见性能指标如下表所示:

  • 组网时长:< 60 秒

  • 修复时间

    根节点断开:< 50 秒

    子节点断开:< 45 秒

  • 每跳延迟:8 到 12 毫秒

备注

  • 上述性能指标的测试条件见下。

    • 测试设备数量:50

    • 最大允许下行连接数量:6

    • 最大允许层级:6

  • 吞吐量取决于组网内设备数量以及层级数,同时还受到周围环境干扰的影响。

  • 用户应注意,ESP-MESH-LITE 网络的性能与网络配置和工作环境密切相关。

ESP-MESH-LITE 与 ESP-MESH 差异

  • ESP-MESH-LITE 相较于 ESP-MESH 会节省出更多的内存空间,但 ESP-MESH 的自组网和自修复的特性相对来说更加完善。

  • ESP-MESH-LITE 跟 ESP-MESH 自动选择父节点方式不同。

    • ESP-MESH:在上电后所有设备处于空闲节点的时候进行竞选,根据 RSSI 选出根节点,之后根节点再连接路由器。
    • ESP-MESH-LITE:默认首先配网完上电的设备作为根节点,若同时有多个设备上电,设备都连到路由器上面后,所有设备开始广播路由器 RSSI,RSSI 最好的作为根节点,其余节点断开与路由器的连接,开始重新扫描发现新的父节点。
  • ESP-MESH 只有根节点使能 LWIP 协议栈,所有子节点设备想要与外部网络通信都需要通过根节点的转发。

移植指南

用户若想要将原有的工程代码与 ESP-MESH-LITE 相结合,只需要关注配网时路由器连接操作,不要直接调用 esp_wifi_connect() 进行连接,而是要调用 esp_mesh_lite_connect()。

拿 Wi-Fi Provisioning 配网举例,在收到路由器 SSID 和 Password 之后,调用 esp_mesh_lite_connect(),ESP-MESH-LITE 内部会去扫描是否存在合适的父节点,若存在,则连接至首选父节点;若不存在,则连接路由器并作为根节点。

/* Event handler for catching system events */
static void event_handler(void* arg, esp_event_base_t event_base,
                          int32_t event_id, void* event_data)
{
    if (event_base == WIFI_PROV_EVENT) {
        switch (event_id) {
            case WIFI_PROV_START:
                ESP_LOGI(TAG, "Provisioning started");
                break;
            case WIFI_PROV_CRED_RECV: {
                wifi_sta_config_t *wifi_sta_cfg = (wifi_sta_config_t *)event_data;
                ESP_LOGI(TAG, "Received Wi-Fi credentials"
                         "\n\tSSID     : %s\n\tPassword : %s",
                         (const char *) wifi_sta_cfg->ssid,
                         (const char *) wifi_sta_cfg->password);
#if CONFIG_MESH_LITE_ENABLE
                mesh_lite_sta_config_t config;
                memcpy((char*)config.ssid, (char*)wifi_sta_cfg->ssid, sizeof(config.ssid));
                memcpy((char*)config.password, (char*)wifi_sta_cfg->password, sizeof(config.password));
                config.bssid_set = wifi_sta_cfg->bssid_set;
                if (config.bssid_set) {
                    memcpy((char*)config.bssid, (char*)wifi_sta_cfg->bssid, sizeof(config.bssid));
                }
                esp_mesh_lite_set_router_config(&config);
                esp_mesh_lite_connect();
#else
                esp_wifi_set_storage(WIFI_STORAGE_FLASH);
                esp_wifi_set_config(ESP_IF_WIFI_STA, (wifi_config_t*)wifi_sta_cfg);
                esp_wifi_set_storage(WIFI_STORAGE_RAM);

                esp_wifi_disconnect();
                esp_wifi_connect();
#endif /* CONFIG_MESH_LITE_ENABLE */
                break;
            }
        }
    }
}

备注

具体配网代码修改请参考 Wi-Fi Provisioning

除了配网连接部分的修改,其余的网络应用(Socket、MQTT、HTTP 等)均不需要修改

更多注意事项

  • 数据传输使用 Wi-Fi WPA2-PSK 加密(SoftAP 需设置密码)
  • Mesh 网络内部节点间通信可以通过 esp_mesh_lite_aes_set_key 选择使用 AES128 加密(见 Mesh-Lite API 详解)

本文图片中使用的路由器与互联网图标来自 www.flaticon.com 的 Smashicons。

原文连接:
https://github.com/espressif/esp-mesh-lite/blob/master/components/mesh_lite/User_Guide_CN.md#%E6%80%A7%E8%83%BD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/199138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业园区重金属废水深度处理工程项目,稳定出水0.1mg/l

随着环保要求不断提高&#xff0c;工业废水处理已成为众多企业的必修课。然而在工业生产中&#xff0c;如何有效处理含有重金属的废水成为了一个关键的挑战。 重金属废水是指含有汞、铅、铜、镉、锌、镍等有毒有害物质的废水&#xff0c;来源于矿山开采、金属冶炼、电镀、印刷线…

2024年申报国自然项目基金撰写及技巧

随着社会经济发展和科技进步&#xff0c;基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题&#xff0c;具备突破性的科学思路和方法。因此&#xff0c;基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合&#xff0c;形成多学科交叉…

20世纪30年代的大危机

背景 1929年9月&#xff0c;美国财政部部长安德鲁梅隆向公众保证“现在没有担心的理由&#xff0c;这一繁荣的高潮将会继续下去”。 当时流行的一首儿歌&#xff1a;“梅隆拉响汽笛&#xff0c;胡佛敲起钟&#xff0c;华尔街发出信号&#xff0c;美国往地狱里冲&#xff01;”…

Dropdown下拉菜单(antd-design组件库)简单用法和禁用菜单

1.Dropdown下拉菜单 向下弹出的列表。 2.何时使用 当页面上的操作命令过多时&#xff0c;用此组件可以收纳操作元素。点击或移入触点&#xff0c;会出现一个下拉菜单。可在列表中进行选择&#xff0c;并执行相应的命令。 用于收罗一组命令操作。 Select 用于选择&#xff0c;而…

西南科技大学信号与系统A实验三(线性连续时间系统的分析)

一、实验目的 1.掌握用 matlab 分析系统时间响应的方法 2.掌握用 matlab 分析系统频率响应的方法 3.掌握系统零、极点分布与系统稳定性关系 二、实验原理 1. 系统函数 H(s) 系统函数:系统零状态响应的拉氏变换与激励的拉氏变换之比. H(s)=R(s)/E(s) 在 matlab 中可采用…

geemap学习笔记016:获取图像的基本属性和描述性信息

前言 遥感数据中通常包含众多信息&#xff0c;例如图像获取的时间、云覆盖量、以及每个波段的最大值最小值等等。 1 导入库并显示地图 import ee import geemapMap geemap.Map() Map2 添加图像数据 centroid ee.Geometry.Point([-122.4439, 37.7538]) #创建一个点坐标lan…

java编程:数组代表着苹果期货在 9 天内的价格变化,其中第 n 个元素是苹果在第 n 天的 价格,你可以进行最多三次交易,设计算法,9 天内赚到最多的钱

1 题目 编程题&#xff1a;下面的数组代表着苹果期货在 9 天内的价格变化&#xff0c;其中第 n 个元素是苹果在第 n 天的 价格&#xff0c;你可以进行最多三次交易&#xff0c;设计一个算法&#xff0c;9 天内如何赚到最多的钱&#xff1f;价格数组&#xff1a; [8, 9, 2, 5, …

DS八大排序之直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~&#xff01;本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析&#xff01; 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误

文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错&#xff0c;问我怎么解决&#xff0c;程序运行时报如下错误&#xff1a; type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…

聚观早报 |红魔9 Pro开卖;真我GT5 Pro定档

【聚观365】11月29日消息 红魔9 Pro开卖 真我GT5 Pro定档 一加12镜头细节公布 Redmi K70 Pro将搭载夜枭算法 苹果Vision Pro头显下月量产 红魔9 Pro开卖 红魔电竞旗舰最新力作——红魔9 Pro系列正式发布。作为一款全能电竞旗舰&#xff0c;该机搭载了第三代骁龙8移动平台…

【九】linux下部署frp客户端服务端实践

linux下部署frp客户端服务端实践 简介&#xff1a; 今天有一个这样的需求&#xff0c;部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#x…

Java后端开发——JDBC(万字详解)

Java后端开发——JDBC&#xff08;万字详解&#xff09; 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 …

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

【burpsuite安全练兵场-客户端16】测试WebSockets安全漏洞-3个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

微服务--03--OpenFeign 实现远程调用 (负载均衡组件SpringCloudLoadBalancer)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenFeign其作用就是基于SpringMVC的常见注解&#xff0c;帮我们优雅的实现http请求的发送。 RestTemplate实现了服务的远程调用 OpenFeign快速入门负载均衡组件Spr…

深入redis过程-命令

目录 通用命令 get set keys exists del expire key seconds ttl type 常用数据结构 String类型 SET GET MSET MGET INCR INCRBY INCRBYFLOAT SETNX SETEX Hash类型 HSET key field value HGET key field HMSET HMGET HGETALL HKEYS HVALS HINCRB…

Redis队列stream,Redis多线程详解

Redis 目前最新版本为 Redis-6.2.6 &#xff0c;会以 CentOS7 下 Redis-6.2.4 版本进行讲解。 下载地址&#xff1a; https://redis.io/download 安装运行 Redis 很简单&#xff0c;在 Linux 下执行上面的 4 条命令即可 &#xff0c;同时前面的 课程已经有完整的视…

Ubuntu 上使能 SELinux

首发公号&#xff1a;Rand_cs 此文档说明如何在 ubuntu 上启用 SELinux&#xff0c;测试环境为虚拟机&#xff0c;开始前一定一定一定先来个快照&#xff0c;不要问我为什么有三个一定。 卸载 apparmor&#xff08;可选&#xff09; ubuntu 默认安装的安全组件为 apparmor&a…

红队攻防之hash登录RDP

没什么好害怕&#xff0c;孩子放心去飞吧&#xff0c;在你的身后有个等你的家 Restricted Admin Mode 受限管理模式是一项 Windows 功能&#xff0c;可防止将 RDP 用户的凭据存储在建立 RDP 连接的计算机的内存中。 这是用来防止用户&#xff08;管理员&#xff09;在 RDP 进…

使用Pytorch从零开始构建扩散模型-DDPM

知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 引言 去噪…