蓝牙Mesh的基本架构/配网流程/节点定义

Posted 浮若于心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝牙Mesh的基本架构/配网流程/节点定义相关的知识,希望对你有一定的参考价值。

蓝牙mesh的基本架构:

承载层(bearer layer):承载层定义了如何使用底层低功耗堆栈传输PDU。目前定义了两个承载层:广播承载层(Advertising Bearer)和GATT承载层。

网络层(network layer):网络层定义了各种消息地址类型和网络消息格式。中继和代理行为通过网络层实施。

底层传输层(lower transport layer):在需要之时,底层传输层能够处理PDU的分段和重组。

上层传输层(upper transport layer):负责对接入层进出的应用数据进行加密、解密和认证。它还负责称为“传输控制消息”(transport control messages)这一特殊的消息,包括与“friendship”相关的心跳和消息。

接入层(access layer):负责应用数据的格式、定义并控制上层传输层中执行的加密和解密过程,并在将数据转发到协议栈之前,验证接收到的数据是否适用于正确的网络和应用。

基础模型(foundation models):基础模型层负责实现与mesh网络配置和管理相关的模型。

模型(models):模型层与模型等的实施、以及诸如行为、消息、状态等的实施有关。

蓝牙mesh的配网流程:

Beacon广播     

蓝牙mesh网络规格中介绍了新的GAP广播类型,包括 <<Mesh Beacon>> 广播类型[ii]。

设备( Device)可采用<<Mesh Beacon>> 广播类型来发出广播,声明自己是未经启动配置的设备,可被启动配置。用户可能需要根据制造商的说明,按照一定的流程,例如键入一组按钮,或将某一按钮长按一段时间等,以此方式启动新设备的广播。

用户还需要在启动配置设备中启动“添加设备到网络”的流程,以便从Beacon设备(Device)接收广播数据包。需要记住的一点是,启动配置设备可能是智能手机或平板电脑应用,因此在实际操作中会涉及到智能手机解锁、应用程序启动、也许还需要登录应用程序(为了进一步确保安全性),并通过其用户界面启动Beacon设备(Devices)搜寻。这样,启动配置设备就会意识到新设备(Device)的存在和准备就绪状态,可进入后续的启动配置流程。

邀请   

接下来,启动配置设备将以启动配置邀请PDU(Provisioning Invite PDU)的形式向要进行启动配置设备发送邀请,这是启动配置协议的一部分。Beacon设备会在启动配置功能PDU中回应有关自身的信息。

启动配置功能PDU可提供一系列信息,例如其所拥有的元素数量、所支持的启动配置相关算法等。它还能指示设备(Device)拥有的输入输出功能类型,这些信息将用于认证(Authentication)步骤。

交换公共密钥(Public Key)   

包括启动配置设备在内的所有蓝牙mesh设备都支持FIPS P-256椭圆曲线算法,因此必须拥有公共密钥。可通过基于该算法的非对称加密来创建安全通道,以完成剩余的启动配置流程。为此,启动配置设备会与将被启动配置的设备(Device)交换公共密钥。需注意的是,将被启动配置的设备(Device)可以通过带外方式(Out of Band),例如QR码,来提供公共密钥。本系列的后续文章将重点讨论mesh安全性,包括启动配置的安全性。

认证(Authentication)

启动配置设备基于对新设备(Device)功能的了解,向其发送消息,指示其输出单一或多位数值,对其所支持的多种用户操作(例如按下按钮)作出响应。值的形式会因设备差异而有所不同。一台设备可能会在LED面板上显示一个三位的数值,另一台设备则可能是红色LED灯闪烁几次,闪烁的次数就是输出的验证值。启动配置设备的用户将观察到设备(Device)输出的值,并将值输入启动配置设备的用户界面。

然后,设备(Device)和启动配置设备交换密码散列,这些数据来源包括设备(Device)输出的随机值,允许它们完成对彼此的验证

启动配置数据的分配   

认证成功完成之后,会通过两台设备的私有密钥(Private Key)和交换的对等公共密钥生成会话密钥(Session Key)。随后,会话密钥即可用于保护完成启动配置流程所需数据的后续分发,包括网络密钥(NetKey)和设备的唯一地址,即单播地址(Unicast Address)。

启动配置完成后,启动配置设备就会拥有网络的NetKey,这是一个称为“IV索引(IV Index)”的蓝牙mesh安全性参数,且拥有一个由启动配置设备分配的单播地址[iii]。至此,新设备就正式成为了节点,即成为蓝牙mesh网络中的一员。

从网络中移除节点涉及两个步骤:

  1. 首先,使用启动配置设备应用,将想要移除的节点添加至“黑名单”。

  2. 其次,启动一项称为密钥刷新程序(Key Refresh Procedure)的流程。

黑名单

使用启动配置设备,用户必须将想要移除的节点添加至黑名单。黑名单的目的很简单,就是当启动密钥刷新程序时,确保新的安全密钥不会被发放至黑名单中的节点。

密钥刷新程序

通过密钥刷新程序,除了黑名单中的节点,网络中的所有节点都会被发放新的网络密钥、应用密钥、以及所有相关衍生数据。也就是说,构成网络和应用安全性基础的整套安全密钥都会被替换。

用户可使用启动配置设备启动密钥刷新,启动配置设备会创建新密钥,并通过配置消息向mesh网络中的所有节点发送新密钥,但黑名单中的成员除外。

低功耗节点(Low Power Node)将从好友节点处接收到新密钥,因此它们可能需要经过相当长的一段时间才会接收到新密钥,随后整个网络将全部更换密钥。

由于所有节点不会在同一时间接收到新密钥,因此密钥刷新程序定义了一个称为“第二阶段”的过渡周期,在此期间新旧密钥均可使用。具体来说,传输过程中会使用新密钥,但支持消息接收的节点会同时使用新旧密钥。

第二阶段完成之后,启动配置设备会通知所有节点废除它们的旧密钥。至此,黑名单之外的每个节点都收到了新密钥。

此时,从网络中移除的节点、以及包含旧网络密钥(NetKey)和旧应用密钥(AppKey)的节点将不再是网络中的成员,因此也无法构成任何威胁。

蓝牙mesh节点定义:

低功耗 (Low-Power) 特性

功率受限的节点可能会利用低功耗特性来减少无线电接通时间并节省功耗。同时低功耗节点(LPN)可以与friend节点协同工作。

Friend 特性

功率不受限的节点很适合作为friend节点。Friend 节点能够存储发往低功耗节点(LPN)的消息和安全更新;当低功耗节点需要时再将存储的信息传输至低功耗节点。

中继 (Relay) 特性

中继节点能够接收和转发消息,通过消息在节点之间的中继,实现更大规模的网络。节点是否能够具备这一特性取决于其电源和计算能力。

代理 (Proxy) 特性

代理节点能够实现GATT和蓝牙mesh节点之间的mesh消息发送与接收。承担这一角色的节点需要固定的电源和计算资源。

 一些节点的复杂性高于其他节点,由多个称为元素(Element)的独立部分组成。每个节点至少拥有一个元素,称为主元素(Primary Element),同时还可能包含其他多个元素(图3)。元素由定义节点功能和元素条件的实体组成

节点中的每个元素都有一个唯一的地址,称为单播地址(unicast address),使每个元素都有址可寻。我们将在后续的解密蓝牙mesh系列文章中进一步解释“寻址”。

三种密钥:APPKEY,NETKEY,DEVKEY

应用密钥(AppKey):用来保护应用层消息,它不同于用于保护特定应用(如照明、物理安全、温控等)相关数据安全的密钥。比如没有对应应用密钥,接收到消息时,不能对改要洗进行处理,比如中继节点。

所有节点都拥有一个或多个网络密钥(NetKey):每个网络密钥对应一个子网,它也可能是主要子网。节点必须拥有网络密钥,才能成为网络中的成员。网络加密密钥(Encryption Key)和隐私密钥(Privacy Key)直接源于网络密钥。拥有NetKey让节点能够对网络层的数据进行解密和验证,以便执行诸如中继等网络功能。但应用程序数据不可被解密。比如节点拥有对应子网的NetKey,才能在该子网中传递数据和信息。但没有APPKEY依然不能解析该数据。

设备密钥(DevKey):用于节点的启动配置(Provisioning)和配置流程。在配置结束后分配appkey和netkey。 

蓝牙技术联盟的学习路径:

  1、解密蓝牙mesh系列 | 第一篇

  2、解密蓝牙mesh系列 | 第二篇

  3、解密蓝牙mesh系列 | 第三篇

  4、解密蓝牙mesh系列 | 第四篇

  5、解密蓝牙mesh系列 | 第五篇

  6、解密蓝牙mesh系列 | 第六篇

  7、解密蓝牙mesh系列 | 第七篇

  8、解密蓝牙mesh系列 | 第八篇

  9、解密蓝牙mesh系列 | 第九篇

10、解密蓝牙mesh系列 | 第十篇

蓝牙Mesh简介设备标识:UUID和Mesh地址

mesh主要使用广播和扫描通信,故主要工作于37-39信道;对于不支持广播通信的设备,通过代理接入网络(使用ble通信,0-37信道);最大MTU 24字节

标识设备的方式有UUID和Mesh Address;
设备配网建立pb-adv link时使用设备uuid;设备获取到mesh地址后,也可用mesh地址标识

Device UUID

  • 出厂分配的唯一16字节UUID;
  • 不依赖蓝牙地址
  • 建立pb-adv link时标识设备
  • 获取mesh地址后,用mesh地址唯一标识
    例:uuid
//   0x17, 0x09, //CID
//   0x1A, //PID
//   0x00, 0x02, 0x02, 0x03, //ProductID
//   0x57, 0x5D, 0x69, 0x63, 0xA7, 0xF8, //MAC,按实际蓝牙mac生成
//   0x00, //FeatureFlag
//   0x00, 0x00//RFU

Mesh地址

  • 由用户统一管理和分配
  • 设备入网时通过provisioning流程分配
  • 地址不得重复
  • 同一设备可能有多个mesh地址,用于区分不同的功能模块
  • Mesh地址分类:
    • 未分配地址(默认地址)0x0000
    • 单播地址0x0001-0x7FFF;message源一定是单播地址
    • 0x8000-0xbfff 虚拟地址,由label uuid生成
    • 0xc000-0xffff 组地址
      0xc000-0xfeff 自由分配组地址
      0xff00-0xffff 固定组地址

以上是关于蓝牙Mesh的基本架构/配网流程/节点定义的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙Mesh简介设备标识:UUID和Mesh地址

蓝牙Mesh概念介绍

SIG蓝牙mesh笔记2_mesh组成

蓝牙mesh与ZigBee

蓝牙技术体系详解

蓝牙技术体系详解