Provision statck
下图是provision的stack架构,分为三层,左边基于Adv,右边基于GATT
Provision bearer layer
bearer,送信人的意思,表示传输媒介
两种bearer构成:
- PB-ADV
- PB-GATT
一个未配对的设备应该支持上述两种中的一种,强烈建议都支持。
Provisioner(发起配对方)应该支持至少一种,强烈建议支持PB-ADV
PB-ADV
通过adv channels传递Generic Provisioning PDUs,基于会话,一个未绑定的设备只能同时支持一个会话,Provisioner没有限制。会话的建立使用Link Establishment procedure。
MTU(maximum transmission unit)大小是24个字节
设备要能主动扫描(close to 100% duty)避免丢包。
任何使用PB-ADV的广播应该是非连接的非定向扫描的。(non-connectable, non-scannable undirected)
PB-ADV数据格式:
PB-ADV PDU格式
- Link ID:
区分每个link - transaction number:
PDU过长,分段,所有的分段使用同样的transaction number。
PDU重发的时候,分段号也不变。 Provisioner上该值的范围0x00~0x7F,device上该值的范围0x80~0xFF。 当一个设备收到Provisioning PDU,它应该把该值设置为收到的值 当一个设备发送Transaction Acknowledgement PDU,该值应该被设为被承认的PB-ADV中的值----发ack的时候,使用双方协定好的transaction number。
PB-GATT
允许绑定设备,通过Proxy PDUs。
连接间隔建议250ms~1000ms
Proxy Protocol
该协议允许节点收发Network PDUs,mesh beacons,proxy configuration messages and Provisioning PDUs over a connection-oriented bearer。
Proxy PDUs包含Network PDUs,Mesh beacons, proxy configuration messages or provisioning PDU。
mesh消息转发的协议
Generic Provisioning layer
传输Generic Provisioning PUDs的。
Generic Provisioning PDU types:
- Transaction Start
- Transaction Acknowledgement
- Transaction Continuation
- Provisioning Bearer Control(会话管理)
- Link Open
- Link ACK
- Link Close
- RFU(reserved for future use)
Link Establishment procedure
不同设备靠Device UUID区分
Device UUID,128-bit UUID,因为mac地址太简单了,不够复杂
- 每个Generic Provisioning PDU应该有20~50ms延时
- 分段
- segments index 0~63个,第一个发transaction start PDU, 其他的发transaction continuation PDU.
Provisioning protocol
Provisioning PDUs
发起者和设备之间交流的媒介。
格式如下:
type如下:
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.
Provisioning behavior
Provisioning is performed using a five-step process:
- beaconing
- invitation
- exchanging public keys(ECDH加密用的)
- authentication
- distribution of the provisioning data
ECDH,Deffie-Hellman 算法是 密钥交换算法,它的作用是解决如何在不安全的信道中安全的传输一些信息(主要是交换对称加密的密钥/参数)。ECDH 就是使用椭圆曲线函数的 DH 算法
a,b都有一对公钥,各自根据公钥计算出密钥,使用该密钥就行加密
下图是Provisioning process的整体流程,在下一节会对每个流程做详细描述。
Provisioning errors
一旦中间失败,没有恢复机制,必须从新开始配对。
发起方发生错误,会立即断开连接。
接收方发生错误,发送一个Failed PDU给发起方,由发起方断开连接。60s超时后,可以不同发送Failed PDU。
流程详解
基于PB-ADV
- Invitation & Capabilities
建立连接,检测device的兼容性。
兼容性主要指:支持什么加密方式,(目前只有一种加密方法FIPS P-256 Elliptic Curve,
就是ECDH),支不支持OOB等一些行为。 Exchanging public keys
支持加密,即交换公共密钥,不支持不用
不支持加密的流程
支持加密的流程
- Authentication
认证,主要有三种方式。
1.Output OOB
device上展示一个Random number,用户在provisioner上输入这个number
2.Input OOB
provisioner上展示一个Random number,用户在device上输入
3.Static OOB/no OOB
没有Random number
下述是三种方式的流程图
Output OOB
Input OOB
Static OOB
- Distribution of Provisioning data
该环节主要用来发送Network Key,IV index, Unicast Address(分配给节点的)等信息。然后该环节还会计算出一个session key用来加密Provisioning data。
Provisioning data如下:
加密
目前只支持一种加密方式FIPS P-256 Elliptic Curve,整体加密流程如下:
P是public key
最终算出一个session key用来加密provisioning data这些信息。
扫描二维码,分享此文章