BLE MESH(三)
一、在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示例,请完成以下步骤:
- 擦除flash, 擦除开发板上的flash并对SoftDevice进行编程。
- 打开nRF Mesh移动应用程序。出现主应用程序窗口。
- 添加新节点。应用程序开始寻找未供应的节点并在屏幕上列出它们。
- 通过为每个节点完成以下步骤来提供每个节点:
- 点击节点名连接到它。
- 确定节点。
- 准备节点并选择所需的OOB选项。应用程序启动供应过程。完成后,您将收到一个通知。
- 当提供所有节点时,请注意服务器节点的地址。当@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绑定:
- 点击服务器节点名称。打开节点配置菜单。
- 在展开的元素部分中,点击模型实例名。
- 在绑定APP KEY键的区域,点击绑定APP KEY的按钮,然后点击APP KEY字段。密钥现在被绑定了。
2、每个服务器板节点重复执行步骤1。
3、在客户端节点上,将对应示例中指定的客户端模型实例与相同的APP KEY绑定:
- 在提供的节点列表中,点击客户端节点名称。打开配置菜单。
- 在展开的元素部分中,点击第一个客户机模型实例名。
3.在绑定APP KEY的区域,点击绑定APP KEY的按钮,然后点击APP KEY字段。密钥现在被绑定了。
4、应用程序返回到模型实例菜单。
这一步骤主要是绑定APP KEY。server和client必须是保持一致才能互相通信。
第三步:使用nRF Mesh设置发布和订阅
通过nRF Mesh移动应用设置节点间的发布规则,需要完成以下步骤:
1、在客户端节点上,在客户端模型实例菜单的发布部分,点击设置发布。
2. 点击发布地址字段。出现一个下拉菜单。
3. 选择以下地址类型之一,设置客户端模型的发布地址:
- 单播地址 – 您需要完成以下步骤:
- 单击“确定”。提供任何服务器节点的地址注明@ref nrf-mesh-mobile-app-provisioning“在配置过程的末尾”。
- 应用更改。—分组—您需要完成以下步骤:
①. 分组。选择要订阅的现有组或创建一个新组。
②. 应用客户机节点的更改。 - 在服务器节点上,将服务器模型实例菜单的订阅地址设置为所选组地址。
- 对服务器节点应用更改。
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 MESH
BLE MESH组网(六)配置BLE MESH