支持的芯片

Ameba SoC

RTL8721Dx

RTL8726EA

RTL8720EA

RTL8730E

支持状态

Y

N

N

N

Wi-Fi R-Mesh 拓扑结构

如下图所示,Wi-Fi R-Mesh 是一个树形 Mesh 网络,用于增加 Wi-Fi 覆盖范围,让距离 AP 较远的设备也能获得稳定的网络连线。

../../_images/rmesh_topology_capacity.svg

Wi-Fi R-Mesh 拓扑结构

Wi-Fi R-Mesh 优势

Wi-Fi R-Mesh 具有以下突出优势:

  • 应用层软件开发无感:

    • 所有的 Mesh 协议都在 Wi-Fi 驱动层实现,不管是根节点还是子节点,应用层都可以将当前的节点视为是一个和 AP 连接的 Wi-Fi Station。

    • Wi-Fi 配网程序无需更新。

  • 百微妙级别的快速配对和切换:

    • 当检测到信号更好的父节点的时候,子节点可以快速的从旧的父节点切换到新的父节点,而不影响数据通信。

    • 当父节点发生问题时(掉电或挂住),子节点可以迅速检测到并切换到另一个父节点,而不影响数据通信。

    • 一个节点可以携带其所有的子节点一起切换到另外一个父节点,所有节点的数据通信不受影响。

  • 经过数跳的设备也具备较高的吞吐量:

    • R-Mesh 转发无须经过 TCP/IP 协议栈,数据转发都在底层驱动实现,可以节省 SRAM 和 MCU 算力。

    • 软件处理时间极短,可以获得更好的吞吐量。

  • 整个 Mesh 网络具有很高的稳定性:

    • 软件处理极其简单,也不需要算法维护路由表,所以整个网络会非常的稳定。

    • 传统 Mesh 网络的 环路 问题不会发生。

Wi-Fi R-Mesh 数据流

Wi-Fi R-Mesh 直接在 Wi-Fi 驱动层实现数据转发, 消耗极少的 SRAM 和 MCU 算力。

由于需要极少的软件处理过程,所以即使经过几跳的节点也会有很好的吞吐量。

../../_images/rmesh_data_flow.svg

Wi-Fi R-Mesh 数据流

Wi-Fi R-Mesh 网络容量

Wi-Fi R-Mesh 中每个根节点下可以连接的子节点个数称为 R-Mesh 的网络容量。

如图 Wi-Fi R-Mesh 拓扑结构 所示,网络容量为 4,则每个根节点只可以连接4个节点,不管拓扑的形式是哪一种。

  • 拓扑 0:所有子节点都直接连接到根节点

  • 拓扑 3:4个节点形成一个4跳的线型网络

  • 也可能是拓扑0和拓扑3之间的其他拓扑结构

Wi-Fi R-Mesh NAT(R-NAT)

由于 R-Mesh 的每个节点都会和 AP 创建真实的 Wi-Fi 连线,在 AP 可以连接的 Station 数量受限的情况下,R-Mesh 可以支持的节点个数也会受限。

基于此,我们可以使用 Station + SoftAP 基于 NAT 协议来扩展 R-Mesh 中节点的数量。此时,根节点及子节点会和 SoftAP 连线,而不是和 AP 连线。NAT 协议用于 AP 网络和 R-Mesh 网络之间的数据转发。

在 R-Mesh 中,我们称这样的节点为 R-NAT 节点。

如下图所示,R-NAT 节点放在根节点和 AP 之间,用于扩展可以接入网络的节点数量。

../../_images/rmesh_nat.svg

Wi-Fi R-NAT

Wi-Fi R-Mesh 吞吐量

吞吐量数据

Wi-Fi R-Mesh 的吞吐量数据如下表所示:

测试场景

UDP Tx(Mbps)

UDP Rx(Mbps)

TCP Tx(Mbps)

TCP Rx(Mbps)

Single Node

Layer1

54.2

39.5

17.0

15.7

Layer2

19.6

18.8

9.6

10.0

Layer3

12.8

11.6

6.9

7.0

Layer4

9.4

8.2

5.4

5.2

Layer5

7.5

6.2

4.4

4.3

L1 + L2

Layer1

21.0

21.2

Layer2

12.5

14.0

L1 + L2 + L3

Layer1

14.0

13.3

Layer2

7.0

7.2

Layer3

5.1

6.4

L1 + L2 + L3 + L4

Layer1

10.0

12.1

Layer2

4.0

8.4

Layer3

3.6

6.7

Layer4

3.0

4.0

L1 + L2 + L3 + L4 + L5

Layer1

9.0

10.4

Layer2

3.2

3.7

Layer3

2.5

2.9

Layer4

2.3

1.8

Layer5

1.8

2.1

吞吐量测试

与普通的 Station 或 AP 模式无异,我们可以通过 iperf 命令测试 R-Mesh 的吞吐量。如下图所示,在 AP 端和节点端的 PC 上输入 iperf 指令即可。

../../_images/rmesh_tp_test_ipref.svg

R-Mesh 吞吐量测试

  • 节点端通过 UART 输入如下 AT 指令:

    AT+IPERF=-c,<server IP>,-i,<periodic>,-u,-b,<bandwidth>,-t,<transtime>,-p,<port>
    
  • AP 端通过 Terminal 输入如下 iperf 指令:

    iperf -s -i <periodic> -u -p <port>
    

Wi-Fi R-Mesh RTT

不同于 BLE 和 ZigBee,R-Mesh 的 RTT(Round-Trip Latency)是非常低的,并且不会随着数据包的增大而明显增加。

../../_images/rmesh_rtt.png

Wi-Fi R-Mesh 可视化演示工具(Gravitation)

测试环境

AP 和 PC 通过网络连接,Gravitation 运行于 PC 上,如下图所示:

../../_images/rmesh_demo_tool_connection.svg

Wi-Fi R-Mesh 测试环境

概述

Gravitation 可以用于显示所有接入 AP 的 R-Mesh 节点及其拓扑结构,其主要特点如下:

  • 及时显示网络拓扑及其改变

  • 可以做 ping 测试

../../_images/rmesh_demo_tool.png

Gravitation 工具界面

每个节点会显示 MAC_Addr:IP(更新时间)。比如: CE:192.168.1.100(5:6) 代表 MAC 地址为 XX:XX:XX:XX:0xCE,IP 地址为 192.168.1.100。节点之间的连线上显示的两个红色数字表示当前父节点的得分以及最优候选节点的得分,该得分是以信号强度为基础计算得到的。

Gravitation 和 R-Mesh 节点之间是通过 socket 进行通信的,节点定期将自己的 IP 地址、父节点 MAC 地址等信息通过 socket 发给 Gravitation 所在的 PC,Gravitation 解析后显示拓扑的实时情况。

用户可以参考此设计重新开发自己的应用,用于获取并显示 R-Mesh 网络的拓扑情况。

使用指南

Gravitation 工具位于: {sdk}/tools/R-Mesh_Demo_Tool.

测试步骤如下:

  1. 将 AP 和 PC 通过网络连接,执行 gravitation.exe

  2. 打开 gravitation 文件夹下的文件 config.yaml,配置所要测试的 AP(可以同时添加多个 AP)。

    ap_mac_list:
    
    - 00:11:22:33:44:55
    
  3. 配置 ping 间隔和 ping 包长度(不配置则使用默认参数)。

    ping:
    interval: 500
    packet_size: 64
    

其中,ping 间隔也可以通过 Gravitation 界面直接配置。

此时,Gravitation 配置完成。关闭 Gravitation 并重新运行 gravitation.exe,所有配置即刻生效。

  1. 使用 AT 指令让每个测试节点连接 AP,之后节点会自动进行 Mesh 组网。可以在 Gravitation 观察到每个节点的连接状况及网络拓扑。

    AT+WLCONN=ssid,rmesh_test,pw,12345678
    
  2. 若需手动拖动节点来自行布局,请取消勾选界面右下角的 自动布局 选项。因为 Gravitation 默认采用自动布局的方式,默认情况下可以拖动 AP,但是无法拖动 R-Mesh 节点。

  3. Gravitation 默认采用自动显示信息的方式,每个节点的部分信息会自动显示在节点的右上角,可以通过取消勾选界面右下角的 显示信息 选项来取消信息的自动显示。

    此模式下,当点击某一个节点时,会在该节点的右上方显示完整的 MAC 地址和 IP 地址,同时还会显示一个扫描清单,记录该节点所扫描到的周围节点的 MAC 地址最后一个字节、信号强度等信息。

    ../../_images/rmesh_demo_manual_display.png

    手动显示信息

Wi-Fi R-Mesh 参数配置

仅需配置有限的几个参数,即可使用 R-Mesh(不配置则使用默认配置)。

打开文件 {sdk}/component/soc/usrcfg/amebadplus/ameba_wificfg.c ,按需修改以下参数后重新编译 SDK 即可。

/*R-Mesh*/
wifi_user_config.wtn_en = 0;
wifi_user_config.wtn_strong_rssi_thresh = -50;
wifi_user_config.wtn_father_refresh_timeout = 3000;
wifi_user_config.wtn_child_refresh_timeout = 4000;
...
wifi_user_config.wtn_max_node_num = 15;
...

参数说明:

wifi_user_config.wtn_en:

R-Mesh 功能总开关,写 1 表示使能。R-Mesh 的所有节点和 R-NAT 节点都需要将其写 1。

wifi_user_config.wtn_strong_rssi_thresh:

RSSI 高于这个阈值,则节点会作为根节点或 R-NAT 节点直连 AP。

wifi_user_config.wtn_father_refresh_timeout:

单位为毫秒,如果子节点超过这个时间没有收到父节点的 beacon,则会切换父节点。

wifi_user_config.wtn_child_refresh_timeout:

单位为毫秒,如果父节点超过这个时间没有收到子节点的 beacon,则会删除这个子节点。

wifi_user_config.wtn_max_node_num:

R-Mesh 网络中最大节点数量,用于决定每个节点发送 beacon 的窗口大小。节点数量越多,发送 beacon 的窗口越小,且发送间隔会变大。

Wi-Fi R-Mesh NAT 参数配置与编译设定

R-Mesh NAT 功能默认处于关闭状态,请按如下步骤进行配置,然后参考 R-Mesh SDK获取及编译 进行编译。

  1. 打开文件 {sdk}/component/soc/usrcfg/amebadplus/ameba_wificfg.c ,按需修改以下参数:

    /*R-Mesh*/
    ...
    wifi_user_config.wtn_rnat_en = 0;
    wifi_user_config.wtn_fixed_rnat_node = 0;
    wifi_user_config.wtn_connect_only_to_rnat = 0;
    ...
    

    参数说明:

    wifi_user_config.wtn_rnat_en:

    Wi-Fi R-Mesh NAT 功能开关,写 1 表示使能。希望成为 R-NAT 节点时需要使能,其他节点则不需要。

    wifi_user_config.wtn_fixed_rnat_node:

    控制是否强制成为 R-NAT 节点,仅当 wifi_user_config.wtn_rnat_en=1 时才有效。

    • 写 1 表示强制成为 R-NAT 节点

    • 写 0 表示是否最终成为 R-NAT 节点取决于与 AP 之间的信号强度

    wifi_user_config.wtn_connect_only_to_rnat:

    控制是否只能连接 R-NAT 节点。

    wifi_user_config.ap_sta_num:

    对于 R-NAT 节点,该参数表示与该 R-NAT 节点可以直连的 client 数量。配置为大于5个时,需要修改内存布局,目前最大可以支持 14 个 client。

  2. 修改 wifi_user_config.ap_sta_num 后,若需要调整内存布局,操作如下:

    打开 SDK 中的 {sdk}/amebadplus_gcc_project/amebaDplus_layout.ld 文件, 将 RAM_KM0_IMG2_SIZE 由默认的 96K 调整到 116K,可以支援 R-NAT 节点直连 14 个 client。

    #define RAM_KM0_IMG2_SIZE                         KBYTES(116)
    
  3. 修改 menuconfig,因为 R-Mesh NAT 需要使能 LWIP 的 NAT 功能。

    {sdk}/amebadplus_gcc_project 下执行 ./menuconfig.py,选择 CONFIG LWIP > Enable NAT REPEATER

    ----Connectivity config----
    CONFIG WHC INTF  --->
    ...
    CONFIG LWIP  --->
       [ ] Enable Fast DHCP
       [*] Enable NAT REPEATER
       [*] Enable LWIP NETCONN SEM PER THREAD
       [ ] Enable LWIP Debug
    ...
    

R-Mesh SDK获取及编译

  1. 获取 SDK 和 R-Mesh WLAN lib

    1. 默认 SDK 中,R-Mesh 根节点只可以连接2个节点,如希望根节点可连接4个节点,需额外索取 R-Mesh WLAN lib(联系 <claire_wang@realsil.com.cn>)

    2. 下载 SDK: IoT SDK

  2. 默认 SDK 的 R-Mesh 编译

    1. 设定 wifi_user_config.wtn_en=1,并根据需求设置其他 R-Mesh 相关的 wifi_user_config 选项

    2. 编译固件,即可使用 R-Mesh

  3. 若需测试根节点连接4个节点的场景,获取 lib 后替换文件和编译固件

    1. 替换 {sdk}/amebadplus_gcc_project/project_km4/asdk/lib/application 路径下的 lib_wifi_whc_ap.a

    2. 替换 {sdk}/amebadplus_gcc_project/project_km0/asdk/lib/application 路径下的 lib_wifi_common.alib_wifi_fw.alib_wifi_whc_np.a

    3. 编译固件,即可使用 R-Mesh

R-Mesh 内存占用

开启 R-Mesh 后,额外多占用的内存如下表所示:

项目

KM0

txt

22KB

rodata

2.4KB

data+bss

0.9KB

heap

20KB