先来明晰一些概念:
device(设备)和node(节点)
设备是指带有蓝牙功能的终端。而一个设备加入到mesh网络中后,就成为一个节点。设备加入Mesh网络,需要网内的配网节点(Provisioner)的授权。
节点主要有以下五种网络角色:
- a. 低功耗节点-Low Power Node: 长期处于休眠并偶尔唤醒接收数据并交互的节点;
- b. 好友节点-Friend node: 存储低功耗节点消息,并在低功耗节点醒来时刻将消息发送给低功耗节点的那个节点
- c. 中继节点-Relay node: 拥有中继特性的节点,能够将收到的消息转发送出去,它承担着扩展网络覆盖范围的职责,消息可以多次跳跃到其他的节点,以覆盖整个 mesh 网络。信息的传送和跳跃的次数受到TTL(Time To Live) 的字段进行控制,此字段指定了消息在 mesh 网络中的跳跃次数,每次被中继一次,TTL 减一,当 TTL 为 0 的时候,停止中继
- d. 代理节点-Proxy node: Proxy 节点的特性是支持传统的 BLE 蓝牙协议栈(GATT 规范)和 mesh 协议栈,可以让这个不支持 mesh 特性的设备,通过 GATT 与 Proxy 交互,与 mesh 网络中的任何节点进行通信。
- e. 普通节点-No relay node: 没有中继功能的节点,也称为普通节点。普通节点可以实时地收发消息,但是无法转发其它节点的消息.
Element(元素)、模型(model)和状态(state)
- 元素是蓝牙Mesh网络中的一个逻辑实体,它代表了一个节点上的特定功能或服务。每个元素都有自己的唯一标识符(Element Address),并且可以包含一个或多个模型。
定义:元素是节点内部的逻辑分区,它封装了特定功能的操作和状态。
功能:元素可以独立于其他元素被网络中的其他设备访问和控制。
例子:一个智能灯泡可以是一个元素,它可以包含控制亮度、色温等的模型。
- 模型是定义在元素上的一组操作和状态,它描述了元素可以执行的动作以及可以报告的状态信息。
定义:模型是元素上的抽象层,它定义了元素的行为和功能。
功能:模型为网络中的设备提供了标准的接口,以便它们可以与特定功能的元素交互。
例子:一个开关模型允许远程控制元素的开启或关闭,而一个亮度模型允许调整元素的亮度。
- 状态是模型中的一个属性,它描述了模型在某一时刻的具体值。状态可以随着时间变化,并且可以被读取或设置。
定义:状态是模型的一个具体值,它反映了模型当前的状态。
功能:状态是模型操作的结果,它可以是静态的(如开关的开/关状态),也可以是动态的(如亮度值)。
例子:一个开关的状态可以是“开”或“关”,而一个亮度状态可以是“50%”
消息:
分为 ack消息和no ack 消息。节点与节点之间的数据传输,我们称之为 message,在规范中定义了多种消息的类型,每种消息都有自己唯一的操作码来进行区分.
节点地址和元素地址
节点地址(Node Address)
定义:节点地址是蓝牙Mesh网络中单个节点的唯一标识符。每个节点在整个Mesh网络中都是唯一的。
范围:节点地址是全局唯一的,它用于在整个Mesh网络中寻址和识别节点。
用途:节点地址用于网络层,它允许节点在网络中进行路由和数据传输。每个节点可以包含一个或多个元素,但节点地址不区分这些元素。
类型:节点地址可以是单播地址或组播地址。单播地址用于指向单个节点,而组播地址用于广播到一组节点。
元素地址(Element Address)
定义:元素地址是蓝牙Mesh网络中节点上单个元素的唯一标识符。每个元素在其所属节点内是唯一的。
范围:元素地址在节点内部是唯一的,但不是全局唯一的。不同的节点可以包含相同元素地址的元素。
用途:元素地址用于应用层,它允许对节点上的特定功能或服务进行寻址和操作。每个元素可以独立于其他元素进行配置和控制。
类型:元素地址也是单播地址,用于指向节点上的特定元素。每个元素地址关联到节点地址以及该元素在网络中的具体位置。
区别总结
唯一性:节点地址是全局唯一的,而元素地址只在节点内部唯一。
作用层次:节点地址作用于整个节点,而元素地址作用于节点上的特定功能或服务。
网络层与应用层:节点地址用于网络层,元素地址用于应用层。
寻址:节点地址用于寻址整个节点,元素地址用于寻址节点上的特定元素。
地址的分类:
在蓝牙Mesh规范中,将地址分为四类:
a. 单播地址(Unicast Address)用于唯一标识网络中节点的元素地址。
b. 组播地址(Group Address)用于表示网络中的组地址,组地址可以被一个或多个节点所共有。组播地址要么是动态分配的,要么是蓝牙技术联盟预先定义的(SIG固定群组地址)。蓝牙技术联盟已经定 义了4个固定组播地址,即 All-proxies, All-friends, All-relays 及 All-nodes。
c. 虚拟地址(Virtual Address)作用类似与组地址,不同点在于其地址空间为2^16。
mesh 支持虚拟地址可以赋给一个或多个元素,横跨一个或多个 节点。虚拟地址与128位UUID的形式类似,任何元素都可以与其相关联,它更像一个标签;
d. 未分配地址 (Unassigned address)表示此地址不能被使用。
在蓝牙mesh中,也是以发布和订阅方式进行消息传输过程的
在传统的 BLE 机制中,运行启用加密,也允许不加密,进行数据的传输。在 mesh 网络中,网络加密具有强制性,即不管是网络还是单个应用的数据,都需要加密;所有的mesh消息都要经过加密和认证
蓝牙mesh网络安全性的核心是三种安全密钥。
网络安全性,应用安全性,设备安全性 相互独立, 在mesh网络中,可以通过密钥刷新程序来更新 节点的安全密钥。设备添加到mesh网络从而成为节点的过程本身就是 是一个安全的过程。以下为三种类型的密钥:
a. 网络密钥 (NetKey): 蓝牙mesh网络里的每个节点都有一个相同的网络密钥 (NetKey)。正是这个密钥才使得节点成为这个网络的一员。 网络加密key与隐私key都是由这个网络密钥生成的。节点可以利用NetKey来加密和认证网络层,这样诸如中继之类的网络功能就可以执行了。但是NetKey不能加密应用数据。蓝牙mesh网络可以分成几个子网络,每个子网络都有 其单独的NetKey,这个NetKey只有当前子网络成员节点才 有,其它节点没有。这个是在网络层加密解密,是节点加入网络时使用。
b.应用密钥(AppKey): 只有拥有应用密钥(AppKey)的节点 才能解密相应 的应用数据。在一个mesh网络中,可以有许多不同的 AppKey,每个AppKey 对应一种特定的应用(照明应用, 热力应用,门窗安全系统应用等)。例如,灯和开关拥有 灯应用的 AppKey,但是没有热力系统的AppKey,只有网 络中的温度调节装置才拥有热力系统的 AppKey。这个是网络中通信过程中使用。
c. 设备密钥(DevKey): 这是一种特殊的应用密钥。每个节点都有一个独一无二的设备密钥,这个密钥只有启动配置设备(如手机)知道。设备密钥可以用 在开通配置过程,以确保启动配置设备与节点之间的安全通讯。这个是出厂时配置,仅用于配置服务器与节点之间的安全通信。
开通配置(Provision)
设备在正式成为 mesh 网络节点之前,只能被称之为一个“未开通配置设备”(unprovisioned devices),也就是说,这种未开通配置的设备并没有办法与一个已知的 mesh 网络中的节点进行数据交互。想要成为某个 mesh 网络的节点,需要有一个流程叫“开通配置”,即,将某个“未开通配置设备”转化为网络节点的过程成为“开通配置”(provisioning)。
ble mesh 协议栈
从下往上说:
BLE的链路和物理层,就是提供实际的通信能力,mesh网络的基础
承载层:广播承载和GATT承载,就是数据怎么传递,通过广播还是GATT
网络层:定义了地址,寻址,路由,转发
下传输层:数据包的分包和重组
上传输层:使用application key对数据进行加解密(上面往下发的加密,下面发过来的解密),传输控制消息处理(心跳协议,友谊协议等)。
接入层:它定义了应用程序数据的格式;定义并控制在上层传输层执行的应用程序数据加密和解密;并检查收到的是否是已订阅的数据
基础模型层:定义了配置和管理网状网络所需的状态、消息和模型。就是mesh网络所必须的模型
模型层:用户自定义的模型
应用层:定义用户需求
配网过程:
beacon广播(新的GAP广播类型),声明自己是未经启动配置的设备,
邀请:启动配置设备Provisioner,发送启动配置邀请PDU给beacon 设备,beacon设备回复一系列自身信息,例如元素数量,所支持的加密算法,输入输出类型等等,这些信息回用于认证步骤
交换公钥:通过非对称加密算法来创建安全通道,已完成剩余的启动配置过程。(可以通过OOB的方式提供公钥)
认证:基于配网器和未配置设备的输入输出能力等信息,完成具体的加密过程
分发配网数据:主要就是netkey和未配置设备在该网络中的单播地址
移除节点:
在配网器中将要移除的设备加入黑名单,然后,除了黑名单中的节点,网络中的所有节点都会被发放新的网络密钥、应用密钥、以及所有相关衍生数据。
配置过程:
Link Establishment流程
- Unprovisioned device发送Beacon广播,意思就是告诉provisioner期待入网,并且Unprovisioned device的uuid为16个byte全0
- 配网者选择一个Unprovisioned Beacon,然后向该设备发送一个Link Open消息,该消息带有该设备的Device UUID,并在PB-ADV的Link ID字段填上一个未使用的ID值。
- 未配网设备收到Link Open消息后,需要响应一个Link ACK消息,其消息的Link ID字段为接收的Link Open的Link ID。
- Link通道建立完成后,两者之间进行配网流程。(邀请,交换公钥,认证,分发配网参数)
- 配网结束发送Link Close关闭通道。
配网流程:
① 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后,两端计算ECDHSecret值。接下来进入第三阶段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消息ConfirmationProvisioner。
⑪ 设备端收到Random消息后,验证无误后,响应Provisioning Random消息,其参数域值为ConfirmationDevice。
⑫ 配网者收到后验证random值的有效性。开始进入第四阶段,配网数据的的分发。配网者发送Provisioning Data PDU,包含设备需要的配网信息,其中的信息通过授权后的数据信息进行加密传输。
⑬ 设备收到数据后,响应Provisioning Complete消息,配网结束。
⑭ 若配网期间出现错误,发送Provisioning Failed消息给对端,配网结束。
⑮ 配网结束后,发送Link Close消息关闭链路。
配网数据包格式:
参考文章:
https://blog.csdn.net/XiaoXiaoPengBo/article/details/147954790
https://zhuanlan.zhihu.com/p/5157239304