Bluetooth Mesh Provisioning

Provisioning是将未配网设备加入到mesh网中的过程,该过程是通过provisioner来实现的。Provisioner向未配网设备提供provisioning 数据,其中包括network-key、当前网络的IV_Index,还有设备每一个element对应的unicast地址。

provisioner可以是手机或者其他智能设备,一个mesh网中只需要一个provisioner角色,但是亦可以允许多个provisioner实现,多个provisioner共存时的数据共享可以被特定实现。

provisioning过程,首先需要在未配网设备和provisioner节点间建立一个provisioning-bearer。未配网设备向provisioner广播自己的UUID以及其他必要信息。provisioner连续扫描消息,收到未配网设备的消息时,选择与某一个对应的设备建立provisioning-bearer

Provisioning-bearer建立后,provisioner与为配网设备间使用Elliptic Curve Diffie-Hellman (ECDH)协议加密。

Provision协议使用分层的结构,如上图所示。设备的provision过程是通过发送provisioning-PDU实现的。provisioning-PDU通过generic provision layer层发往未配网设备。该层定义了provisioning-PDU是如何传输、分段重组的,传输包通过provisioning-bearer发送。provisioning-bearer定义了连接对话是如何建立的,即generic provision layer的传输包是怎样被传送到设备的。最后,在provision结构的最下层就是bearers。

Provisioning bearer layer

provisioning bearer layer实现了在provision过程中provisioning PDUs的传输。mesh协议中定义了两种provisioning bearers

  • PB_ADV
  • PB_GATT

未配网设备可以支持PB_ADV或是PB_GATT,建议在未配网设备同时实现两种bearer。provisioner至少支持一种,强烈建议provisioner支持PB-ADV。

PB-ADV

PB-ADV是一个provisioning bearer,是用来在advertising channel上使用Generic Provision PDUs来进行provision的。provision机制是基于对话(session)的。一个未配网设备一次只能支持一个对话(session),而对于provisioner则无此限制。

PB-ADV用来传输Generic Provisioning PDUs,PB-ADV bearer最大的传输单元(Maximum Transmission Unit, MTU)是24个字节。

支持PB-ADV的设备应该以占空比100%的频率扫描消息,以免丢失Generic Provision PDUs

PB-ADV PDU 消息包的格式如下:

Feild Size Description
Length 1 length of the pb-adv PDU
AD type 1 PB_ADV
contents 可变 PDB-ADV PDU

其中PB-ADV PDU格式如下:

Field Size Description
LInk ID 4 一个link的标识符
Transaction Number 1 The number for identifying a transaction
Generic Provisioning PDU 1-24 Generic Provisioning PDU being transferred

LinkID 用来表示两个设备之间的一个连接。

Transaction Number 包含一个1-byte的值,用来表示每个Generic Provisioning PDU, 如果Generic Provisioning PDU经过了分段,则每个分片的Transaction Number 都是相同的。而且当Generic Provisioning PDU重发时,该值也是不变的。

在实现时还需要遵循以下几条规则:

  • 当PB-ADV PDU包含Provisioning Bearer Control PDU时, Transaction Number应该设置为0.
  • 当一个Provisioner通过一个打开的provision link,首次发送Provisioning PDU时,Transaction Number 的值应该从0x00开始,每发送一个Provisioning PDU该值累加。当到达0x7F时,返回的0.
  • 当未配网设备通过一个打开的provisin link首次发送PDU时,Transaction Number的值应该从0x80开始,每发送一个provisioning PDU累加1.当到达0xFF时,返回到0x80.
  • 当一个设备收到provisioning PDU时,将会根据收到包的Transaction Number值来设置该值。
  • 当一个设备发送Transaction响应PDU时, Transaction Number 值应该设置为其响应的那条消息的 Transaction Number 值。

PB-GATT

PB_GATT是通过Proxy PDU来provision的bearer,PB-GATT是用来支持那些不支持PB-ADV的provisioner的而实现的bearer.

关于GATT不太理解,后续在做整理。

Generic Provisioning PDU

Generic Provisioning PDU包含两部分,一部是Generic Provisioning Control(GPC)field, 紧接着是Generic Provisioning Payload。

Generic ProvisionIng Control field的最低两位包含一个Generic Provisioning Control Format (GPCF)field,该值决定了PDU的类型。

Value Description
0b00 Transaction Start
0b01 Transaction Acknowledgement
0b10 Trabsaction Continue
0b11 Transaction Bearer Control

Generic Provisioning PDU

Transaction Start PDU

Transaction Start PDU 用来开始一段分段消息传输,其格式如下:

Transaction Acknowledgment PDU

Transaction Acknowledgment PDU用来响应一个Provisioning PDU

该PDU只包含一个字节,如下所示:

此时Generic Provisioning Payload的长度是0.

Transaction Continuation PDU

Transaction Continuation PDU用来传输后续的provisioning PDU,其结构如下所示:

SegmentIndex是分段消息的index(从0开始)

GPCF为0b10

Generic Provisioning Payload 包含Provisioning PDU分段索引为SegmentIndex的内容。

Provisioning Bearer Control

Provisioning Bearer Control PDU用来管理bearer上的额对话(session),其格式如下:

Link Open Message

该消息用于打开一个连接,该消息需要使用Link-ACK-message来响应。

一个设备一次只能处理一个连接,当一个连接处于活动状态时,会忽略其他的Link-Open-message.

Link_Open_message消息的参数是需要建立连接的设备的UUID,如下所示:

Link ACK message

该消息用来响应Link-Open-message,没有参数,只有一个字节,如下所示:

Link Close message

该消息同来关闭一个连接,由于该消息是没有响应的,因此发送端需要重复发送该消息至少三次,连接两端都可以发送该消息,并处理该消息。

该消息的参数域描述关闭连接的原因,其结构如下:

Field Size
Reason 1

其值为:

Value Reason Notes
0x00 success provisioning successful
0x01 Timeout provisioning transaction timed out
0x02 Fail The provisioning failed
0x03 - 0xFF Unrecognized 未定义

Link Establishment procedure

Link Establishment procedure 用于建立一个对话(session), 一个对话用Link ID 标识,在连接过程中该值不会变化。LinkID需要随机生成,以避免多个对话间冲突。

连接建立时,未配网设备使用UUID标识,Provisioner扫描未配网设备的广播,然后provisioner发起Link-Open-message来建立连接。Link-Open-message中包含了未配网设备的UUID。在PB-ADV上的PB-ADV PDU包含了连接的Link ID.

对于一个没有配网并且已经收到了Provisioning Invite PDU的设备,当其周到一盒Link Open messsage时,会响应该消息返回一个带有相同LinkID的Link ACK message.

连接可以在任何时候通过发送Link Close message来关闭,连接的两端都可以发送该消息。

连接建立的流程可以用下图表示:

Generic Provisioning behavior

每个Generic Provisioning PDU发送时,要与上一个PDU有一个20~50毫秒的随机延时。

每个Provisioning PDU都应该作为一个独立的消息包,每个消息包由一个或多个分段组成。

Provisioning PDU被分段的数量,取决于该PDU的大小,segment Index可以是0~63之间的数。segment 0 应该使用Transaction Start PDU来发送。其他的分段应该使用Transaction Continue PDU来发送。每个分段都被放入Generic Provisioning Payload中。

每个bearer都有一个MTU最大值限制,每个Generic ProvisionIng PDU都应该是最长的MTU长度,最后一个分段除外。

发送端需要顺序发送每个分段,如果发送端没有收到回应,那么发送端会重发整个PDU的所有消息。

若果发送端收到了Transaction Acknowledgement message,则表示传输成功。

如果发送端在发送第一条消息后30秒内,没有收到Transaction Acknowledgement message,则发送端会取消传输,终止provision过程,关闭link。

接收端会根据Transaction Start PDU中的内容,判断分段的个数。

在PB-ADV bearer中,当接收端收到了所有的分段,它会计算收到Provisioning PDU的FCS,如果该值符合Transaction Start PDU中的FCS值,那么接收端就会在一个20~50毫秒的人随机延时之后,发送一个Transaction Acknowledgement PDU。

SIG蓝牙mesh笔记5_Provisionging的更多相关文章

  1. SIG蓝牙mesh笔记2_mesh组成

    目录 SIG 蓝牙 mesh 组成 mesh网络概述 网络和子网 设备和节点 devices & nodes 入网 mesh中的几个概念 智能插座例子 SIG 蓝牙 mesh 组成 mesh网 ...

  2. SIG蓝牙mesh笔记3_网络结构

    目录 3. Mesh Networking 3.1 Bearers 承载层 3.2 Network Layer 网络层 3.2.3 Address validity 地址有效性 3.2.4 Netwo ...

  3. [蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD)

      1.照明即平台(LAAP) 随着照明设施向LED转型,他们也在利用类似于蓝牙MESH的技术,创建一个可连接的照明平台,作为他们建筑的中枢神经系统.这些系统除了提供先进的照明控制,还建立了一个增强版 ...

  4. 蓝牙mesh介绍

    了解一下关于蓝牙Mesh的知识. 蓝牙mesh网络使用,并且依赖于低功耗蓝牙(BLE).低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈. 蓝牙BR / EDR能够实现一台设备到另一台设备的连接和通信 ...

  5. 解密蓝牙mesh系列

    解密蓝牙mesh系列 https://mp.weixin.qq.com/s/KdVhkgcmHIboA0xPFqFCgQ 1.NRF52832 & NRF52840 BLE mesh 协议栈 ...

  6. 蓝牙mesh网络技术的亮点

    蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...

  7. 关于蓝牙Mesh您必须知道的七件事

    蓝牙技术联盟于7月19日正式宣布,蓝牙(Bluetooth)技术开始全面支持Mesh网状网络.全新的Mesh功能提供设备间多对多传输,并特别提高构建大范围网络覆盖的通信能力,适用于楼宇自动化.无线传感 ...

  8. Android蓝牙学习笔记

    一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...

  9. Android蓝牙操作笔记

    蓝牙是一种支持设备短距离传输数据的无线技术.android在2.0以后提供了这方面的支持. 从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器): 1.设置权限 在manifest中配置 ...

随机推荐

  1. Maven--archetypeCatalog笔记

    当我们使用maven原型生成项目骨架时,经常会在[INFO] Generating project in Interactive mode这个地方特别慢,这里并不是什么出错卡住的原因,你打开mvn的d ...

  2. 谨慎修改Oracle数据库字符集(UTF8<->ZHS16GBK)

      Preface       Today,I'm gonna say something what is related with the character set in Oracle datab ...

  3. 在控制台中操作MYSQL数据库步骤以及一些小问题

    一直用Navicat来对MySQL数据库进行操作,今天突然想试试用DOS控制台来操作,特记录自己第一次使用经历,若有错误之处,还望大佬们指点. 首先打开控制台,win+R键,输入cmd,确定 输入my ...

  4. SpringBoot整合Swagger2以及生产环境的安全问题处理

    1.创建springboot项目 https://www.cnblogs.com/i-tao/p/8878562.html 这里我们使用多环境配置: application-dev.yml(开发环境) ...

  5. 集合,ArrayList练习

    import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest { public static vo ...

  6. redis整合Spring之序列化对象与反序列化

    写在最前面 1.Spring必须是4.2.6及以上版本才支持redis 2.jar包版本建议统一 需要准备jar包 1.aopalliance-1.0.jar 2.spring-data-common ...

  7. 第6章 HDFS HA配置

    目录 6.1 hdfs-site.xml文件配置 6.2 core-site.xml文件配置 6.3 启动与测试 6.4 结合ZooKeeper进行自动故障转移 在Hadoop 2.0.0之前,一个H ...

  8. Linux3.5—IIC学习分析

    I2C控制器的设备对象内核已经实现并关联到platform总线. I2C控制器的驱动对象内核已经实现. 看mach-tiny4412.h /plat-samsung/目录下 /drivers/i2c/ ...

  9. [原创]用python检测LVS real server状态实现HTTP高可用

    import httplib import os import time def check_http(i): try: conn=httplib.HTTPConnection(i, 80, time ...

  10. [Real World Haskell翻译]第21章 使用数据库

    第21章 使用数据库 从网络论坛到播客采集软件甚至备份程序的一切频繁地使用持久存储的数据库.基于SQL的数据库往往是相当方便:速度快,可扩展从微小到巨大的尺寸,可以在网络上运行,经常帮助处理锁定和事务 ...