Nordic Mesh启动配置过程介绍(PB-ADV)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处 https://blog.csdn.net/qq_21231413/article/details/89305449

一.启动配置过程

Provisioning用于向将要添加新设备提供它们加入网络所需的信息。在启动配置过程中,向新加入网络的设备提供一个网络密钥、一个单播地址和一个设备密钥,设备密钥用于provisioner和provisionee之间的私有通信(例如,在供应后配置设备时)。一个设备可以是provisioner也可以是provisionee

二.启动配置总过程图

初始化:
初始化步骤对于provison和provisionee都是通用的,它们都必须设置供应上下文,上下文维护provisioning流程的状态。配置状态是使用nrf_mesh_prov_init()函数初始化的,该函数需要启动配置上下文和其他相关作为参数:

  • 公钥和私钥:用于加密的密钥对。可以使用nrf_mesh_prov_generate_keys()函数对这些密钥进行预编程或生成。注意,这些数字必须是特定椭圆曲线上的点,这意味着常规随机数不能用作密钥对
  • OOB身份验证功能:用于确定可以与节点一起使用哪种身份验证。如果不使用身份验证,则必须只设置算法字段

PS:
请参考静态provisioner示例(/examples/light-switch/provisioner/src/provisioner_helper.c)中的prov_helper_supploner_init()。在使用provisioning堆栈之前,必须初始化并启用SoftDevice和mesh堆栈。请参考light   switch\server示例或任何其他节点角色的示例的main.c文件中的mesh_init()

认证:

  • provisioning过程为带外(OOB)身份验证提供了几种方法,用于验证所配置的设备确实是预期的设备
  • 静态身份验证是OOB身份验证的最简单形式,此时provisioner和provisioneee都有一个静态预编程密钥,该密钥在启动配置过程中得到验证。如果静态密钥在两个设备中都匹配,则身份验证成功
  • 输入/输出身份验证可用于具有输入/输出功能的设备。在provisioning过程中,一个设备是输入设备,另一个是输出设备。输出设备显示要输入的数字(例如,数字显示或闪烁灯光),用户必须将指定的值输入输入设备(例如,按下所需的按钮次数或通过键盘输入值)
  • 在接收到NRF_MESH_PROV_EVT_CAPS_RECEIVED事件时,provisioner选择使用哪种形式的身份验证。如果选择静态身份验证,应用程序将在provisioning过程的某个时刻接收NRF_MESH_PROV_EVT_STATIC_REQUEST事件,此时应用程序应该使用静态密钥数据调用nrf_mesh_prov_auth_data_provide()来响应这个事件。如果选择输入/输出身份验证,输入设备将接收NRF_MESH_PROV_EVT_INPUT_REQUEST事件,然后用户请求输入,并通过调用nrf_mesh_prov_auth_data_provide()将该输入提供给供应堆栈。输出设备将接收NRF_MESH_PROV_EVT_OUTPUT_REQUEST事件,然后应该向用户显示要输入的数据
     

provisionees设备:

静态身份验证的composonee行为由mesh_providonee_prov_start () API函数处理。但是如果需要,也可以使用provisioning API自己处理供应。下面的示例使用了静态身份验证,具体编程的步骤如下:

1、初始化启动配置的上下文
2、使用nrf_mesh_prov_listen()函数开始侦听传入的provisioning连接请求。此函数启动未配置的设备的beacon广播。该广播可以包括指向额外数据的URI和指定可以找到OOB身份验证数据的位置
3、当收到配置邀请时,NRF_MESH_PROV_EVT_INVITE_RECEIVED事件被传递给应用程序。当nrf_mesh_prov_evt_invite_received_t中的成员attention_duration_s被设置为非零值,设备可以使用任何可能的方法来标识自己。当attention timer超时时,设备停止识别自己。连接请求将被设备自动接受
4、当准备过程启动时,NRF_MESH_PROV_EVT_START_RECEIVED事件被传递给应用程序,设备应该停止标识自身
5、建立连接后,NRF_MESH_PROV_EVT_LINK_ESTABLISHED事件将传递给应用程序
6、如果使用用了静态身份验证,则将NRF_MESH_PROV_EVT_STATIC_REQUEST事件传递给应用程序。应用程序应该使用静态身份验证数据进行响应,方法是通过nrf_mesh_prov_auth_data_provide()函数将其传递到堆栈。注意,静态身份验证数据总是16字节长
7、当接收到NRF_MESH_PROV_EVT_COMPLETE事件时,表示配置成功。此事件提供设备的provisioning数据和设备密钥。接收到的provisioning数据必须输入到设备状态管理器中,以供访问层模块使用。此时,设备可以通过配置模型从provisioner程序接收进一步的配置。只要配置模型服务器已经初始化,配置就会在后台自动发生(有关如何进行操作的示例,请参阅Light switch示例)

provisioner设备:

provisioner是mesh中节点负责网络中其他节点的配置。通常,provisioner程序包含一个配置客户端和客户端节点,用于控制其他节点(如电灯或空调)中的特定功能。provisioner通常是网关设备的一部分,是在mesh网络和其他网络技术(如Internet)之间提供桥梁的设备。建立provisioner有两种主要方法: 以独立应用程序(独立provisioner程序)运行它, 或通过串行接口(串行供应程序)由主机应用程序控制

1、Standalone provisioners:
Standalone provisioners必须采取以下步骤来配置设备:

(1) 初始化启动配置的上下文
(2) 待未配置设备的广播beacon。当接收到beacon时,应用程序将接收nrf_mesh_prov_evt_unoned_received事件,该事件包含接收beacon的设备的UUID
(3) 使用nrf_mesh_prov_provisioning()函数与设备建立连接
(4) 当与未配置设备的成功连接时,NRF_MESH_PROV_EVT_LINK_ESTABLISHED事件被传递给应用程序
(5) 当接收到provisionee的带外身份验证功能时,将接收NRF_MESH_PROV_EVT_CAPS_RECEIVED事件。应用程序应该根据自己的功能来检查provisionee的功能,并决定进行哪种身份验证。使用nrf_mesh_prov_oob_use()函数选择要使用的身份验证方法
(6) 如果使用了静态身份验证,则将NRF_MESH_PROV_EVT_STATIC_REQUEST事件传递给应用程序。应用程序应该通过nrf_mesh_prov_auth_data_provide()函数将静态身份验证数据传递到堆栈来响应静态身份验证数据
(7) 当设备配置完成时,NRF_MESH_PROV_EVT_COMPLETE事件被传递给应用程序。此时,provisioner程序可以继续使用配置模型配置设备。有关如何进行配置的更多信息,请参考Light switch client示例

2、Serial provisioners:
Serial provisioners使用串行接口进行启动配置,允许主机控制器使用外部微控制器作为mesh中的“调制解调器”与mesh网络进行交互。在这种情况下,主机控制器存储关于网络上节点的信息,从而释放外部微控制器中的RAM。在这种情况下,mesh网络的大小仅受主机中可用资源的限制。创建Serial provisioners应用程序的步骤如下:

(1) 像往常一样初始化SoftDevice和mesh堆栈
(2) 使用nrf_mesh_serial_init()和nrf_mesh_serial_enable() API函数初始化和启用串行接口
(3) 然后,可以使用Standalone provisioners下描述的过程来配置设备,用串行命令替换API调用,用串行事件替换事件

3、 ECDH offloading:
ECDH(椭圆曲线Diffie-Hellman)是一种加密算法,用于在两个设备之间安全地创建共享的秘密。它用于创建一个加密密钥,然后用于在provisioning数据传输到provisionee时保护provisioning数据。如果并行运行多个provisioners程序,应该启用ECDH卸载。ECDH是一种处理器密集型算法,很容易成为瓶颈。ECDH卸载是一个功能,它允许主机处理器计算ECDH共享的秘密,同时释放目标处理器中的CPU资源。可以通过在初始化设备时调用mesh_opt_prov_ecdh_offloading_set函数来启用ECDH卸载

4、 Remote provisioning:
远程配置Remote provisioning( PB-Remote)允许provisioner程序配置其无线电范围之外的设备。这是通过使用mesh节点将供应消息转发到要配置的设备范围内的来实现的,PB-Remote功能由PB-Remote客户端和服务器模型提供的

5、Errors:
如果provisioning过程中发生错误,连接接将被关闭。将NRF_MESH_PROV_EVT_LINK_CLOSED事件传递给应用程序。如果在NRF_MESH_PROV_EVT_COMPLETE事件之前接收到NRF_MESH_PROV_EVT_LINK_CLOSED事件,则必须认为配置过程已经失败。NRF_MESH_PROV_EVT_LINK_CLOSED事件还包含nrf_mesh_prov_evt_link_closed_t中成员close_reason参数,可用于确定provisioning失败的原因

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/89305449
今日推荐