配网流程
* Beacon(信标)广播:未配网设备广播配网的信标包(Unprovisinerd Device Beacon 即UDB)。
配网器provisioner通过标准的BLE SCAN(扫描)接收广播的信标包,并通过beacon包中UUID来判断对应需配网的设备。
(用户可能需要根据制造商的说明,按照一定的流程,例如键入一组按钮,或将某一按钮长按一段时间等方式启动未配网设备的广播)
用户还需要在provisioner设备中启动“添加设备到网络”的流程,以便接收广播的数据包。需要记住的一点是,provisioner设备可能是智能手机或平板电脑应用,因此在实际操作中会涉及到智能手机解锁、应用程序启动、也许还需要登录应用程序(为了进一步确保安全性),并通过其用户界面启动Beacon设备搜寻。这样,provisioner设备就会意识到新设备的存在和准备就绪状态,可进入后续的启动配网流程。
* 邀请(Invitation):信标阶段结束以后,配网器和未配网设备通过PB-ADV或者PB-GATT进行了初步的接触,接下来配网器会发送一个配网邀请(provisioning invite) PDU,未配网设备就会相应的发一个响应包(provisioning capability PDU),包含自身的信息。(这些信息将用于认证(Authentication)步骤)
* 交换公共密钥(Exchange Public Keys):配网设备将与待配网的设备交换公共密钥,来创建安全通道,以完成剩余的配网流程。
蓝牙mesh 协议规定在交换公钥阶段,可以使用两种算法交换设备的 ECDH 公共密钥:通过蓝牙通道进行明文交换,通过OOB 隧道进行交换。在邀请阶段,设备会告知配网器是否存在 OOB 公钥,而配网器在交换公钥的第1条信息中,则告知设备是否使用 OOB 公钥。使用 OOB 公钥交互方式可以较为可靠地预防中间人攻击,对安全性有很大的提升。
配网开始消息是配网器告诉未配网设备公钥交换流程开始,配网需从前面的provisioning Capabiliy (配网能力) 消息中选择公钥交换流程的具体參数。
* 认证(Authentication):配网设备会基于对新设备功能的了解,向其发送消息,指示其输出单一或多位数值,即对其所支持的多种用户操作(例如按下按钮)作出响应;响应正确后,待配网设备和配网设备交换密码散列。
在此步骤中,配网器使用所选的验证方法,对未配网设备进行验证。有三种可用的验证方法(OOB, Out-Of-Band):输出OOB(Output OOB)、输入OOB(Input OOB)、以及静态OOB(Static OOB)或无OOB(No OOB)。
输出带外(Output OOB)
若选择的是输出带外(Output OOB)验证方法,则未经启动配置设备会选择一个随机数,并通过与其功能兼容的方式输出该数字。例如,如果未经启动配置设备是一个灯泡,则它能够闪烁指定的次数。如果设备具有LCD屏幕,则可以将随机数显示为多位数值。启动配置设备(Provisioner)的用户需要输入观察到的数字,来验证未经启动配置的设备。输出带外验证方法的工作流程如图1所示。
输入随机数后,启动配置设备(Provisioner)生成并检查确认值。无论采用哪种验证方式,整个验证步骤中的检查确认值(check confirmation value)计算方式都是相同的,请继续往下看。
输入带外(Input OOB)
输入带外(Input OOB)验证方法与输出带外(Output OOB)方法类似,但设备的角色相反。启动配置设备(Provisioner)生成并显示随机数,然后提示用户采取适当的操作,将随机数输入未经启动配置的设备。以照明开关为例,用户可以在一定时间内数次按下按钮,以这种形式输入随机数。
与输出带外验证(Output OOB)相比,输入带外(Input OOB)方法需要发送一个附加的启动配置协议PDU。在完成认证操作之后,未经启动配置的设备向启动配置设备发送一个启动配置输入完成PDU(Provisioning Input Complete PDU),通知其随机数已输入完成。随后进入到执行检查确认值操作的步骤。
静态带外(Static OOB) 或无带外(No OOB)
在输入带外或输出带外都不可用的情况下,启动配置设备(Provisioner)和未经启动配置的设备可采用静态带外(Static OOB)验证或无带外(No OOB)验证:采用静态OOB信息;或静态OOB信息不可用,直接以数值0代替。在此情况下,启动配置设备和未经启动配置的设备各自生成一个随机数,然后进行检查确认值操作。
检查确认值(Check Confirmation Value)
无论采用何种验证方法,都会进行确认值生成和检查。根据蓝牙mesh规格,启动配置设备(Provisioner) 和未经启动配置设备应分别计算确认值。这两个值被称为ConfirmationProvisioner和ConfirmationDevice。这两个值的计算都使用一系列相同的函数,不同之处仅在于所使用的随机数输入。
确认值检查(Confirmation Value Check)
如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner不匹配,则启动配置(Provisioning)过程将被中止。
如果由未经启动配置设备计算所得的确认值与接收到的ConfirmationProvisioner匹配,则未经启动配置设备将其RandomDevice值发送给启动配置设备。
然后,启动配置设备(Provisioner) 使用相同的过程来重新计算确认值,并通过比较计算所得值与先前接收值来进行验证。
如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice不匹配,则启动配置(Provisioning)流程将被中止。
如果由启动配置设备(Provisioner) 计算所得的确认值与接收到的ConfirmationDevice匹配,则表示验证成功。后续只要启动配置设备(Provisioner)和未经启动配置设备完成启动配置流程的第五步:启动配置数据分发,则未经启动配置设备就能成为蓝牙mesh网络中的节点(node)。
* 分发配网数据 (Distribution Of Provisioning Data): 认证成功完成之后,使用交换公开密钥获得ECDHSecret以及认证通过后,通过k1算法获得会话密钥(Session Key)。随后,用这个session key交换Provisioning Data,包括网络密钥(NetKey)和设备的唯一地址,即单播地址(Unicast Address),密钥索引, IV索引,标志。
配置过程
Composition Data
网关发到mesh节点的Composition Data 数据定义元素个数以及元素下model个数与model-id数据结构如下:
* features中定义了节点的特征:
Role:定义扮演的mesh角色,一种是device角色,一种是provisioner角色,前者是被配置设备,后者是下发配置的设备。
Relay:置一表示支持中继角色
Proxy:置一表示支持代理角色
Fn:置一表示支持friend角色
Lpn:置一表示支持低功耗角色
Prov:置一表示在系统开始后会先广播入网配置广播(PB-GATT)
Snb:置一表示状态可以被config beacon改变
Bg_scan:置一表示在系统开始后会进行扫描
* SIG-MODEL定义说明:
一个节点默认的sig-model包含(model-ID 为16位):
Configuration Server model (ID = 0x0000):用于参数配置
订阅发布设置
心跳设置
中继设置
以及一下其他设置,具体参考model操作码和mesh协议规定格式
Health Server mode (ID = 0X0002):用于设备健康状态上报
用户还可以添加官方其他的sig-model 实现自定义应用
注: 配网阶段:provisioner为设备分配单播(mesh)地址和netkey;配置阶段:使用DevKey,provisioner为节点配置发布地址,订阅地址等(可选的配置),配置完成后,节点元素使用netkey(用于网络层安全,使相同netkey的节点在一个网络中,节点通过广播方式发布消息,若配置发布地址则发布消息到配置的地址A;若节点未配置订阅地址A则该节点就不能处理该消息),AppKey(用于保护应用层消息,仅用于provisioner(配置者)与provisionee(被配置者)之间进行私有通信,即再次配置时使用)。
参考:
https://blog.csdn.net/qq_38531460/article/details/125509061