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,作为网络管理员。
更多要求,请参考 快速入门 。
硬件连线
配置选项
关于 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
编译和运行该示例请遵循以下步骤:
打开项目文件。
编译目标文件, 请参考 快速入门 中 编译APP Image 中列出的步骤。
编译成功后,目录
samples\bluetooth\mesh\mesh_device\proj\rtl87x2g\mdk\bin
下 会生成文件app_MP_sdk_xxx.bin
。在 EVB 板上按下 reset 按钮,程序将开始运行。
测试验证
将示例工程烧录到 EVB 板后,可以使用另一个开发板运行 Mesh Provisioner 工程相互进行测试。
准备阶段
准备一个或者多个 Mesh Device,如有必要请使用
Debug Analyzer
工具录制日志。准备一个 Mesh Provisioner,如有必要请使用
Debug Analyzer
工具录制日志。
测试阶段
本节主要介绍 Mesh Device 的测试部分和相关 User Command 的用法,方便用户前期学习,后期调试。 有关 User Command 的详细信息,请参阅 User Command Interface。
用户可以使用任何串口助手软件与 EVB 板进行交互。有关 Mesh Device 的详细用户命令,请参阅 mesh_cmd.c
、 device_cmd.c
由于 Mesh Device 的绝大部分测试过程都由 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.0
和 V1.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;
}
le_gap_init()
用于初始化 GAP 并设置 link 数目。app_le_gap_init()
用于初始化 GAP 参数。app_le_profile_init()
用于初始化 Profile。mesh_stack_init()
用于初始化 Mesh Stack, 有关配置可以参考 设备信息配置、 Device UUID 设置 、 网络特性和参数配置 、 Mesh Log 配置 等。
在 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 或功能。
Provisioning: 被 Provisioning 的流程请参考 Mesh 配网, 操作流程请参考 Provisioning 操作流程。
Model: Device 会包含一些固定的 Models 和 部分用户自行注册的 Models。 有关 Model 的部分请参考 Mesh Model。
Message Send: 发送消息部分请参考 Mesh 消息发送。