Mesh Device

Mesh Device Sample 展示了如何使用 Mesh Device 以及如何开发基于 Mesh Device 的应用程序。 Mesh Device 在未被配网时,称作 Unprovisioned device,无法发送和接收 mesh 消息, 此时它会发送相应的 advertising 来告知 Mesh Provisioner 自身的存在; Mesh Device 在被配网之后,称作 Node,地址和密钥等信息由 Mesh Provisioner 在 Provisioning 阶段提供。

环境需求

该示例支持以下开发工具包:

环境需求

Hardware Platforms

Board Name

RTL87x2G HDK

RTL87x2G EVB

该示例需要还需要另一个设备运行 Mesh Provisioner,作为网络管理员。

更多要求,请参考 Quick Start

硬件连线

请参考 Quick Start 中的 硬件开发环境

配置选项

  • 关于 LE 所需要的配置请查看 samples\bluetooth\mesh\mesh_device\src\app_flags.h

  • 关于 Mesh 所需要的配置请查看 samples\bluetooth\mesh\mesh_device\src\app_mesh_flags.h

编译和下载

该示例可以在 SDK 文件夹中找到:

Project file: samples\bluetooth\mesh\mesh_device\proj\rtl87x2g\mdk

Project file: samples\bluetooth\mesh\mesh_device\proj\rtl87x2g\gcc

编译和运行该示例请遵循以下步骤:

  1. 打开项目文件。

  2. 编译目标文件, 请参考 Quick Start编译APP Image 中列出的步骤。

  3. 编译成功后,目录 samples\bluetooth\mesh\mesh_device\proj\rtl87x2g\mdk\bin 下 会生成文件 app_MP_sdk_xxx.bin

  4. 下载 bin 到 EVB 板,请参考 Quick StartMPTool 中列出的步骤。

  5. 在 EVB 板上按下 reset 按钮,程序将开始运行。

测试验证

将示例工程烧录到 EVB 板后,可以使用另一个开发板运行 Mesh Provisioner 工程相互进行测试。

准备阶段

  1. 准备一个或者多个 Mesh Device,如有必要请使用 DebugAnalyzer 工具录制日志。

  2. 准备一个 Mesh Provisioner,如有必要请使用 DebugAnalyzer 工具录制日志。

测试阶段

本节主要介绍 Mesh Device 的测试部分和相关 User Command 的用法,方便用户前期学习,后期调试。 有关 User Command 的详细信息,请参阅 User Command Interface

用户可以使用任何串口助手软件与 EVB 板进行交互。有关 Mesh Device 的详细用户命令,请参阅 mesh_cmd.cdevice_cmd.c

由于 Mesh Device 的绝大部分测试过程都由 Mesh Provisioner 主导,测试流程部分请参阅 Mesh Provisioner 测试阶段

设备启动

如果 Mesh Device 处于 Unprovisioned 状态,reset 之后会在串口助手中展示如下信息。

>> Hello MeshDevice <<
>unprov device!
>bt addr: 0x000000000076

如果 Mesh Device 已经完成了配网流程,reset 之后会在串口助手中展示如下信息。

>> Hello MeshDevice <<
>ms addr: 0x0100
>bt addr: 0x000000000076

信息展示

Mesh Device 处于 Unprovisioned 状态时,在串口助手输入 ls 可以得到如下信息,包含 Device UUID、Bluetooth address、Elements 以及 Models 等信息。

>ls
MeshState:      0
DevUUID:        0x760000000000060708090A0B0C0D0E0F
BTAddr:         0x000000000076
IVindex:        0-0x0
Seq:            0x000000
NodeAddr:       0x0000-1-8
Element:        0-8
Model:          0-0-0x0000ffff
Model:          1-1-0x0002ffff
Model:          2-2-0x0000005d
Model:          3-3-0x0003005d
Model:          4-4-0x0004005d

Mesh Device 完成配网之后,在串口助手输入 ls 可以得到如下信息,会额外包含 DevKey、NetKey 等信息。 后续还会根据 Mesh Provisioner 的配置展示出更多的信息。

>ls
MeshState:      1
DevUUID:        0x760000000000060708090A0B0C0D0E0F
BTAddr:         0x000000000076
DevKey:         0-0x0100-1-0xE8950FD2FBC15F6932B3D0A426FC1FE9
NetKey:         0-0x0000-1-0-0
                0x7DD7364CD842AD18C17C2B820C84C3D6
IVindex:        0-0x0
Seq:            0x000000
NodeAddr:       0x0100-1-8
Element:        0-8
Model:          0-0-0x0000ffff
Model:          1-1-0x0002ffff
Model:          2-2-0x0000005d
Model:          3-3-0x0003005d
Model:          4-4-0x0004005d

代码介绍

本章的主要目的是帮助用户熟悉 Mesh Device 相关的开发流程。本章将按照以下几个部分进行介绍:

源码路径

  • Project directory: sdk\samples\bluetooth\mesh\mesh_device\proj

  • Source code directory: sdk\samples\bluetooth\mesh\mesh_device\src

Mesh Device 应用程序项目中的源文件结构如下所示。

└── Project: mesh_device
    └── secure_only_app
        ├── Device                           includes startup code
        ├── CMSE Library                     Non-secure callable lib
        ├── lib                              includes all binary symbol files that user application is built on
            ├── ROM_NS.lib
            ├── rtl87x2g_sdk.lib
            ├── rtl87x2g_io.lib
            ├── gap_utils.lib
            ├── mesh_dev.lib
            └── lowerstack.lib
        ├── io                               includes all peripheral drivers and module code used by the application
        ├── profile                          includes LE profiles or services used by the application
        ├── model                            includes mesh models used by the application
        ├── dfu                              includes dfu source code used by the application
        └── APP                              includes the mesh_device user application implementation
            ├── main.c                       includes the io, os, platform, le host and mesh stack initialization
            ├── app_task.c                   includes app task initialization and main loop
            ├── device_app.c                 includes device application code
            ├── mesh_sdk.c                   includes mesh sdk version record
            ├── mesh_cmd.c                   includes mesh user commands
            ├── device_cmd.c                 includes device user commands
            ├── test_cmd.c                   includes test user commands
            ├── delay_msg_rsp.c              includes delay message response
            ├── ping_app.c                   includes ping model application code
            ├── datatrans_server_app.c       includes datatrans server model application code
            ├── io_management.c              includes io management
            ├── blob_client_app.c            includes blob client model application code
            ├── dfu_updater_app.c            includes dfu updater application code
            └── dfu_distributor_app.c        includes dfu distributor application code

其中,mesh_dev.lib 根据 Mesh Protocol 版本分为 V1.0V1.1, 用户可以根据所需 feature 选择合适的 lib。

Library file: subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_0\mdk\mesh_dev.lib, subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_0\gcc\mesh_dev.a

Header file: subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_0\mesh_config.h

Library file: subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_1\mdk\mesh_dev.lib, subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_1\gcc\mesh_dev.a

Header file: subsys\bluetooth\mesh\chips\rtl87x2g\lib\v1_1\mesh_config.h

初始化

当 EVB 板 reset 时,main() 函数会执行,初始化流程如下:

int main(void)
{
    extern uint32_t random_seed_value;
    srand(random_seed_value);
    board_init();
    driver_init();
    le_gap_init(APP_MAX_LINKS);
    gap_lib_init();
    app_le_gap_init();
    app_le_profile_init();
    mesh_stack_init();
    pwr_mgr_init();
    task_init();
    os_sched_start();

    return 0;
}

os_sched_start() 调用之后, app_main_task() 会得到调度,Mesh message 相关的处理如下:

#define EVENT_MESH                    0x80
......

void app_main_task(void *p_param)
{
    ......
    mesh_start(EVENT_MESH, EVENT_IO_TO_APP, evt_queue_handle, io_queue_handle);
    ......

    while (true)
    {
        if (os_msg_recv(evt_queue_handle, &event, 0xFFFFFFFF) == true)
        {
            if (event == EVENT_IO_TO_APP)
            {
                ......
            }
            else if (event == EVENT_MESH)
            {
                mesh_inner_msg_handle(event);
            }
            else
            {
                ......
            }
        }
    }
}

参与网络

Device 只有在被 Provisioner 配置之后才可以做为网络中的节点, 根据实际需求来支持不同的 Models 以支持对应的 Profile 或功能。