当前文档版本为 v0.4.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Bluetooth: Mesh Provisioner

1 功能概述

此sample为pan1080a_afld_evb作为mesh_provisioner的实例演示项目,可以演示作为provisioner,先进行自我配置netkey,存储,然后通过pb adv对其他待入网设备广播进行扫描,建立link,入网的流程,并包括后续的配置流程。

2 环境要求

  • board: pan1080a_afld_evb

  • uart (option): 显示串口log

需要烧录有 mesh_echo 或支持Mesh入网功能的设备。

3 编译和烧录

项目位置:zephyr\samples_panchip\bluetooth\mesh_provisioner

目前可使用ZAL工具或quick build脚本进行编译和下载。

脚本位置:quick_build_samples\bluetooth\mesh_provisioner.bat

打开脚本后默认会编译项目,编译完成时,可输入字符进行后续下载等操作:

Input the keyword to continue:
  'b' build                         编译项目
  'r' make clean and rebuild        重新编译项目
  'f' flash download                下载
  'e' erase chip                    擦除芯片
  'o' open project by VS Code       打开 `VS Code`,可查看源码,执行编译下载等
  others exit                       退出
wait input:

4 演示说明

  1. 根据Zephyr编译环境搭建VSCode开发环境, 准备至少1块其他待入网设备,发送beacon如1020.

  2. 下载前需要erase chip(CONFIG_BT_SETTINGS=y情况下需要,因为需要stored cdb,防止flash冲突),CONFIG_BT_SETTINGS=n情况下不需要

  3. 烧录完成后观察入网,当附近没有待入网设备时,provisioner持续扫描,当附近存在待入网设备时,provisioner会入网第一个扫描的设备,并尝试配置

  4. 配置由于adv扫描效率问题,可能会出现失败,这时可以采用复位已入网的设备继续流程(不是擦除入网信息,是保留入网状态条件的复位)

5 开发说明

5.1 KCONFIG宏说明

  1. flash相关

    CONFIG_BT_SETTINGS建议关闭,此宏控制入网信息是否保存至provisioner的CDB(configuration database)

    # Store Bluetooth state and configuration persistently
    CONFIG_BT_SETTINGS=n
    CONFIG_BT_MESH_RPL_STORE_TIMEOUT=600
    
    # menuconfig Enable support for the flash hardware.
    CONFIG_FLASH=y
    CONFIG_FLASH_PAGE_LAYOUT=y #Enables API for retrieving the layout of flash memory pages.
    
    # menuconfig Enable support of flash map abstraction.
    CONFIG_FLASH_MAP=y
    
    # Enable support of Non-volatile Storage.
    CONFIG_NVS=y
    
    # menuconfig users settings store
    CONFIG_SETTINGS=y
    
  2. Provisioner 相关

    1. 选择provisioner

    2. CDB使能

    3. 网络node最大2:除去provisioner 可以再入1个

    # need config as this to be noticed as provisioner rather than a provisionee
    CONFIG_BT_MESH_PROVISIONER=y
    CONFIG_BT_MESH_PROV_DEVICE=n
    # creat a configuration database not use stored
    CONFIG_BT_MESH_CDB=y
    # count of net config,can only provision other 1 node
    CONFIG_BT_MESH_CDB_NODE_COUNT=2
    CONFIG_BT_MESH_CDB_SUBNET_COUNT=3
    CONFIG_BT_MESH_CDB_APP_KEY_COUNT=3
    
  3. 调试LOG宏,不建议全开,log较多占一定ram

    CONFIG_BT_DEBUG_LOG=y
    
    CONFIG_BT_MESH_DEBUG=y
    CONFIG_BT_DEBUG_CONN=y
    CONFIG_BT_MESH_DEBUG_BEACON=y
    CONFIG_BT_MESH_DEBUG_PROV=y
    CONFIG_BT_MESH_DEBUG_ADV=y
    CONFIG_BT_MESH_DEBUG_PROXY=y
    CONFIG_BT_MESH_DEBUG_MODEL=y
    CONFIG_BT_MESH_DEBUG_ACCESS=y
    CONFIG_BT_MESH_DEBUG_TRANS=y
    CONFIG_BT_MESH_DEBUG_KEYS=y
    CONFIG_BT_MESH_DEBUG_NET=y
    
  4. mesh相关参数

    CONFIG_BT_MESH=y
    CONFIG_BT_MESH_SUBNET_COUNT=1
    CONFIG_BT_MESH_APP_KEY_COUNT=1
    CONFIG_BT_MESH_ADV_BUF_COUNT=10
    CONFIG_BT_MESH_TX_SEG_MSG_COUNT=3
    CONFIG_BT_MESH_RX_SEG_MAX=32
    CONFIG_BT_MESH_MODEL_GROUP_COUNT=2
    CONFIG_BT_MESH_LABEL_COUNT=0
    CONFIG_BT_MESH_CFG_CLI=y
    CONFIG_BT_MESH_HEALTH_CLI=y
    CONFIG_BT_MESH_BEACON_ENABLED=n
    CONFIG_BT_MESH_RELAY=y
    CONFIG_BT_MESH_RELAY_RETRANSMIT_COUNT=3
    
  5. ble相关参数

    CONFIG_BT=y
    CONFIG_BT_TINYCRYPT_ECC=y
    
    # Select this for LE Observer role support
    CONFIG_BT_OBSERVER=y
    # Select this for LE Broadcaster role support.
    CONFIG_BT_BROADCASTER=y
    

5.2 MAIN函数说明

main函数包括3部分:

  • bt_enable() 初始化蓝牙

  • bt_ready() 初始化MESH

  • 信号量操作 k_sem_reset

k_sem_reset(&sem_unprov_beacon);
k_sem_reset(&sem_node_added);

先reset信号量标志,再通过sem_unprov_beacon或者sem_node_added的回调give信号量,while(1)持续获取take以上信号量完成循环入网/配置流程:

  1. 先获取配置信息,首先配置自己,由于CONFIG_BT_SETTINGS=n,因此不会记录入网信息,重启后复原,不会采用stored cdb

  2. 搜索广播包,由于配置最大网络个数2,CONFIG_BT_MESH_CDB_NODE_COUNT=2,还可以入网1个设备

  3. 入网后会对该设备进行配置

    static void configure_node(struct bt_mesh_cdb_node *node)
    

    配置包括get composition data,add appkey,bind appkey to each model as usual.

5.3 其他说明

  1. 入网演示走的流程是pb adv广播方式入网,包含的zephyr应用库subsys\bluetooth\mesh下的 pb_adv.c prov.c prov_bearer.c provisioner.c等源码,运行sample可以参考以上。

  2. 对比原始sample,provisioner调整过CONFIG_MAIN_STACK_SIZE=2048栈大小

  3. 对比原始sample,由于入网adv扫描在pan1080a_afld_evb上还待优化,修改过入网超时时间

    err = k_sem_take(&sem_node_added, K_SECONDS(30));
    

    入网不会失败,但会经过较长时间。