LV03-02-蓝牙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设备开发指南 | 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容 |
一、蓝牙Mesh的网络层次
1. 有哪些层?
如下图,我们寄一封信件,也有通过不同的层,可以根据这个理解:
2. 分包重组
为什么要分包?因为我们在物理层每次发送的数据是有限的,不可能说是数据一次就全部发出去,所以就要对数据进行分包和重组。
二、洪泛管理
在一个蓝牙的Mesh网络中,我们现在想要把消息从A发送到T,但是两个蓝牙之间的通信距离是有限的,这个时候我们就可以规定一下,我们这个网络中的设备,收到一条消息后,如果判定不是发给自己的,那就进行转发,转发到周围的设备中,这样就会有更多的节点收到这个消息,最终一定会传输到目的设备。
但是这样会有一个问题,就是,现在A将消息广播发送给BQP三个设备,这三个设备对消息进行转发,它们同样会将消息发回给A,当A收到BQP转发的消息的时候发现,它不是发给自己的,那么A就会继续转发给BQP,虽然第一次,BQP已经将消息发往别的设备,但是这里A的重复广播,会导致BQP也重复发送消息。这就会形成网络风暴,一直转发这一条消息。为解决这个问题,就应用到了消息缓存队列,当A把消息发出去的时候,会在对应的消息队列中缓存消息,当A重新收到消息的时候,会去和自己缓存里面的消息比对,若是发现存在这条消息,就不会再转发,也不会做处理,Mesh网络中所有的消息都有这样的一个队列,这样就可以避免一条消息,重复的在设备之间广播。
这样还会有一个问题,就是T设备若是已经收到了消息,并执行了,但是Mesh网络比较大,这条消息可能还在其他设备之间进行广播,一直到所有的设备都接收到一次这个消息,这样不就造成了资源的浪费?怎么处理呢?这个时候就出现了一个消息寿命的概念,还记得前面分包重组那张图里面有一个TTL字段,这个就是表示消息寿命,它是一个值。它最大可以赋值为128,每转发一次,这个值就会减1,直到减为0,减去发送者,减去执行者,也就是说,消息在Mesh网络中最多被转发126次。对于大型的Mesh网络,就不会说是所有的设备都接收一遍,但对于小型的网络,可能还是会每个设备都处理一次。当然,后面会有更好的解决方法。
三、四大节点
蓝牙Mesh的灵活度体现在它有四种节点:
未配网设备在配好网,被纳入网络后,可称之为节点。蓝牙mesh网络中,节点可以有选择地支持四大功能——朋友、低功耗、转发、代理功能。对应功能的节点就被称为代理节点、低功耗节点、转发节点和朋友节点。
代理节点(Proxy):可以实现通过手机APP对其配网,可以连接到手机。我们要想操作某一个IOT蓝牙设备,我们是不能直接使用手机把消息发给IOT设备的,需要通过代理节点转发数据,这是因为蓝牙Mesh网络的数据是不可被发现,不可被连接的。
转发节点(Relay):通过广播承载层接收并重新发送mesh消息、以构建更大规模网络的能力。
朋友节点(Friend):结合低功耗节点使用,两者必须成对出现。低功耗节点的低功耗,一部分要归功于朋友节点,朋友节点可以说是包揽了低功耗节点的消息“接收”功能。就像“菜鸟驿站”和“收件人”,在消息传递给与朋友节点相连的低功耗节点时,朋友节点会先代收(菜鸟驿站收到包裹),再由低功耗节点定时询问朋友节点是否有消息,有则接收(收件人去取件),没有就下次再说。这就给低功耗节点节省了功耗,不用时刻去抓取广播层中的数据,查看是否是发给自己的(收件人有自己的学习工作,不用不停地查询是否有包裹)。
低功耗节点(Low-Power):我们可以理解为那种带纽扣电池的,功耗非常低的设备。就比如自动窗帘,我们就使用的时候激活一下,剩下的时间可能都在待机,所以功耗就会很低很低。
在上图中,假设T为我们的手机,现在我们想要获取A的某个状态。这时候我们要先把这个想法封装成消息发给代理节点S,然后代理节点S就会把消息广播出去,这个时候NREUGO都会收到这条消息。除了转发节点R之外,剩下的节点都没有转发功能,并且判断到消息不是发给自己的,那么就会丢弃这条消息。然后R节点就会将这个消息继续进行转发,HQESN节点也都会收到这条消息,但是ENS三个节点之前已经接收到一次了,这里会直接选择丢弃,剩下的HQ节点中,只有Q节点具备转发功能,这个时候消息就到了Q,Q再进行转发,就可以到A啦,A将数据返回的时候进行同样的操作。
四、几个概念
1. 节点和设备
在蓝牙Mesh网络中,我们通常把没有加入到蓝牙Mesh网络的设备叫做为配网设备(Unprovisioned Device),未配网设备加入一个蓝牙Mesh网络编程节点的过程叫做配网过程(Provisioning),在蓝牙Mesh中,通常是由一个配网器(Provisioner)来将未配网设备进行配网从而变成蓝牙Mesh网络中的一个节点。
节点进入蓝牙Mesh网络后,节点自身具备配置服务端(Configuration Server)的功能,可以被网络中已存在的配置客户端(Configguration Client)管理,例如,配置节点的转发功能,配置节点的订阅地址或者将节点移除蓝牙Mesh网络等。
2. 元素
一个节点是由元素组成的(开发中比较关键),节点至少要包含一个元素(Pimary Element),也可以包含多个元素,每个节点里包含的元素个数和结构是固定的,每个元素都有自己的地址,主元素的单播地址在配网过程中由配网器下发,而节点中其余元素的地址则依序增加。
3. 状态
状态(State)用于表示节点中元素处于的某个某一个特定状态。元素的状态是通过客户端-服务端的机制进行访问的,例如,某个节点(比如插座)中的元素有通过开关模型开关服务,用来代表这个元素的状态,另一个节点的元素里(比如开关按钮)有通过开关模型的开关客户端,这样就可以通过开关按钮上的开关客户端发送开关模型定义好的消息去访问或控制插座上开关服务的开关状态。
4. 地址
蓝牙Mesh网络节点的地址由一个16bit的编码,地址共分为4类:未分配地址(UnassignedAddress)、单播地址(Unicast Address)、组播地址(Group Address)、虚拟地址(Virtual Address)。其中未分配地址是0x0000,通常用于屏蔽一个设备;单播地址分配给节点中的某个元素,
用于对这个元素寻址和定位,在一个蓝牙Mesh网络中,一共有32767个单播地址,范围是从0x0001 ~0x7FFF。
地址 | 备注 |
---|---|
0x0000 | 未分配地址 |
0x0001 – 0x7FFF | 单播地址 |
0x8000 – 0xBFFF | 虚拟地址 |
0xC000 – 0xFFFF | 组播地址 |
虚拟地址的范围是从0x8000 ~ 0xBFFF,虚拟地址用于表示在一个或者多个节点里的多个元素。每个虚拟地址都和一个标签(Label UUID)的哈希码对应,总共有16384个虚拟地址可供使用,而每个虚拟地址都能应对上百万个标签,所以可以认为虚拟地址的数量是无穷尽的。
组播地址的范围是从0xC000到0xFFFF,在一个蓝牙Mesh网络中,一共有16384个组播地址,组播地址和虚拟地址类似,都能用于表示一个或者多个节点里的多个元素,组播地址包括了256个固定组播地址和16128个可供动态分配的组播地址。
5. 模型
模型(Mode)定义了节点具备的基本功能,包含实现了这个功能的所必须的状态和操作状态的消息及其他一些行为。一个节点中可以包含多个模型,在蓝牙Mesh网络中的应用也被定义成着三个模型:服务端模型、客户端模型和控制模型。
服务模型:服务模型包含了一个或者多个元素上的一种或多种状态,服务端模型定义了一系列的必要消息,以及元素收到这些消息时的应对方式。
客户模型:客户模型定义了一系列的消息,用于客户端去请求、设置服务端的状态。客户端模型不需要有任何状态。
控制模型:控制模型可以包含一个或者多个客户端模型,用来和其他节点的服务端模型通信,也可以包含一个或者多个服务端模型,用于响应其他节点客户端模型发来的消息,先了解这么多就可以了,因为SDK已经帮我们封装好了,对于开发来说先不需要了解太多。