Mesh_provisioning流程整理

Mesh_provisioning流程整理

Provisioning

Provisioning(配网过程)是配网器把一个未配网设备加入到mesh网络的过程。配网器会提供配网数据给未配网设备,使它成为一个节点。配网数据包括:netkey,当前的IV Index,和每个元素的单播地址。

配网器通常是手机或者其他移动电脑设备。一个网络需要一个配网器,也可以多个配网器,方法是多个配网器通过分享缓存数据和协调多重配网器来实现。

配网承载层必须稳定的建立在配网器和设备之间。一个设备通过提供它的UUID或者其他信息给配网器来进行确定。

在配网承载层建立之后,配网器和设备通过ECDH建立一个共享密钥。接着使用设备独有的OOB信息进行验证。OOB信息可能包含设备的公钥,一个长密钥,要求给设备的一个值,或者要求设备提供的一个值。OOB信息可用来验证那台设备。当设备完成认证,配网数据传给设备,设备再通过共享密钥解密。设备密钥(dev_key)来自ECDH密钥和ProvisioningSalt。
在这里插入图片描述

配网器使用配网协议发送配网PDU(Provisioning PDUs).配网PDU通过PB-ADV或者PB-GATT传给未配网设备。PB-ADV 和PB-GATT定义配网PDU在传输时的分包和重组,也定义了怎么建立对话,比如:generic provisioning layer 传输给设备。 Finally, at the bottom of the provisioning architecture are the bearers.

A provisioning bearer layer

配网承载层,开启配网器和未配网设备传输配网PDU的使能。

一共有2个承载层:PB-ADV and PB-GATT(5.3.1)

•未配网设备可以支持PB-ADV 和 PB-GATT ,协议强烈推荐支持PB-ADV 和 PB-GATT

•配网器至少支持PB-ADV 或者PB-GATT 的一种,协议强烈推荐支持PB-ADV

PB-ADV:

用于让设备在广播信道上传播Generic Provisioning PDUs

配网机制就像一个会议

•一个未配网设备一次只能进行一个会议,但是对配网器没有限制

•会议建立在自动链路程序(5.3.2)

•PB-ADV用来传输Generic Provisioning PDUs

•PB-ADV承载MTU最大为24字节

•当使用PB-ADV时,Generic Provisioning PDUs 的广播类型应为0x29
在这里插入图片描述

•任何0x29的广播,必须是不可连接不可扫描的非定向广播事件,节点如果接收到不是这个类型的广播事件,应直接忽略
在这里插入图片描述

PB-ADV PDU的格式如下:

在这里插入图片描述

1.Link ID :用于鉴别两个设备之间链路(配网器和入网者)

2.Transaction Number:1字节,用于鉴别设备发出的每个 Generic Provisioning PDU。

当Generic Provisioning PDU(太长)被分段时,所以分段都使用用相同的Transaction Number

当Generic Provisioning PDU被重传时,也不改变Transaction Number

传输具体消息的前提是两个设备建立完成稳定的Link

发送PB-ADV需要遵守的规则如下:

1.当 PB-ADV PDU是一条Provisioning Bearer Control PDU,Transaction Number 应当为0x00,或者接收时选择忽略。

2.当配网器第一次发送 Provisioning PDU (打开配网链路),它应把Transaction Number设置为0x00.对于每个新的Provisioning PDU ,配网器应为Transaction Number增加值,它会在配网链路上持续发一个包。如果Transaction Number已经为0x7F,下一个新ProvisioningPDU因设为0x00.(配网器的Transaction Number 范围0x00-0x7F)

3.当未配网设备第一次发送 Provisioning PDU (打开配网链路),它应把Transaction Number设置为0x80.对于每个新的Provisioning PDU ,未配网应为Transaction Number增加值,它会在配网链路上持续发一个包。如果Transaction Number已经为0xFF,下一个新ProvisioningPDU因设为0x80. (未配网设备的Transaction Number 范围0x80-0xFF)

4.当一个设备正接收一个Provisioning PDU,它应该把Transaction Number设置为它当前持续收到的Transaction Number。(因为是持续发送的,设置主要为了避免重复接收处理)

5.当设备正在发送一个Transaction Acknowledgement PDU,它应该把Transaction Number设置成待回复的PDU的Transaction Number(When a device is sending a Transaction Acknowledgement PDU, the Transaction Number field shall be set to the value of the Transaction Number field of the PB-ADV PDUs transporting the Provisioning PDU being acknowledged.)

PB-GATT

它在 Mesh Provisioning Service中,用 Proxy PDUs 封装Provisioning PDUs来为设备配网。

当配网器因为应用接口不支持PB-ADV,而选择PB-GATT入网。

•推荐配网器和设备之前选择250-1000ms(实际情况而定)的连接间隔,来实现低功耗响应(快速响应)。并且允许设备去计算DH共享密钥,来避免在空闲链路耗能。

1.Mesh Provisioning Server能够通过一条Write Command ATT PDU.去接收一条Proxy PDU

2.Mesh Provisioning Server用一条Handle Value Notification ATT PDU来发送Provisioning

PDUs给配网器。

3.如果设定的 ATT_MTU小于一个必要的Proxy PDU的大小,传输过程中的Mesh Provisioning Data In and Mesh Provisioning Out 特征会继续分包和重组。每个包将在处理之前被重组。

  1. Mesh Provisioning Server 能够在一个或者几个ATT PDU中接收一个 Proxy PDU .Mesh Provision Server 同样可以用一个或者几个Handle Value Notification ATT PDUs来发送一个 Proxy PDU给配网客户端,这些取决于设定的ATT_MTU大小和消息的大小

Generic Provisioning layer

Generic Provisioning layer 负责在一个不可连接的配网层上传输Generic Provisioning PDUs并且定义这些PDU。

Generic Provisioning PDU = Generic Provisioning Control +Generic Provisioning Payload
在这里插入图片描述

Generic Provisioning Control 字段的第一个字节的最低两个bit 是 Generic Provisioning Control Format(GPCF) 字段.以下是GPCF枚举
在这里插入图片描述

Generic Provisioning PDU types

Transaction Start PDU

The Transaction Start PDU 用来表示开始传输一个分段消息。
在这里插入图片描述

•SegN:表示传输中最后一个分段的包号

•GPCF:0b00 表示开始传输

•TotalLength:表示Provisioning PDU的字节长度

•When transmitted using PB-ADV, the FCS field is calculated as defined by 3GPP TS 27.010 with the Polynomial (x8 + x2 + x1 + 1) and is calculated over the Provisioning PDU only.

•Generic Provisioning Payload 是Provisioning PDU 的第0段。

Transaction Acknowledgment PDU

Transaction Acknowledgment PDU用于回复一个Provisioning PDU

在这里插入图片描述

•GPCF:0b01

•Generic Provisioning Payload:为空

Transaction Continuation PDU

Transaction Continuation PDU用来发送Privisioning PDU的其它分包消息(除第0段)
在这里插入图片描述

•SegmentIndex:表示传输此Provisioning PDU中的哪个分段的包号

•GPCF:0b10

•Generic Provisioning Payload:表示此Provisioning PDU中SegmentIndex的内容。

Provisioning Bearer Control

Provisioning Bearer Control PDU:用于管理承载层的没有固定安排的会话

在这里插入图片描述

•GPCF:0b11

•Generic Provisioning Payload:为空

•Parameters:每个opcode消息下被定义

Link Open message

Link Open message用于在配网器和未配网设备之间 建立一个稳定的Link
在这里插入图片描述

•Parameters:UUID:未配网设备的UUID

•Bearer Opcode :0b 0000 00

•GPCF:0b11

Link ACK message

Link ACK message:用于发送一个回复消息。(对应Link open)

这个消息没有Parameters
在这里插入图片描述

•Bearer Opcode :0b 0000 01

•GPCF:0b11

Link Close message

Link Close message用于关闭一个Link.虽然这是个不需要回复的消息,但发送者至少重复发送此消息三次以上。link 的两端都可以发送此消息。无论Reason字段为何,都需要接收并处理此消息。

Parameters:Reason

在这里插入图片描述
在这里插入图片描述

•Parameters:Reason

•Bearer Opcode :0b 0000 10

•GPCF:0b11

Link Establishment procedure

Link Establishment procedure是用来在没有固定安排的会议下在承载层上建立一个稳定的会议。

这个会话在持续时间内是静态的,用Link ID来认证。Link ID应该是随机生成的避免会话之间冲突。

Link 用于配网器和未配网设备之间稳定的发送配网消息。未配网设备用UUID来认证。

配网器应该扫描寻找未配网设备。一旦接到 Unprovisioned Device beacon,配网器应该用未配网设备UUID来建立一个Link.

当未配网设备发送一个Link ACK消息来回复 Link open消息时,Link被打开。当配网器接收到一个Link open 消息并且Link ID 和发送的Link open的Link ID相同时,Link被打开。当Link 被打开并且接收配网PDU时,表示设备正在配网中。

当Link 没有打开,并且设备收到一个Link Open消息时,设备应该接收此消息,并且用相同的Link ID回复一个Link Open消息(使用PB-ADV PDU).当Link 打开,并且设备没有处于配网,设备接收了一个Link Open消息并且Link ID相同,设备应用相同的Link ID 回复一个Link ACK 消息(使用PB-ADV PDU)

当Link open时,设备应开启一个60s的计时,当计时结束,设备应该关闭Link.当设备接收配网PDU,或者一个Link close消息时,设备应取消定时

为打开一个Link,配网器应开启一个link建立时间60S计时,并且发送Link Open消息。配网器可以在任何时候终结配网过程。Link Open 消息包含设备的UUID.在PB-ADV上,PB-ADV格式包含一个Link ID.

当Link 建立时间到期,Link没有被打开则重复上面操作重新扫描未配网设备并计时。当Link被打开,配网器应取消建立时间计时。

Link 可以通过在任何时候发送Link close 消息来关闭。Link两端都可以发送Link close消息。

在这里插入图片描述

Generic Provisioning behavior

•每个 Generic Provisioning PDU在发送之前需要随机延迟20-50ms

•每个 Generic Provisioning PDU传输作为一次传输,一次传输可能由一个或者多个包组成

•一个配网PDU的包号需要由配网PDU的大小来确定。包号范围0-63。0包需要用Transaction Start PDU来发送。其他所有的分包需要用Transaction Continuation PDU来发送。配网PDU的每段数据都放在每个分包的 Generic Provisioning Payload字段位置。

•每个承载都自己规定了发送配网PDU的最大最小尺寸,使配网数据合理传输。每个分包的配网PDU传输中都需要用完承载的MTU,除了最后一包

•发送端一次传输中发送的所有消息都有个序列。如果没有接收到Transaction Acknowledgment 消息,发送者应中继这次传输的所有消息。

•如果发送端接收到一个 Transaction Acknowledgment消息,表示这次传输结束。

•如果发送端接收了其他PDU type,应该忽略此消息

•如果在一次传输中,发送端发送第一个消息,30S内没有收到 Transaction Acknowledgment消息,发送端应取消此次传输,取消配网过程,关闭Link.

•接收者可以从Transaction Start PDU来获取一次传输的总包数量。

•在PB-ADV承载上,当接收者接收了一次传输的所有消息,接收者需要通过接收的配网PDU来计算FCS,如果FCS结果与Transaction Start PDU的FCS匹配,就随机延迟20-50ms,然后发Transaction Acknowledgment PDU

•当一次传输被接收了发送Transaction Acknowledgment PDU,其他传输被接收,其他传输回复也已经被发送时,已经接收到的消息需要被忽略。

Provisioning protocol

这部分定义了配网PDU的行为,和安全

Provisioning PDUs

Provisioning PDU用于配网器和设备通讯。

第一个字节表示PDU类型,接着是配网PDU的参数

在这里插入图片描述

在这里插入图片描述

10种PDU对应配网的五个阶段,对应下面的流程图:

在这里插入图片描述

举例:接收的三条消息,解析第一消息为例

在这里插入图片描述
在这里插入图片描述

Remote Public Key:

0x916a4c09f903897e46d9ddc260694b0fe28fdc b4e53434648a5e96fcad198f5b3730512e87d448

524c4e dccd561ac5eb9e5133eba64091b79432c38fe92b6462

如图:

1.len 30: 1d2912435493020adccd561ac5eb9e5133eba64091b79432c38fe92b6462 

•0x1d:此消息的size  0x1d =29

•0x29:BT_MESH_DATA_MESH_PROV类型

•0x12435493:  Link ID

•0x02:Transaction Number 传输号(交易号),目前传输的阶段

•0x0adccd561ac5eb9e5133eba64091b79432c38fe92b6462 :Generic Provisioning PDU

•0x0a=0b0000 1010:最低2bit:0b10   表示Transaction Continuation PDU

•                                  高 6bit:0b10  表示当前分包号为2  

•0xdccd561ac5eb9e5133eba64091b79432c38fe92b6462:分包2  data

2.len 31: 1e291243549302080041ef03916a4c09f903897e46d9ddc260694b0fe28fdc 

•0x1e:此消息的size  0x1e=30;

•0x29:BT_MESH_DATA_MESH_PROV类型

•0x12435493:  Link ID

•0x080041ef03916a4c09f903897e46d9ddc260694b0fe28fdc:Generic Provisioning PDU

•0x08=0b0000 1000:最低2bit:0b00  表示Transaction Start PDU

•                                 最高6bit:0b10  表示最后分包号为2

•0x0041:此次交易的总字节长度     65字节

•0xef :FSC:当整个包收完后,计算出FSC要与此FSC匹配才可以通过(数据完整效验)

•0x03916a4c09f903897e46d9ddc260694b0fe28fdc:        0包数据

•0x03:是Provisioning PDUs类型 表示公钥交换阶段发来的公钥

3.len 31: 1e29124354930206b4e53434648a5e96fcad198f5b3730512e87d448524c4e 

•0x1e:此消息的size  0x1e=30;

•0x29:BT_MESH_DATA_MESH_PROV类型

•0x12435493:  Link ID

•0x02:Transaction Number 传输号(交易号),目前传输的阶段

•0x06b4e53434648a5e96fcad198f5b3730512e87d448524c4e:Generic Provisioning PDU

•0x06=0b0000 0110:最低2bit:0b10   表示Transaction Continuation PDU

                                   最高6bit:0b01   表示当前分包号为1

•0xb4e53434648a5e96fcad198f5b3730512e87d448524c4e:分包1数据

举例2:接收到一个Provisioning PDU的代码流程。

在这里插入图片描述

Plain Text
adv_thread --started 

len 17: 1029aeb2eba601000006b4020000010000 

link_id 0xaeb2eba6 xact_id 1 

len 6 last_seg 0 total_len 6 fcs 0xb4 

type 0x02 len 6 

xact_id 1  ~~~~~~~~~  pending_ack :255  

 pool 00102300 timeout 400 

uninit_count 4  

type 0x00 len 6: aeb2eba60101 

buf->ref:2  

buf 0010668c (old) ref 1 pool_id 0 

buf 0010668c ref 2 pool_id 0 frags 00000000    

Algorithm:   0x00 

Public Key:  0x00 

Auth Method: 0x01 

Auth Action: 0x00 

Auth Size:   0x00 

adv_thread --started 

###########adv_send   ####### 

type 0 len 6: aeb2eba60101 

count 3 interval 100ms duration 330ms 

+++++++++++++++bx_mesh_adv_start++++++++++++++++++++++++++++++ 

buf 0010668c ref 1 pool_id 0 frags 00000000    

xact 1 complete 

Advertising started. Sleeping 330 ms 

Advertising stopped 

拆解:

2-5行,扫描到一个数据

       0x01 表示Transaction Number  

       0x00   最低2位0b00   GPCF:表示这是一条Transaction Start PDU消息

                  最高6位0b00   表示SegN

       0x0006 总长度为6  FCS:

       0xb4:FCS(用于PDU完整性效验)

       0x02:配网PDU类型  Provisioning Start

       0x0000010000: data

6行:准备发送 Transaction ACK PDU

7-12行:创建一个buf存储ACK PDU,类型0x00 代码中表示这个是一条配网PDU,并把buf放到队列中。

13-17行:处理Transaction Start PDU中的data

19-22行:广播Transaction ACK PDU

23行: 释放buf

24行:Transaction ACK PDU消息的回调函数。 这个交易完成

2021/09/23

总结


Plain Text 所有的prov 包都是

格式 link id + trans_numb +control +payload

长度 4 1 1-17 0-64

control 至少有1个字节,当第一个字节最低为2位 为 0b11(此消息就是link open link ack link close。此时还没有真正进入配网阶段)

最低2为0b00 :Transaction Start就是开始一个配网阶段

最低2为0b01 :Transaction Acknowledgment 就是回复start.

最低2为0b10 : Transaction Continuation 继续此配网阶段

这个 start ,continuation ,ack 它们也有自己的格式,其目前就是表示当前阶段的总数据有多大,要不要分包,当前包号是多少

比如 publish key 交互阶段。因为一个广播包最大就31字节,而一个pubkey 长度是64字节,所以此阶段肯定要分3包发送,对面还要重组

payload :指的是当前这个PDU的具体数据,可以为空(当link open,link ack,link close 就为空)。

payload 不为空时。一般为 type+param

type 就是当前PDU的类型(见协议240页),param 就是当前pdu的内容

比如:0x0002 0x00就代表是invite 0x02 就是invite的内容


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值