Mwifi¶
Mwifi (MESH Wi-Fi) 是用于 ESP-MDF 中最重要的一个组件,目的是实现 ESP-WIFI-MESH 网络组建、通信。为了更好的使用 ESP-WIFI-MESH,Mwifi 对原生的 API 进一步封装。
功能¶
- 网络配置:通过简单的 API 实现对 ESP-WIFI-MESH 网络的配置:根节点配置、网络容量、ESP-WIFI-MESH 网络稳定性、数据传输、路由信息、ESP-WIFI-MESH 连接参数;
- 分片发送:实现对应用层数据进行分片,将 ESP-WIFI-MESH 底层数据包一个个发送出去;
- 数据压缩:使用 miniz 对每个数据包进行压缩处理,减少数据包的大小,提高传输速率;
- 单播发送:当使用单播方式发送时,设备在收到数据包后,设备将向每个目的地址分别发送数据包,数据包在 ESP-WIFI-MESH 网络中经过多跳的方式传输到目的地址;
- 多播发送:当使用多播方式发送时,设备在收到数据包后,将传给该节点下一层的所有节点,减少数据传输次数,该方式类似与 IP 多播;
- 广播发送:当使用广播方式发送时,设备将向周围发送 ESP-WIFI-MESH 广播数据包,周围所有的节点都能收到该数据包,收到数据包的设备将继续向周围广播数据包;
- 设备分组:将希望批量控制的相同类型设备纳入到同一个设备组当中,组的唯一标识为组地址;
- 重包过滤:使用 Mwifi 提供的 API 接收 ESP-WIFI-MESH 数据包,将过滤收到的相同数据包;
- 线程安全:在发送 ESP-WIFI-MESH 数据包之前都需要获取到互斥锁并在之后释放,这样就可以在 FreeRTOS 操作系统中使用。
网络配置¶
可调用 Mwifi 提供的 API 配置 ESP-WIFI-MESH 网络,例如:路由器 SSID 和密码,MESH ID和密码,节点类型,MESH 信道等。
- 无路由器场景
在无路由器的情况下,我们只能指定每个节点的类型(根/非根节点);参考无路由器示例:example/function_demo/mwifi/no_router
- 有路由器场景
在有路由器的情况下,我们可以选择指定每个节点的类型的这种方式,也可以选择根节点自动选择的方式;参考有路由器示例:example/function_demo/mwifi/router
分片发送¶
在实际的应用中,应用层中每一包的数据可能比较多,经常超过底层每个数据包的最大长度。所以,在发送时经常需要做的就是分片发送。在 ESP-MDF 应用层中每一个数据包允许的最大数据长度为 8095 字节,而 ESP-WIFI-MESH 底层协议栈中每一个数据包允许的最大数据长度为 1472 字节。
数据压缩¶
考虑到应用层的数据量会比较大,在传输前对应用层数据进行压缩,而在接收到数据后进行解压缩。这都是通过 miniz 数据压缩库实现的。
- 时间:压缩 2~4 ms;解压缩 1~2 ms
- 内存使用:任务的栈空间应不小于 8 KB,动态内存 压缩:7 KB,解压缩 2 KB
- 压缩率:与数据内容关系很大,数据重复率越高压缩率越高,适用于 json 等明文格式数据传输
单播发送¶
如图所示,在单播发送方式中,设备向目的地址发送的数据将在 MEHS 网络中通过多跳的方式传输到目的设备。
注解
单播向上发送(子节点发向根节点)有流控,因此是阻塞的,需要等待发包结束或者出错才能返回
多播发送¶
由于有许多的应用需要由一个源节点发送到许多目的节点,即一对多的通信。例如:控制家庭中所有的灯关闭。这时使用多播方式进行就可以明显地减轻网络中各种资源的消耗。
与单播方式相比,在一对多的通信中,多播可大大节约网络资源。从图中可以看出,使用单播方式,源节点需要向所有目的节点传输同样的数据,为此,需要发送 n 个单播,即同一个数据包要发送 n 个副本。 但如果使用多播方式,源节点只需将数据发送一次到根节点,根节点在收到数据包时,将其转发到下一层的所有节点,下一层的所有节点在接收到数据包后,做同样的操作,经过这些操作后,该 ESP-WIFI-MESH 网络内所有目的节点都能收到来自源节点的数据包。
广播发送¶
在一对多的通信中,使用多播方式发送,可以明显地减轻网络中各种资源的消耗。但是,在有些情况,使用广播的方式也是一种不错的选择。例如:对时延和速率要求高,但可以容忍丢包的场景,如:音频传输。
当使用广播方式发送的时候,设备 A 向环境中广播数据包,收到广播数据包的设备 B 同样向环境中广播数据包。这时设备 A 同样会接收到设备 B 发送的广播数据包,设备 A 接收到这个数据包之后发现这个数据包和之前自己广播的数据包相同,故不再向环境中广播数据包。
设备分组¶
在 ESP-WIFI-MESH 实际应用时,同一个 ESP-WIFI-MESH 网络中会存在很多设备,并且有很多设备功能类似,在对设备进行控制时,希望批量控制这些设备,这时,就可以将这些功能类似的设备添加到同一个设备组中。
根节点向所有子节点发送数据包,但只有目的组中的节点才能对数据包中的内容进行处理。