LV03-03-蓝牙Mesh进阶-02-蓝牙Mesh配网流程
本文主要是蓝牙Mesh进阶——蓝牙Mesh配网流程的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu22.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | 阿里云 | 阿里云官网主页 |
阿里生活物联平台 | 生活物联网平台(飞燕平台)主页 | |
AliGenie | 天猫精灵开放平台AliGenie主页 | |
阿里物联网平台 | 阿里物联网平台主页 | |
Bluetooth 技术网站 | 蓝牙协议规范什么的可以来这里找 | |
Telink | Telink | Chips for a Smarter IoT (telink-semi.com) Telink中文官网 | |
开发手册 | AliOS Things开发指南 | AliOS Things开发指南,这里是最新版本,可以直接从官网找到 |
AliOS Things开发指南 | AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档 | |
AliOS Things开发指南(3.0) | AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档 | |
生活物联网平台开发文档 | 生活物联网平台(飞燕平台)开发文档 《设备端开发指南》 | |
Wi-Fi IoT品类定义与功能开发 | 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发 | |
硬件平台 | mk3080 WiFi开发板 | WiFi开发板使用指南-阿里云开发者社区 |
esp8266开发板 | 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com) | |
TLSR8258 Datasheet | Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258 | |
参考资料 | AliOS Things 3.0 应用开发指南 | 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考 |
IP知识百科 - 华为 (huawei.com) | IP的一些相关知识点 |
点击查看相关文件下载
分类 | 网址 | 说明 |
蓝牙规范相关文档 | Core Specification 5.2 | 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。 《Core_v5.2.pdf》 |
Mesh Model(v1.1) | 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。 本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。 《MshMDL_v1.1.pdf》 | |
Mesh Profile(v1.0.1) | 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。 《MshPRFv1.0.1.pdf》 | |
Mesh Device Properties | 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。 但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》 | |
GATT Specification Supplement | GATT Specification Supplement | Bluetooth® Technology Website。 好像可以在线看:《GATT Specification Supplement》 | |
Assigned Numbers | GATT的一些类型定义可以在这里找。 | |
AliOS Things | alios-things/AliOS-Things | Gitee上的AliOSThings SDK源码仓库 |
alibaba/AliOS-Things | GitHub上的AliOSThings SDK源码仓库 | |
天猫精灵蓝牙Mesh协议栈 | alibaba-archive/genie-bt-mesh-stack | GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。 之前是在alibaba/genie-bt-mesh-stack这个仓库。 写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a |
蓝牙Mesh设备开发指南 | 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容 |
我们在使用Wi-Fi会配网,使用蓝牙会配网,以及其他的无线设备都会存在一个匹配的过程,本章内容着重阐述为什么要配网以及配网的过程中解决了哪些问题,通过蓝牙Mesh入网过程,同时可以理解几乎所有无线网络的配网流程以及它背后的含义。
一、入网的目的
Provisioning is a process of adding an unprovisioned device to a mesh network,managed by a Provisioner. A provisioner Provides the unprovisioned device with provisioning data that allows it to become a mesh node. The provisioning data includes a network key,the current IV index,and the unicast address for each element.
通过官方定义(《MshPRFv1.0.1.pdf》的第五章),我们可以看出,入网的过程就是把一个未配网的设备加入到Mesh网络中的过程,配网器会给未配网的设备提供一些数据让它变成Mesh中的一个节点,其中包括network key、当前的IV index还有每个元素的单播地址(对此三个参数请参考Mesh协议章节中)。
二、入网过程
1. 邀请
邀请可以对应我们在手机配对蓝牙耳机或者蓝牙鼠标的模式,我们通过扫描发现了可入网的设备,点击配对就是对蓝牙设备进行了入网的邀请,对于所有配网设备来说无疑必须要有此操作,不然我们的设备到底要加入哪一个网络就不得而知了,打个比方,我们在公司打算邀请好朋友去吃饭,如果我们不告诉我们的好朋友,他怎么知道晚上要和我们去吃饭呢?这是一个道理,我们的设备进行通信首先要邀请它进入到我们的对话空间,对方同意之后在进行一步的操作。
2. 加密成安全通道
一般的无线通信技术都会使用ECDH椭圆曲线非对称加密来创建一个加密通道进行通信,此处如何理解呢?同样打个比方,在战争时器为什么会有摩斯密码的出现呢?其根本是为了解决敌方收到我的消息,但是不能够明白我想要表达的具体含义。对于无线通信当然最直接的就是,不让黑客知道我们无线配网时的关键信息,如果被黑客知道后果不堪设想,这部分我们会在安全中详细学习。
3. 认证
认证可能直接从技术上理解会比较抽象,举个例子,当我们收到熟悉人打来的电话,声音也是本人的声音问我们借钱缴纳住院费,但是我们才刚刚分开没多久认为这是不可能的,但是对方的声音和电话号码全都吻合这时,我们应该怎么办呢?很直接的一个办法,我们约一下面谈此事,对于无线通信来说身份伪装并不是一个技术难点,所以在保证无线通信安全性上面必须要想到这一点,让对方裸漏在我们面前交换信息,这样才能真正的保证通信安全。
4. 分发密钥
分发密钥阶段为入网的最后一个阶段,可以从上文看出,我们已经建立的最安全的通信方式,此时配网器需要给设备分发一些数据,就如同我们入职一家公司,会给我们发部分规范文件、工牌、社保卡等等,对应蓝牙Mesh中就是分发了Network key、当前的IV index还有每个元素的单播地址。
三、蓝牙Mesh配网过程
蓝牙Mesh入网流程相比上面所说的四个步骤增加了一个交换公钥的阶段,出于安全考虑不同的无线通信设备都会对自己的具体实现做出一些修改,宏观上依然是上面讲述的四步。蓝牙Mesh入网五个阶段,分别是信标阶段、邀请阶段、交换公钥交换、身份验证阶段和分发密钥数据阶段。
1. 几个名词
在每一步的之前,需要先了解几个专属名词:
1.1 配网角色
(1)未配网设备(Unprovisioned Device):还没有加入到任何Mesh网络中的设备。
(2)配网器(Provisioneder):用来给未配网设备配网配网的,比如:天猫精灵
(3)Mesh节点(Mesh Node):已经加入到蓝牙Mesh网络的每一个节点。
实际上我们的配网过程,就是将未配网设备变成一个Mesh节点,所以每个设备都有可能是以上三种角色的任意角色,对于配网器来说,在已经入网的节点都有可能变成配网器的身份。
1.2 蓝牙Mesh配网协议
1.2.1 协议框图
配网协议与此前讲述的蓝牙Mesh通信协议有共同之处,很显然对于空中数据包的接收必然是一样的,只不过在识别为是Beacons数据包的时候走了不同的分支处理,就和我们作分类是一个道理,在一条传送带上放着iPhone和iPad,通过什么方式将两个产品分开呢?最直观的方式通过大小的区分,在蓝牙空中数据包中,我们需要通过类型(Type)来区分不同的数据种类进行不同的处理。
我们可以看一下《MshPRFv1.0.1.pdf》的5 Provisioning一节,这一章最开始的时候有配网协议图:
上图可见,对于配网协议的分层只有三层,分别为Provisioning Bearer Layer层、Provisioning Transport Layer层和Provisioning Protocol。与此前Mesh通信协议对比,Bearer层上接收到的数据是相同的,只是通过判断了类型进行了分支语句的处理。
1 | //广播包的流程框架 |
1.2.2 配网数据包PDU格式
我们可以看一下《MshPRFv1.0.1.pdf》的5.4.1 Provisioning PDUs一节:
为什么又有这么多类型?是因为在入网的时候有很多不同的阶段,不同的阶段都需要加以区分,就会产生这么多的类型。
2. 配网步骤(ADV模式)
2.1 信标阶段(Beacons)
信标(Beacons)阶段主要是未配网设备在广播自己要加入Mesh网络中,在此之前在蓝牙Mesh协议规范中我们有接触到蓝牙Mesh广播数据类型,回忆下AD Type(《Core_v5.2.pdf》Vol 3, Part C,11 ADVERTISING AND SCAN RESPONSE DATA FORMAT的Figure 11.1)。
当未入网设备在等待配网器发送邀请的期间,会间隔的在空中发送AD Type为0x2B的信标包,AD Data里面则会带有其他信息,如天猫精灵的三元组信息,或者是其他公司的公司ID等等内容,对于配网器来说,扫描到空中有蓝牙数据包即进行识别,随后进行识别AD Type类型,如果是Mesh Beacon,且数据格式与此产品相符则发送邀请,如:天猫精灵找队友,发现为配网设备的Beacon包,并识别其中的三元组信息格式符合天猫精灵蓝牙Mesh规范则进行下一步操作。对应Beacon包格式如下:
Parameters字段 | 长度(字节) | 备注 |
---|---|---|
Length | 1 | Beacon包长度 |
Type | 1 | Beacon包类型,值为0x2B |
Beacon类型 | 1 | 未配网Beacon类型,值为0 |
UUID | 16 | 设备唯一ID |
OOB信息 | 2 | OOB信息类型,如:NFC、二维码,此处对应天猫精灵三元组 |
URL Hash | 4 | URL的Hash值,可以用来帮助识别设备 |
信标阶段流程示意图:
蓝牙Mesh设备上电后如处于未配网状态,需要广播Unprovisioned Device Beacon,每次广播时长不小于120ms,广播间隔500ms,广播持续时间一般为10分钟,具体产品的广播启动方式和广播持续时间以产品需求为准。如果超时后仍未被配网,设备关闭PB-ADV广播。信标阶段发现了设备,同时也要确定该设备是否可被连接,则进行上图的Link Open,类似我叫你一声你敢答应吗?或者我在问你是否准备好,嘿!老兄你在线不?数据包中包含UUID。
各个字段说明如下:
Parameters字段 | 长度(字节) | 备注 |
---|---|---|
Link Open | 1 | Link open=0 GPCF = 3 |
UUID | 16 | 设备UUID |
当配网器发送Link Open给未配网设备时,未配网设备接收到Link Open消息,判断是否为自己的UUID,如果是则返回Link ACK表示应答,代表可以进行通信,准备进入下一阶段,到此信标阶段就结束了。
2.2 邀请阶段
配网器和未配网设备已经建立成功的连接,二者即可以通过PB-ADV或者PB-GATT承载上建立连接进行邀请阶段的数据交互,邀请阶段要完成配网器对未配网设备的设备能力信息,比如是否有屏幕、是否有键盘,这将影响到后面的认证阶段。邀请节点的基本流程如下:
在此过程中会下发如下数据给配网设备:
这个数据是给未配网设备得,其含义是定时,开发者可以设定未配网设备要在多长时间之内进行回复,Attention Timer state的值为0则代表关闭此功能,非零代表剩余时间,单位为秒。
接下来未配网设备拿到配网器的询问之后(询问配网能力)需要在指定时间内进行反馈,反馈内容如下(《MshPRFv1.0.1.pdf》的5.4.1.2 Provisioning Capabilities):
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
Number of Elements | 1 | 未配网设备中的元素个数,涉及到下发地址 |
Algorithm | 2 | 支持的算法和其他功能,目前只有椭圆算法(Elliptic Curve) |
Public Key Type | 1 | 设备公钥类型,是否支持OOB |
Static OOB Type | 1 | 是否支持静态OOB,(out of band 带外数据) |
Output OOB Size | 1 | 输出式OOB最大长度 |
Output OOB Action | 2 | 输出式OOB动作类型,如:LED闪烁、震动、输出数字、输出字母 |
Input OOB Size | 1 | 输入式OOB最大长度 |
Input OOB Action | 2 | 输入式OOB动作类型,如:按键、旋钮、输入数字、输入字母和数字 |
2.3 交换公钥阶段
配网器与未配网设备配网时需要下发地址、网络密钥,这些信息与整个蓝牙Mesh网络安全息息相关,所以蓝牙Mesh规范要求配网器与未配网设备在配网时需要约定加密的方式,确保加密有效需要双方交换公钥在对数据进行解密,如果拿到的值是一致的则认为双方加密有效,举个例子,摩斯密码表的发送与接收需要建立在两人均学习过摩斯密码表后才可以实现,即我们周围的人都能够听见我们各自发声,但只有我们两个才能够听懂,对于蓝牙Mesh来说,在同一网络中所有的Mesh节点都学习了本网络中的加密方式,对于外界获取到该数据包时则不会理解具体含义,具体数据加密过程在蓝牙Mesh协议分层的Network Layer层中详细阐述,配网过程的加密可以看作正在学习该加密方式并且对其数据解密验证。
交换公钥阶段基本流程如下:
在此阶段,配网器会像未配网设备发送Provisioning Start和Provisioning Public Key,看下具体数据内容:
- Provisioning Start
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
Algorithm | 1 | 算法选择,目前仅支持ECDH |
Public Key | 1 | 0x00代表不使用OOB公钥,0x01使用OOB公钥 |
Authentication Method | 1 | 身份认证类型,如设备能力中阐述 |
Authentication Action | 1 | 验证动作,选择OOB输入或者输出等 |
Authentication Size | 1 | 验证长度 |
如果我未配网设备存在OOB公钥则不需要反馈给配网器Public Key,如果未配网设备本身不存在OOB公钥,则需要生成Public Key发送给配网器,Public Key是由Privacy key生成的,每个设备都有自己的Privacy key。互相交换了密钥即相当于建立了安全通道。
2.4 身份认证
在了解完第三步的时候已经建立了安全通道,二者在数据交互时采用了加密的形式,为什么还要有身份认证呢?如果能回答这个问题对于此步骤的内容也就非常清晰了。身份认证有四种形式:
身份认证的基本流程如下:
Provisioning Confirmation:
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
Confirmation | 16 | OOB信息 |
Provisioning Random:
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
Random | 16 | 此随机值为之前双方所交互的所有值和OOB随机数形成的加密散列值 |
2.5 分发配网数据
经历了前面的坎坷,终于可以变身成为蓝牙Mesh的节点了,这就好比我们费劲心思的去回答面试题,作答笔试题,谈好了薪资要正式入职的感觉一样,一起感受一下拿到入职工牌的喜悦吧!
Provisioning Data:
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
Encrypted Provisioning Data | 25 | 包括Network Key、网络密钥索引、IV index、主元素地址等 |
Provisioning Data MIC | 8 | PDU 完整性检查值 |
Provisioning Complete:
Parameters字段 | 长度(字节) | 说明 |
---|---|---|
无 | 无 | 无参PDU,代表配网成功。 |
四、总结一下?
我们看一下《MshPRFv1.0.1.pdf》第五章的这一小节:
从上图中可以得知,蓝牙Mesh如果过程分为五个阶段,分别是信标阶段、邀请阶段、交换公钥极端、身份验证阶段和分发密钥数据阶段。