Ble Mesh技术(十二)之Provisioning

本文详细解析了蓝牙Mesh网络中未配网设备如何通过配网者进行配网的过程,包括配网数据格式、链路建立流程以及配网流程的四个阶段。深入探讨了ProvisioningPDUs消息类型及其参数,OOB授权机制,以及配网数据的加密传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任何一个出厂的mesh设备是一个未配网设备(Unprovisioned Device),需要使用配网者(Provisioner)对未配网设备进行配网,使其成为mesh网络中的一个节点。要使未配网设备成为一个节点,需要配网者为其分配一个NetKey(表示该设备属于哪一个子网),一个IV Index(表示该设备是有效的),一个Unicast Address(作为该节点的唯一标识)。配网的流程其实就是配网者如何安全有效不冲突地将这些数据下发给未配网设备。

1. 配网数据格式

配网有两种方式,一种是通过ADV广播的方式进行配网(PB-ADV),另一种是通过GATT连接的方式进行配网(PB-GATT)。

1.1. Unprovisioned Beacon

任意一个未配网设备上电后都会无限制地发送未配网Beacon(Unprovisioned Beacon),表明他期待配网者让他加入网络。未配网Beacon的数据格式如下:
unprovisionbeacon

FieldSize(octets)Description
Length1表示后面数据的长度
AD Type1Mesh Beacon类型
Beacon Type10x00,表示当前Beacon类型为未配网Beacon
Device UUID16设备唯一标识符
OOB Information2该设备支持的带外通信方式
URI Hash4URI的前4位,作为带外信息的Public Key,此域为可选项

未配网设备除了发送Unprovisioned Beacon外,还会广播一个单独的不可连接广播包,里面包含了Uniform Resource Identifier(URI),配网者可以使用这个URI值作为公钥与设备通信。Beacon中的URI hash字段表示应该使用哪个URI值,其中:
U R I _ H a s h = s 1 ( U R I _ D a t a ) [ 0 − 3 ] URI\_Hash =s1(URI\_Data)[0-3] URI_Hash=s1(URI_Data)[03]
OOB Info域一共16个bit位,每个位代表的含义如下:

BitDescription
0Other
1Electronic/URI
22D machine-readable code
3Bar code
4Near Field Communication(NFC)
5Number
6String
7RFU
8RFU
9RFU
10RFU
11On box
12Inside box
13On piece of paper
14Inside manual
15On device
1.2. PB-GATT

手机端通过GATT连接的方式进行配网,数据通过proxy协议交互,Proxy PDU格式的Message Type设置为0x03,表示之后的Data域为Provisioning PDUs

1.3. PB-ADV

通过ADV的方式进行配网,数据格式如下:
PB-adv

FieldSize(octets)Description
Length1表示后面数据的长度
AD Type1PB-ADV类型
Link ID4链路的标识符
Transaction Number1事务的标识符
Generic Provisioning PDU1-24配网PDU

可以看到ADV配网PDU的最大长度仍为31字节。
每一条独立的配网PDU具有不同的Transaction Number,但是分段消息的不同分段具有相同的Transaction Number。
配网者发送的Provisioning PDU中的Transaction Number范围为0x00-0x7F。0x7F的下一个TN为0x00。
未配网设备发送的Provisioning PDU中的Transaction Number范围为0x80-0xFF。0xFF的下一个TN为0x80。
在PB-ADV中最后一个字段为Generic Provisioning PDU,其详细的数据格式如下:
geneprovpdu

FieldSize(octets)Description
Generic Provisioning Control1-17配网数据控制域
Generic Provisioning Payload0-64配网数据载荷

可以看出实际的Generic Provisioning PDU会大于24字节,因此这里会有分段的行为。
Generic Provisioning PDU共有四种形式:

① Transaction Start

表示开始传输分段消息,其数据格式如下:
transstart

FieldSize(bits)Description
SegN6最后一个分段的分段号
GPCF20b00,表示这条消息为Transaction Start消息
TotalLength16Provisioning PDU的大小
FCS8Frame Check Sequence
Data ≥ 8 \geq8 8Provisioning PDU的第一个分段
② Transaction Acknowledgment

用于响应Provisioning PDU消息,其数据格式如下:
transack
Padding=0b000000,GPCF=0b01,Data域为空。

③ Transaction Continuation

表示传输分段消息附加段,其数据格式如下:
transcontinuation

FieldSize(bits)Description
SegmentIndex6当前分段的分段号
GPCF20b10,表示这条消息为Transaction Continuation消息
Data ≥ 8 \geq8 8Provisioning PDU的分段载荷
④ Transaction Bearer Control

用于管理承载层的会话,即建立配网者与未配网设备的通道,其数据格式如下:
transcontrol

FieldSize(bits)Description
BearerOpcode6控制消息的操作码
0x00:Link Open
0x01:Link ACK
0x02:Link Close
0x03-0x3F:RFU
GPCF20b11,表示这条消息为Transaction Bearer Control消息
ParametersvariableControl消息的参数

Control消息有以下三种:

A. Link Open

配网者发起,要求与未配网设备建立一个链接,设备收到后需要响应一个Link Ack消息,一个设备只能同时处理一个Link(??),因此在Link存在期间,无视Link Open消息。其数据格式如下:
linkopen
Device UUID为配网者选择的设备的UUID。

B. Link ACK

未配网设备收到配网者的Link Open消息后,响应的消息。数据格式如下:
linkack

C. Link Close

配网者和未配网设备都可发起,该消息至少发送三次,不需要ack。用于告知对端链路关闭,当前配网流程结束及配网的结果。
其数据格式如下:
linkclose
参数域为关闭原因,其具体含义如下:

Reason ValueReasonNotes
0x00Success配网成功
0x01Timeout配网超时
0x02FailControl配网失败
0x03-0xFFUnrecognized未定义的原因
1.4. Provisioning PDUs

PB-ADV通过Transaction Start/Acknowledgment/Continuation/Bearer Control来进行链路的建立和分段数据的发送,同样的功能PB-GATT使用Proxy协议来实现。两种方法的最终目的是为了传输Provisioning PDUs,来进行配网数据的交换。
Provisioning PDUs的消息格式如下:
provpdus

FieldSize(bits)Description
Padding20b00
Type6Provisioning PDUs的类型
0x00:Provisioning Invite
0x01:Provisioning Capabilities
0x02:Provisioning Start
0x03:Provisioning Public Key
0x04:Provisioning Input Complete
0x05:Provisioning Confirmation
0x06:Provisioning Random
0x07:Provisioning Data
0x08:Provisioning Complete
0x09:Provisioning Failed
0x0A-0xFF:RFU
ParametersvariableProvisioning PDUs的消息参数

配网PDU根据功能不同分为以下几种类型。

① Provisioning Invite

配网者发起,表明配网程序开始。
invite
参数Attention Duration为Attention Timer state,表示未配网设备收到后需要用多长的时间来表征自己。
其值含义如下:

ValueDescription
0x00Attention Timer关闭
0x01-0xFFTimer开启的剩余时间,单位1s
② Provisioning Capabilities

未配网设备发送此消息告诉配网者当前节点支持的配网功能。
capabilities

FieldSize(octets)Notes
Number of Elenments1当前设备有多少个元素,取值范围为0x01-0xFF。配网者可以通过此字段计算出下一个未配网设备的首元素地址
Algorithms2支持的算法
algorithm
Public Key Type1支持的Public Key类型
pkooba
Static OOB Type1支持的Static OOB类型
sooba
Output OOB Size1设备支持的最大Output OOB的长度
0x00:不支持output OOB
0x01-0x08:设备支持的最大Output OOB的长度
0x09-0xFF:RFU
Output OOB Action2设备支持的Output OOB的行为
outaction
Input OOB Size1设备支持的最大Input OOB的长度
0x00:不支持Input OOB
0x01-0x08:设备支持的最大Input OOB的长度
0x09-0xFF:RFU
Input OOB Action2设备支持的Input OOB的行为
inputaction
③ Provisioning Start

配网者发送此消息告诉未配网设备选择的配网方式。
start

FieldSize(octets)Notes
Algorithms1使用的算法
0x00:使用FIPS P-256 Elliptic Curve
0x01-0xFF:RFU
Public Key1是否使用Public Key
0x00:不使用OOB Public Key
0x01:使用OOB Public Key
0x02-0xFF:无效值
Authentication Method1授权方式选择
0x00:使用No OOB方式授权
0x01:使用Static OOB方式授权
0x02:使用Output OOB方式授权
0x03:使用Input OOB方式授权
0x04-0xFF:无效值
Authentication Action1授权行为
若授权方式为No/Static OOB,Action=0x00。
若授权方式为Output OOB,取值含义如下:
0x00:Blink
0x01:Beep
0x02:Vibrate
0x03:Output Numeric
0x04:Output Alphanumeric
0x05-0xFF:RFU
若授权方式为Input OOB,取值含义如下:
0x00:Push
0x01:Twist
0x02:Input Numeric
0x03:Input Alphanumeric
0x04-0xFF:RFU
Authentication Size1授权码的长度
若授权方式为No/Static OOB,Size=0x00。
若授权方式为Output/Input OOB,取值含义如下:
0x00:无效
0x01-0x08:授权码长度
0x09-0xFF:RFU
④ Provisioning Public Key

配网者发送此消息,传输Public Key。
publickey

⑤ Provisioning Input Complete

未配网设备发送此消息,表明Input操作完成,参数域为空。
inputcom

⑥ Provisioning Confirmation

发送给对端的OOB授权码数据。
confirmation

Output OOB方式:未配网设备展示授权码,配网者输入授权码,配网者响应Confirmation消息。
Input OOB方式:配网者展示授权码,未配网设备输入授权码,未配网设备响应Input Complete消息,然后配网者响应Confirmation消息。

⑦ Provisioning Random

发送给对端的随机值认证确认信息。
random
未配网设备收到配网者发送的Confirmation信息,然后响应Confirmation信息回配网者,此时配网者收到后发送Random消息,未配网设备收到后验证Confirmation信息,验证完毕后再响应Random消息回配网者,然后配网者也进行Confirmation的验证操作。

⑧ Provisioning Data

配网者传递给未配网设备的配网信息。
配网信息中Provisioning Data主要有以下信息:
data

FieldSize(Octets)Notes
Network Key16配网者分配的NetKey
Key Index2NetKey对应的Index值
Flags1网络更新状态的标志位
Key Refresh Flag=0:表示当前网络处于Key Refresh Phase 0。
Key Refresh Flag=1:表示当前网络处于Key Refresh Phase 2。
IV Update Flag=0:表示当前网络未进行IV Update。
IV Update Flag=1:表示当前网络正在进行IV Update。
IV Index4当前的IV Index值
Unicast Address2配网者分配的首元素的单播地址
⑨ Provisioning Complete

未配网设备发送此消息表明配网成功。参数域为空。
complete

⑩ Provisioning Failed

未配网设备发送此消息表明配网失败。参数域为失败原因。
failed

ValueNameDescription
0x00Prohibited无效值
0x01Invalid PDU配网的PDU不能识别
0x02Invalid Format数据设置为无效值
0x03Unexpected PDU配网流程中未收到期待的消息类型
0x04Confirmation Failed计算的确认值未通过验证
0x05Out of Resources设备资源不足
0x06Decryption Failed数据解密失败
0x07Unexpected Error未覆盖到的错误类型
0x08Cannot Assign Addresses连续的单播地址不能被分配
0x09-0xFFRFUReserved for Future Use

2. 配网流程

2.1 链路建立流程

PV-ADV在交换配网数据之前需要建立一个链接(Link),使用Transaction Bearer Control消息来建立链路。未配网设备发出的Unprovisioned Beacon里面包含了UUID等信息,配网者收到多个Unprovisioned Beacon后,需要选择一个设备,然后开始配网,选择了这个设备的第一件事就是建立链路。链路建立的流程如下:
link establish
① 配网者选择一个Unprovisioned Beacon,然后向该设备发送一个Link Open消息,该消息带有该设备的Device UUID,并在PB-ADV的Link ID字段填上一个未使用的ID值。
② 未配网设备收到Link Open消息后,需要响应一个Link ACK消息,其消息的Link ID字段为接收的Link Open的Link ID。
③ Link通道建立完成后,两者之间进行配网流程。
④ 配网结束发送Link Close关闭通道。
每一个Generic Provisioning PDU发送时都要附加20-50ms的延时。对于分段消息,发送端通过Transaction StartTransaction Continuation发送所有分段,接收端收到所有分段后计算FCS,然后再响应Transaction Acknowledgment消息。

2.2 配网流程

未配网设备发送的Unprovisioned Beacon被配网者选中后,第一步是建立通道,通道建立完毕后便进行配网数据的分发。主要分为四个阶段,A、配网邀请B、Public Key交换C、OOB认证D、配网数据分发。其流程示意图如下:
provision1
provision2
① Link通道链路建立完成后,配网者发送Provisioning Invite PDU,未配网设备收到后开启Attention Timer,可以是闪灯,震动或者声音来提醒配网者你配置的是这个设备,接着再响应Provisioning Capabilities PDU告诉配网者,这个设备支持的配网方式。
② 配网者发送Provisioning Start PDU告诉设备配网端选择的配网方式,未配网设备收到此消息后,需要停止Attention Timer。Provisioning Start PDU选择的方式有选择最优的算法,OOB方式等。然后进入第二阶段Public Key交换。
③ 若设备的能力中不能通过OOB的方式传输Public Key,即Public Key Type域为0x00,此时配网者发送Provision Public Key消息,设备端收到后响应Provision Public Key消息,使两端交换Public Key。
④ 若设备能通过OOB的方式传输Public Key,比如NFC等,则配网者通过OOB的方式将Public Key传输至未配网设备端。
⑤ 设备端收到Public Key后,两端计算 E C D H S e c r e t ECDHSecret ECDHSecret值。接下来进入第三阶段OOB认证。
⑥ OOB认证有四种方式,当配网者选择No OOB认证的方式时,配网者发送Provisioning Confirmation消息,参数域为空,设备收到后响应Provisioning Confirmation消息,表示确认。
⑦ 当配网者选择Static OOB认证的方式时,配网者发送Provisioning Confirmation消息,参数域为Static授权数据,设备收到后响应Provisioning Confirmation消息,表示确认。
⑧ 当配网者选择Output OOB认证的方式时,收到Start PDU消息后,设备按照被选择的Output Action,做出相应的操作,比如闪灯,声音,震动,屏上显示数字或字符等,配网者将观察到的数据通过Provisioning Confirmation发送给未配网设备,设备收到并确认后响应Provisioning Confirmation消息。
⑨ 当配网者选择Input OOB认证的方式时,配网者发送完Start PDU后,在配网端显示授权信息,如屏幕显示数字或者字母等,设备端收到Start PDU后,弹框需要用户输入观察到的授权码,输入完毕后,通过Provisioning Input Complete消息发送给配网者告诉配网者这边输入完毕,配网者收到后发送Provisioning Confirmation发送给未配网设备,设备收到并确认后响应Provisioning Confirmation消息。
⑩ 配网者收到未配网设备响应的Provisioning Confirmation消息后,确认无误后,发送Provisioning Random消息,其参数域值为 C o n f i r m a t i o n P r o v i s i o n e r ConfirmationProvisioner ConfirmationProvisioner
⑪ 设备端收到Random消息后,验证无误后,响应Provisioning Random消息,其参数域值为 C o n f i r m a t i o n D e v i c e ConfirmationDevice ConfirmationDevice
⑫ 配网者收到后验证random值的有效性。开始进入第四阶段,配网数据的的分发。配网者发送Provisioning Data PDU,包含设备需要的配网信息,其中的信息通过授权后的数据信息进行加密传输。
⑬ 设备收到数据后,响应Provisioning Complete消息,配网结束。
⑭ 若配网期间出现错误,发送Provisioning Failed消息给对端,配网结束。
⑮ 配网结束后,发送Link Close消息关闭链路。

ECDHSecret值计算如下:
E C D H S e c r e t = P _ 256 ( p r i v a t e _ k e y , p e e r _ p u b l i c _ k e y ) ECDHSecret = P\_256(private\_key, peer\_public\_key) ECDHSecret=P_256(private_key,peer_public_key)
ConfirmationProvisioner和ConfirmationDevice值计算如下:
C o n f i r m a t i o n P r o v i s i o n e r =                   A E S _ C M A C C o n f i r m a t i o n K e y ( R a n d o m P r o v i s i o n e r ∣ ∣ A u t h V a l u e ) C o n f i r m a t i o n D e v i c e =                   A E S _ C M A C C o n f i r m a t i o n K e y ( R a n d o m D e v i c e ∣ ∣ A u t h V a l u e ) \begin{aligned} &ConfirmationProvisioner=\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ AES\_CMAC_{ConfirmationKey}(RandomProvisioner||AuthValue) \\ &ConfirmationDevice=\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ AES\_CMAC_{ConfirmationKey}(RandomDevice||AuthValue) \end{aligned} ConfirmationProvisioner=                 AES_CMACConfirmationKey(RandomProvisionerAuthValue)ConfirmationDevice=                 AES_CMACConfirmationKey(RandomDeviceAuthValue)
其中:
R a n d o m P r o v i s i o n e r 为 配 网 端 随 机 产 生 的 字 符 串 R a n d o m D e v i c e 为 设 备 端 随 机 产 生 的 字 符 串 A u t h V a l u e 为 通 过 O O B 读 取 的 授 权 值 C o n f i r m a t i o n K e y = k 1 ( E C D H S e c r e t , s 1 ( C o n f i r m a t i o n I n p u t s ) , " p r c k " ) C o n f i r m a t i o n I n p u t s = P r o v i s i o n i n g I n v i t e P D U V a l u e ∣ ∣ P r o v i s i o n i n g I n v i t e P D U V a l u e ∣ ∣                   P r o v i s i o n i n g I n v i t e P D U V a l u e ∣ ∣ P r o v i s i o n i n g I n v i t e P D U V a l u e ∣ ∣                   P r o v i s i o n i n g I n v i t e P D U V a l u e \begin{aligned} &RandomProvisioner为配网端随机产生的字符串\\ &RandomDevice为设备端随机产生的字符串\\ &AuthValue为通过OOB读取的授权值\\ &ConfirmationKey=k1(ECDHSecret,s1(ConfirmationInputs),"prck")\\ &ConfirmationInputs =ProvisioningInvitePDUValue||ProvisioningInvitePDUValue||\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ProvisioningInvitePDUValue||ProvisioningInvitePDUValue||\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ProvisioningInvitePDUValue \end{aligned} RandomProvisionerRandomDeviceAuthValueOOBConfirmationKey=k1(ECDHSecret,s1(ConfirmationInputs),"prck")ConfirmationInputs=ProvisioningInvitePDUValueProvisioningInvitePDUValue                 ProvisioningInvitePDUValueProvisioningInvitePDUValue                 ProvisioningInvitePDUValue

2.3 总结

配网者的功能就是产生一个Network Key,提供给节点Network Key,IV Index,Unicast Address,使其从未配网状态变成一个可使用的Mesh设备。其中流程中的OOB授权等都只是为了保证配网数据的安全。配网成功后则需要配置客户端进行进一步的配置。一般来说配网者和配置客户端为同一个设备。配网者也有属于自己的Device Key,但是配网者的Device Key只是用来与其他配网者之间的通信加密。配网者的Device Key通过OOB的方式交换,所有配网者之间的交互所使用的Device key需要统一协调管理。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值