任何一个出厂的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的数据格式如下:

Field Size(octets) Description
Length 1 表示后面数据的长度
AD Type 1 Mesh Beacon类型
Beacon Type 1 0x00,表示当前Beacon类型为未配网Beacon
Device UUID 16 设备唯一标识符
OOB Information 2 该设备支持的带外通信方式
URI Hash 4 URI的前4位,作为带外信息的Public Key,此域为可选项

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

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

1.2. PB-GATT

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

1.3. PB-ADV

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

Field Size(octets) Description
Length 1 表示后面数据的长度
AD Type 1 PB-ADV类型
Link ID 4 链路的标识符
Transaction Number 1 事务的标识符
Generic Provisioning PDU 1-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,其详细的数据格式如下:

Field Size(octets) Description
Generic Provisioning Control 1-17 配网数据控制域
Generic Provisioning Payload 0-64 配网数据载荷

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

① Transaction Start

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

Field Size(bits) Description
SegN 6 最后一个分段的分段号
GPCF 2 0b00,表示这条消息为Transaction Start消息
TotalLength 16 Provisioning PDU的大小
FCS 8 Frame Check Sequence
Data ≥8\geq8≥8 Provisioning PDU的第一个分段
② Transaction Acknowledgment

用于响应Provisioning PDU消息,其数据格式如下:

Padding=0b000000,GPCF=0b01,Data域为空。

③ Transaction Continuation

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

Field Size(bits) Description
SegmentIndex 6 当前分段的分段号
GPCF 2 0b10,表示这条消息为Transaction Continuation消息
Data ≥8\geq8≥8 Provisioning PDU的分段载荷
④ Transaction Bearer Control

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

Field Size(bits) Description
BearerOpcode 6 控制消息的操作码
0x00:Link Open
0x01:Link ACK
0x02:Link Close
0x03-0x3F:RFU
GPCF 2 0b11,表示这条消息为Transaction Bearer Control消息
Parameters variable Control消息的参数

Control消息有以下三种:

A. Link Open

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

Device UUID为配网者选择的设备的UUID。

B. Link ACK

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

C. Link Close

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

参数域为关闭原因,其具体含义如下:

Reason Value Reason Notes
0x00 Success 配网成功
0x01 Timeout 配网超时
0x02 Fail Control配网失败
0x03-0xFF Unrecognized 未定义的原因

1.4. Provisioning PDUs

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

Field Size(bits) Description
Padding 2 0b00
Type 6 Provisioning 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
Parameters variable Provisioning PDUs的消息参数

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

① Provisioning Invite

配网者发起,表明配网程序开始。

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

Value Description
0x00 Attention Timer关闭
0x01-0xFF Timer开启的剩余时间,单位1s
② Provisioning Capabilities

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

Field Size(octets) Notes
Number of Elenments 1 当前设备有多少个元素,取值范围为0x01-0xFF。配网者可以通过此字段计算出下一个未配网设备的首元素地址
Algorithms 2 支持的算法
Public Key Type 1 支持的Public Key类型
Static OOB Type 1 支持的Static OOB类型
Output OOB Size 1 设备支持的最大Output OOB的长度
0x00:不支持output OOB
0x01-0x08:设备支持的最大Output OOB的长度
0x09-0xFF:RFU
Output OOB Action 2 设备支持的Output OOB的行为
Input OOB Size 1 设备支持的最大Input OOB的长度
0x00:不支持Input OOB
0x01-0x08:设备支持的最大Input OOB的长度
0x09-0xFF:RFU
Input OOB Action 2 设备支持的Input OOB的行为
③ Provisioning Start

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

Field Size(octets) Notes
Algorithms 1 使用的算法
0x00:使用FIPS P-256 Elliptic Curve
0x01-0xFF:RFU
Public Key 1 是否使用Public Key
0x00:不使用OOB Public Key
0x01:使用OOB Public Key
0x02-0xFF:无效值
Authentication Method 1 授权方式选择
0x00:使用No OOB方式授权
0x01:使用Static OOB方式授权
0x02:使用Output OOB方式授权
0x03:使用Input OOB方式授权
0x04-0xFF:无效值
Authentication Action 1 授权行为
若授权方式为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 Size 1 授权码的长度
若授权方式为No/Static OOB,Size=0x00。
若授权方式为Output/Input OOB,取值含义如下:
0x00:无效
0x01-0x08:授权码长度
0x09-0xFF:RFU
④ Provisioning Public Key

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

⑤ Provisioning Input Complete

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

⑥ Provisioning Confirmation

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

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

⑦ Provisioning Random

发送给对端的随机值认证确认信息。

未配网设备收到配网者发送的Confirmation信息,然后响应Confirmation信息回配网者,此时配网者收到后发送Random消息,未配网设备收到后验证Confirmation信息,验证完毕后再响应Random消息回配网者,然后配网者也进行Confirmation的验证操作。

⑧ Provisioning Data

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

Field Size(Octets) Notes
Network Key 16 配网者分配的NetKey
Key Index 2 NetKey对应的Index值
Flags 1 网络更新状态的标志位
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 Index 4 当前的IV Index值
Unicast Address 2 配网者分配的首元素的单播地址
⑨ Provisioning Complete

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

⑩ Provisioning Failed

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

Value Name Description
0x00 Prohibited 无效值
0x01 Invalid PDU 配网的PDU不能识别
0x02 Invalid Format 数据设置为无效值
0x03 Unexpected PDU 配网流程中未收到期待的消息类型
0x04 Confirmation Failed 计算的确认值未通过验证
0x05 Out of Resources 设备资源不足
0x06 Decryption Failed 数据解密失败
0x07 Unexpected Error 未覆盖到的错误类型
0x08 Cannot Assign Addresses 连续的单播地址不能被分配
0x09-0xFF RFU Reserved for Future Use

2. 配网流程

2.1 链路建立流程

PV-ADV在交换配网数据之前需要建立一个链接(Link),使用Transaction Bearer Control消息来建立链路。未配网设备发出的Unprovisioned Beacon里面包含了UUID等信息,配网者收到多个Unprovisioned Beacon后,需要选择一个设备,然后开始配网,选择了这个设备的第一件事就是建立链路。链路建立的流程如下:

① 配网者选择一个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、配网数据分发。其流程示意图如下:


① 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后,两端计算ECDHSecretECDHSecretECDHSecret值。接下来进入第三阶段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消息,其参数域值为ConfirmationProvisionerConfirmationProvisionerConfirmationProvisioner。
⑪ 设备端收到Random消息后,验证无误后,响应Provisioning Random消息,其参数域值为ConfirmationDeviceConfirmationDeviceConfirmationDevice。
⑫ 配网者收到后验证random值的有效性。开始进入第四阶段,配网数据的的分发。配网者发送Provisioning Data PDU,包含设备需要的配网信息,其中的信息通过授权后的数据信息进行加密传输。
⑬ 设备收到数据后,响应Provisioning Complete消息,配网结束。
⑭ 若配网期间出现错误,发送Provisioning Failed消息给对端,配网结束。
⑮ 配网结束后,发送Link Close消息关闭链路。

ECDHSecret值计算如下:
ECDHSecret=P_256(private_key,peer_public_key)ECDHSecret = P\_256(private\_key, peer\_public\_key)ECDHSecret=P_256(private_key,peer_public_key)
ConfirmationProvisioner和ConfirmationDevice值计算如下:
ConfirmationProvisioner=AES_CMACConfirmationKey(RandomProvisioner∣∣AuthValue)ConfirmationDevice=AES_CMACConfirmationKey(RandomDevice∣∣AuthValue)\begin{aligned} &ConfirmationProvisioner=\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ AES\_CMAC_{ConfirmationKey}(RandomProvisioner||AuthValue) \\ &ConfirmationDevice=\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ AES\_CMAC_{ConfirmationKey}(RandomDevice||AuthValue) \end{aligned}​ConfirmationProvisioner=                 AES_CMACConfirmationKey​(RandomProvisioner∣∣AuthValue)ConfirmationDevice=                 AES_CMACConfirmationKey​(RandomDevice∣∣AuthValue)​
其中:
RandomProvisioner为配网端随机产生的字符串RandomDevice为设备端随机产生的字符串AuthValue为通过OOB读取的授权值ConfirmationKey=k1(ECDHSecret,s1(ConfirmationInputs),"prck")ConfirmationInputs=ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue\begin{aligned} &RandomProvisioner为配网端随机产生的字符串\\ &RandomDevice为设备端随机产生的字符串\\ &AuthValue为通过OOB读取的授权值\\ &ConfirmationKey=k1(ECDHSecret,s1(ConfirmationInputs),"prck")\\ &ConfirmationInputs =ProvisioningInvitePDUValue||ProvisioningInvitePDUValue||\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ProvisioningInvitePDUValue||ProvisioningInvitePDUValue||\\ &\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ProvisioningInvitePDUValue \end{aligned}​RandomProvisioner为配网端随机产生的字符串RandomDevice为设备端随机产生的字符串AuthValue为通过OOB读取的授权值ConfirmationKey=k1(ECDHSecret,s1(ConfirmationInputs),"prck")ConfirmationInputs=ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue∣∣                 ProvisioningInvitePDUValue∣∣ProvisioningInvitePDUValue∣∣                 ProvisioningInvitePDUValue​

2.3 总结

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

Ble Mesh技术(十二)之Provisioning相关推荐

  1. Ble Mesh技术(一)之概览

    1. Mesh概览 1.1. mesh消息的收发 mesh消息收发方式区别于ble的连接方式,而是通过消息的发布(publish)与订阅(subscribe)进行消息的传递. mesh的数据包主要包含 ...

  2. BLE MESH组网(二)友谊功能和设备管理

    BLE MESH组网(二) Friendship功能 一.概述 1.Friendship是什么 2.Friend和LPN 3.Friend参数 4.好友建立 Friendship消息 安全 友谊终止 ...

  3. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

    原文链接:点击打开链接 摘要: 关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本 ...

  4. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件...

    关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  5. 互动媒体技术十二个“一”的文艺创作——小说创作

    互动媒体技术十二个"一"的文艺创作--小说创作 <玻璃>节选 俞城(男一号):学生,21岁.性格极具特色,表面倔强,但是经历过不为人知的故事.祖籍北京,地球上只剩下了爷 ...

  6. 【预告:直播回顾资料下载】2017阿里巴巴双11技术十二讲,历数双11精彩技术干货

    点击有惊喜 历届双11,阿里以其前瞻性的视角和创新技术一直致力于为大众递交诚意满满的答卷,大浪淘沙后最终沉淀下来的都是技术的烁金.叹为观止的数字中流转着这样的人.故事和技术,想要详细了解2017阿里双 ...

  7. 互动媒体技术-十二个“一”的文艺创作

    1.实验要求 将十二个"一"设想为人物角色/或事物,从下列任务中选择一个完成: 假想一个故事背景,从十二个"一"中挑选至少4人,为其设计角色形象,并配合文字描述 ...

  8. iOS核心动画高级技术(十二) 性能调优

    Code should run as fast as necessary, but no faster. 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Anima ...

  9. Ble Mesh技术(九)之Friendship

    Friend直接流程建立都是通过上层传输曾的控制PDU进行交互.控制消息大部分都为不分段消息,所以这一章我们以下层传输层的为分段消息作为PDU格式的总体示意图. 1. Friendship相关Cont ...

最新文章

  1. Vue项目打包成桌面程序exe除了使用electron-vue你还可以这样
  2. MySQL Percona PXC集群实现MySQL主从复制强一致性
  3. 子菜单挤压下方块元素_小心上瘾!全新类型的消除游戏|《土耳其方块》
  4. 买卖股票的最佳时机含手续费
  5. Leet Code OJ 4. Median of Two Sorted Arrays [Difficulty: Hard]
  6. 在apache中设置访问目录后进入的默认页面为index.php
  7. python整数转换字符串_使用Python中的str()函数将整数值转换为字符串
  8. 高中发表在论文计算机方面,高中计算机教学论文
  9. 模拟退火算法_Matlab 二维模拟退火算法最优路径(主程序)
  10. Iso时间转java instant,Java /将ISO-8601(2010-12-16T13:33:50.513852Z)转换为
  11. 数控车计算机软件编程的重要性,数控车床有多少人软件编程?
  12. 自定义 View 之圆形、圆角、爱心、动态旗帜等图片效果
  13. 清音驱腐启鸿蒙,中华成语千句文解释.doc
  14. protobuf生成Go代码插件gogo/protobuf
  15. CentOS 7.3安装详解
  16. python连接sftp下载文件及文件夹
  17. Python实现钉钉/企业微信自动打卡
  18. 软考高级系统架构设计师:特定领域软件架构
  19. 飞腾64核服务器cpu芯片,【今日头条】飞腾64核CPU适配百度昆仑AI处理器:全国产的AI体系登场...
  20. DNF登陆的时候说连接服务器失败,请检查您的网络。是否启用修复程序进行修复?,要买春节套,DNF游戏安全组件发生异常强制退出怎么办?...

热门文章

  1. python爬虫进阶js逆向实战 | 爬取 破解某安部加速乐cookie
  2. GridLayout网格式布局
  3. 第二十次CCF计算机软件能力认证
  4. ArcGIS ModelBuilder 迭代器参数传入字段计算器方法
  5. 钟汉良日记:什么副业最好?可以持续带来复利效应的技能,写作!
  6. Setup Factory卸载前关闭正在运行的程序
  7. 按键精灵实现交易开拓者TB自动化优化参数
  8. 测试mSATA盘在linux下挂载时读写速度
  9. 我当DeFi农民的一个月:浅谈Balancer流动性挖矿的风险与潜在收益
  10. GPS基础知识(六)、开普勒轨道参数