BLE MESH(三)

  • 一、在nRF5 SDK中为Mesh示例配置承载器
  • 二、可用示例
  • 三、要开始使用nRF Mesh移动应用程序评估示例,请完成以下三个配置阶段:
  • 四、配置步骤
  • 第一步:nRF Mesh的配置
  • 第二步:使用nRF Mesh来绑定节点
  • 第三步:使用nRF Mesh设置发布和订阅
  • 五、真机配置
  • 1、client
  • 2、server
  • 3、provisioner



一、在nRF5 SDK中为Mesh示例配置承载器

MESH示例的nRF5 SDK可以使用两种提供的配置承担者来提供,不使用OOB身份验证方法或使用静态OOB身份验证方法。
请参阅下表,了解哪个示例与[PB-ADV]或[PB-GATT]或两者一起工作。

Example / Bearer

PB-ADV

PB-GATT

@ref examples_beaconing


-

@ref examples_dfu


-

@ref examples_dimming



@ref examples_enocean_switch



@ref examples_light_switch



@ref examples_light_lightness



@ref examples_light_lc_server



@ref examples_light_ctl



@ref examples_lpn

-


@ref examples_provisioner

n/a

n/a

@ref examples_sdk_coexist


-

@ref examples_pb_remote*


-

@ref examples_scene



@ref examples_sensor



@ref examples_serial*


-

1、所有这些示例都使用16字节静态OOB值。静态OOB值存储在’ STATIC_AUTH_DATA ‘中,它定义在’
example_common.h '中。
2、examples_pb_remote:使用PB-ADV与静态OOB身份验证方法。但是,它使用了与其他示例不同的16字节静态OOB值。
原因是为了防止使用PB远程客户端供应周围的所有设备。
3、examples_serial:使用PB-ADV。然而,它可以通过静态准备程序来准备,如果相同的1

二、可用示例

下面的例子提供了这个SDK:

1、examples_enocean_switch:演示如何在蓝牙MESH生态系统中实现第三方设备,即EnOcean-to-Mesh转换器。 EnOcean交换机使用BLE通告报文发送按钮状态。 这些数据包可以被捕获,并且可以用来生成等效的蓝牙MESH消息来控制其他蓝牙MESH节点。
EnOcean是一种无线通讯技术,主要频段:315MHz、868MHz、902MHz(在中国大陆主要是868MHz)的民用开放频段。

2、examples_beaconing:实现自定义信标广告,展示了如何发送和接收自定义数据包使用nRF5 SDK for Mesh。

3、examplees_sdk_coexist:演示了nRF5 SDK特性如何可以同时使用nRF5 SDK for Mesh。

4、examples_dfu:展示了如何使用专用MESHDFU框架通过蓝牙MESH更新设备的固件。

5、examples_dimming:演示了如何使用[通用级模型]api 在应用中实现调光灯和相应的调光开关。

6、examples_light_lightness:演示了如何使用[光的亮度模型]。

7、examples_light_lc_server:演示了如何使用[光LC设置服务器模型]

8、examplees_light_ctl:演示了如何使用[光CTL模型]

9、examples_lpn:演示了低功耗节点特性。

10、examples_provisioner:演示了供应过程,可以通过其他功能进行扩展。

11、examples_remote:演示了使用远程供应来在供应器的无线电范围之外提供设备。

12、examplees_scene:演示了如何使用[场景模型]

13、examplees_sensor:演示了如何使用[传感器模型]

14、examples_serial:演示了如何使用串行接口创建蓝牙MESH连接设备。

15、examples_light_switch_README是一个蓝牙MESH生态系统示例,其中包含一些较小的示例:客户机、服务器和代理服务器。

三、要开始使用nRF Mesh移动应用程序评估示例,请完成以下三个配置阶段:

  • [nRF MESH配置]
  • [使用nRF MESH绑定节点]
  • [使用nRF Mesh设置发布和订阅]

四、配置步骤

第一步:nRF Mesh的配置

要在nRF mesh移动应用程序中提供蓝牙MESH示例,请完成以下步骤:

  1. 擦除flash, 擦除开发板上的flash并对SoftDevice进行编程。
  2. 打开nRF Mesh移动应用程序。出现主应用程序窗口。
  3. 添加新节点。应用程序开始寻找未供应的节点并在屏幕上列出它们。
  4. 通过为每个节点完成以下步骤来提供每个节点:
  1. 点击节点名连接到它。
  2. 确定节点。
  3. 准备节点并选择所需的OOB选项。应用程序启动供应过程。完成后,您将收到一个通知。
  1. 当提供所有节点时,请注意服务器节点的地址。当@ref nrf-mesh-mobile-app-publication“设置发布地址”时需要它们。

1、如果自动配置坏了,手动获取合成数据,添加应用键,然后再执行以下步骤。
2、可以使用手机版nRF Mesh软件配置也可使用nrf5_SDK_for_Mesh_v5.0.0_src\examples\provisioner程序固件烧录到nRF52840、nRF52833和nRF52832上进行测试。
3、所有这些示例都使用16字节静态OOB值。静态OOB值存储在’STATIC_AUTH_DATA ‘中,它定义在’ example_common.h '中。
4、如果使用nrf5_SDK_for_Mesh_v5.0.0_src\examples\provisioner固件烧录到板子上充当配置者这些步骤都会自动操作。(包括第一步、第二步、第三步)配置者会持续扫描未配置的节点,然后根据之前配置过的节点地址来递增配置。

第二步:使用nRF Mesh来绑定节点

将蓝牙MESH节点与nRF mesh移动应用绑定,请完成以下步骤:
1、在服务器节点上,将相应示例中指定的服务器模型实例与相同的APP KEY绑定:

  1. 点击服务器节点名称。打开节点配置菜单。
  2. 在展开的元素部分中,点击模型实例名。
  3. 在绑定APP KEY键的区域,点击绑定APP KEY的按钮,然后点击APP KEY字段。密钥现在被绑定了。

2、每个服务器板节点重复执行步骤1。
3、在客户端节点上,将对应示例中指定的客户端模型实例与相同的APP KEY绑定:

  1. 在提供的节点列表中,点击客户端节点名称。打开配置菜单。
  2. 在展开的元素部分中,点击第一个客户机模型实例名。
    3.在绑定APP KEY的区域,点击绑定APP KEY的按钮,然后点击APP KEY字段。密钥现在被绑定了。

4、应用程序返回到模型实例菜单。

这一步骤主要是绑定APP KEY。server和client必须是保持一致才能互相通信。

第三步:使用nRF Mesh设置发布和订阅

通过nRF Mesh移动应用设置节点间的发布规则,需要完成以下步骤:
1、在客户端节点上,在客户端模型实例菜单的发布部分,点击设置发布
2. 点击发布地址字段。出现一个下拉菜单。
3. 选择以下地址类型之一,设置客户端模型的发布地址:

  • 单播地址 – 您需要完成以下步骤:
  1. 单击“确定”。提供任何服务器节点的地址注明@ref nrf-mesh-mobile-app-provisioning“在配置过程的末尾”。
  2. 应用更改。—分组—您需要完成以下步骤:
    ①. 分组。选择要订阅的现有组或创建一个新组。
    ②. 应用客户机节点的更改。
  3. 在服务器节点上,将服务器模型实例菜单的订阅地址设置为所选组地址。
  4. 对服务器节点应用更改。

4、如果您正在评估传感器示例,那么也为服务器节点配置publish,如[传感器示例页面](@ref fast_cadence_example_testing_app)所述。服务器节点的配置步骤与客户端节点的步骤1-3相同(切换服务器和客户端角色)。

1、客户端的发布地址和服务器的订阅地址需要一致,服务器的发布地址和客户端的订阅地址需要一致。 2、一旦你用nRF
Mesh完成了发布和订阅的设置,你就可以开始与这些板子交互了,就像在每个示例页面的相关部分中描述的那样。

五、真机配置

1、provisioner使用nrf5_SDK_for_Mesh_v5.0.0_src\examples\provisioner程序来自动配置
2、client使用nrf5_SDK_for_Mesh_v5.0.0_src\examples\light_switch\client程序
3、server使用nrf5_SDK_for_Mesh_v5.0.0_src\examples\light_switch\server程序

1、client

①、mesh_stack_provisioning_data_store() //函数是最开始配置的,配置的项目主要是起始地址和netkey、devkey,netkey地址是配置器根据随机数计算出来的整个网络公用一个,devkey是每个设备有一个不能重复,都是配置者决定的,是随机的。
②、handle_composition_data_get () //函数主要是返回给配置者一些厂商ID\版本ID\重放保护缓存的大小等自身支持的信息。能走到这一步必须是通过了OOB验证的。
③、handle_appkey_add() // 添加APPKEY,保存到flash中
④、handle_model_app_bind_unbind () // 添加服务(模型)绑定,主要是绑定模型句柄,以便使用的时候能识别是否合法,是否注册绑定。(执行了三次)

1、将元素地址0x100的模型ID=0x0002绑定appkey_handle=0,model_handle=1 //运行状况服务器模型的模型ID
2、将元素地址0x101的模型ID=0x1001绑定appkey_handle=0,model_handle=2 //通用的onoff客户端模型id。
3、将元素地址0x102的模型ID=0x1001绑定appkey_handle=0,model_handle=3 //通用的onoff客户端模型id

⑤、handle_config_model_publication_set () // 添加模型的发布地址(执行了三次)

1、将元素地址0x0100上的运行状况服务器的’发布’地址设置为 0x0001, model_handle:0x1,
publish_address_handle:0xFFFF
2、将元素地址0x0101上的Generic OnOff客户端的’发布’地址设置为0xC003, model_handle:0x2, publish_address_handle:0xFFFF (客户端发布组地址奇数)
3、将元素地址0x0102上的Generic OnOff客户机的’发布’地址设置为0xC002, model_handle:0x3, publish_address_handle:0xFFFF (客户端偶数发布组地址)

⑥、handle_config_model_subscription_add () // 添加模型的订阅地址(执行了两次)

1、将元素地址0x0101上的Generic OnOff客户端的订阅地址设置为0xC005, model_handle:0x2, subaddress:0x2
2、将元素地址0x0102上的Generic OnOff客户端的订阅地址设置为0xC004, model_handle:0x3, subaddress:0x4

> //通过以上步骤client就已经在这个网络中准备好了,他能接收同一netkey和同一appkey下发布地址为0xC005和0xC004的设备发布的信息,他能发送给0xC003和0xC002设备信息。
#define GENERIC_ONOFF_CLIENT_MODEL_ID 0x1001			/** 通用的onoff客户端模型id */			//通过access_model_add函数绑定的
#define HEALTH_SERVER_MODEL_ID        0x0002			/** 运行状况服务器模型的模型ID */			//客户端是provisioner(配置器)0x0003
#define CONFIG_SERVER_MODEL_ID  	  0x0000			/** 配置服务器型号ID。*/					//客户端是provisioner(配置器)0x0001

2、server

1、mesh_stack_provisioning_data_store 函数是最开始配置的,配置的项目主要是起始地址和netkey,netkey地址是配置器根据随机数计算出来的。
2、handle_composition_data_get 函数主要是返回一些厂商ID\版本ID\重放保护缓存的大小等自身支持的信息。
3、handle_appkey_add 添加APPKEY,保存到flash中
4、handle_model_app_bind_unbind 添加服务(模型)绑定,主要是绑定模型句柄,以便接收的时候能识别是否合法,是否注册绑定。(执行了四次)

1、将元素地址201的模型ID=0x0002绑定appkey_handle=0,model_handle=1 //运行状况服务器模型的模型id。
2、将元素地址201的模型ID=0x1000绑定appkey_handle=0,model_handle=2 //通用onoff服务器模型id
3、将元素地址201的模型ID=0x1203绑定appkey_handle=0,model_handle=4 //场景服务器型号id
4、将元素地址201的模型ID=0x1204绑定appkey_handle=0,model_handle=5 //场景设置服务器模型id

5、handle_config_model_publication_set //根据之前绑定的模型来确定现在添加的是谁的发布地址。(执行了四次)

1、将元素地址0x201上的运行状况服务器的’发布’地址设置为 0x0001,model_handle:0x1
2、将元素地址0x201上的通用onoff服务器的’发布’地址设置为 0xC004,model_handle:0x2
3、将元素地址0x201上的场景服务器模型的’发布’地址设置为 0xC004,model_handle:0x4
4、将元素地址0x201上的场景设置服务器模型的’发布’地址设置为 0xC004,model_handle:0x5

6、handle_config_model_subscription_add //根据之前绑定的模型来确定现在添加的是谁的订阅地址。(执行了三次)

1、将元素地址0x201上的通用onoff服务器的’订阅’地址设置为 0xC002,model_handle:0x2,subaddress:0x2
2、将元素地址0x201上的场景服务器模型的’订阅’地址设置为 0xC002,model_handle:0x4, subaddress:0x2
3、将元素地址0x201上的场景设置服务器模型的’订阅’地址设置为 0xC002,model_handle:0x5, subaddress:0x2

7、配置器会针对服务器会配置两种类型地址,一种发布地址是0xC005,订阅地址是0xC003, 一种发布地址是0xC004,订阅地址是0xC002,(上述一种)这两种在发送给客户端的时候无区别,因为客户端配置了两个订阅地址分别是0xC004和0xC005,但是客户端发送的时候就会有一个接收不到,因为客户端有两个发布地址是可以切换的。

8、在access_incoming_handle函数中回来会扫描所有模型,查看当前接收到的数据时候有效,并且模型是否绑定,然后执行对应的模型回调函数。例如开关灯的回调函数是在generic_onoff_server_init()注册,具体函数数组是m_opcode_handlers,根据对应的操作码来执行对应的函数。
9、如果本设备没有订阅对应的发布地址就会收不到任何消息连access_incoming_handle函数都进不去。

#define SCENE_SERVER_MODEL_ID 			0x1203		/** 场景服务器型号id */					//通过access_model_add函数绑定的
#define SCENE_SETUP_SERVER_MODEL_ID 	0x1204		/** 场景设置服务器模型id */
#define GENERIC_ONOFF_SERVER_MODEL_ID 	0x1000		/** 通用onoff服务器模型id */
#define GENERIC_DTT_SERVER_MODEL_ID 	0x1004		/** 通用DTT服务器型号id */
#define HEALTH_SERVER_MODEL_ID          0x0002		/** 运行状况服务器模型的模型ID。 */		//客户端是provisioner(配置器)0x0003
#define CONFIG_SERVER_MODEL_ID  		0x0000		/** 配置服务器型号ID。 */				//客户端是provisioner(配置器)0x0001

3、provisioner

/**本例中使用的组地址数目。 */
#define GROUP_ADDR_COUNT             (4)

#define CLIENT_PUB_GROUP_ADDRESS_EVEN (0xC002)
#define CLIENT_PUB_GROUP_ADDRESS_ODD  (0xC003)

#define SERVER_PUB_GROUP_ADDRESS_EVEN (0xC004)
#define SERVER_PUB_GROUP_ADDRESS_ODD  (0xC005)

#define PROVISIONER_ADDRESS           (0x0001)
#define CLIENT_INITIAL_ADDRESS        (0x0100)
#define ONOFF_SERVER_INITIAL_ADDRESS  (0x0201)
#define LEVEL_SERVER_INITIAL_ADDRESS  (0x0301)
#define LL_SERVER_INITIAL_ADDRESS     (0x0401)
#define LC_SERVER_INITIAL_ADDRESS     (0x0501)
#define CTL_SERVER_INITIAL_ADDRESS    (0x0601)
#define CTL_LC_SERVER_INITIAL_ADDRESS (0x0701)
#define SENSOR_INITIAL_ADDRESS        (0x0801)




//使用到的模型ID:
#define CONFIG_CLIENT_MODEL_ID  0x0001					/** 配置客户端模型id */						//通过 access_model_add 函数绑定的
#define CONFIG_SERVER_MODEL_ID  0x0000					/** 配置服务器型号ID。 */
#define HEALTH_CLIENT_MODEL_ID  0x0003					/** 运行状况客户端模型的模型ID。 */
#define HEALTH_SERVER_MODEL_ID  0x0002					/** 运行状况服务器模型的模型ID。 */

两个主要的函数:
prov_evt_handler() //配置事件
config_step_execute() //配置步骤执行

附:
nRF5 SDK for Mesh地址:https://www.nordicsemi.com/Products/Development-software/nRF5-SDK-for-Mesh/Download?lang=en#infotabs
nRF MESH安卓app:https://download.csdn.net/download/qq_40537092/57057462
BLE MESH组网(一)简介BLE MESH组网(二)友谊功能和设备管理BLE MESH组网(三)普通BLE如何添加到网络BLE MESH组网(四)安全概述BLE MESH组网(五)配置BLE MESHBLE MESH组网(六)配置BLE MESH