参考资料:
https://zhuanlan.zhihu.com/bluetooth-mesh
https://blog.youkuaiyun.com/weixin_40204595/article/details/81672523 一、Mesh关键术语
(1)设备和节点
一个Mesh设备,在未配入Mesh网络时,叫“设备”,当被配置加入一个Mesh网络后,叫“节点”。 比如,去超市买了个蓝牙mesh的灯,用之前就是个设备。等到把它连上建立的Mesh网络,可以和开关什么联动的时候,它才是一个节点。
(2)元素
定义:是在设备中可以寻址访问的实体。比如一个灯,其中有三个子灯,那么这一整个灯,就叫一个节点(当然指的是在入网后),这三个子灯就叫这个节点的元素,每个子灯都可以独立被控制。如下:
每个节点至少拥有一个元素,称为主元素(Primary Element),同时还可能包含其他多个元素(图3)。元素由定义节点功能和元素条件的实体组成。例如,一个灯泡内有一个元素, 并具有两种功能:
- 节点 = 灯泡*
- 一个元素 = 主元素
-
- 节点功能
-
- 开/关
-
- 亮度
-
- 元素条件/状态
-
- “开”或“关”
-
- 0 – 10 (亮度等级)
图 3 –节点必须至少有一个元素,也可能包含多个元素
节点中的每个元素都有一个唯一的地址,称为单播地址(unicast address),使每个元素都有址可寻。我们将在后续的解密蓝牙mesh系列文章中进一步解释“寻址”。
(3)消息
消息是蓝牙Mesh里的一个重要概念。当一个节点需要查询别的节点的状态(Status)或者控制别的节点的时候,就需要发一个对应类型的消息。当一个节点向其他节点报告状态改变的时候,它也需要发出一个消息。在蓝牙Mesh里面定义了很多种类型的消息,每种消息都有对应的操作码(opcode)。消息可以按照有应答(acknowledged)和没应答(unacknowledged)来分类。 和大多数的通讯系统一样,有应答的消息需要接收节点给个响应
(4)地址
要发消息,我应该发给谁呢?那一定会从一个地址发给另一个地址。在蓝牙mesh里面定义了四种类型的地址:
单播地址(unicast address)
组播地址(group address)
虚拟地址(virtual address)
未分配地址(Unassigned Address):未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,它们不会用于消息的传送。
单播地址可以唯一性的识别出一个元素。这个地址是在配网的时候分配给设备的。一个mesh网络可以有32767个单播地址。在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。发送到单播地址的消息只能由一个元素进行处理。
组播地址是一个表示一个及以上元素的广播地址。
组播地址可以由蓝牙SIG来定义(SIG Fixed Group Addresses), 也可以动态分配。目前SIG定义了4个组播地址,分别是“All-proxies”, “All-friends”,“All-relays” and “All-nodes”。
动态分配的组播地址是设计成在用户配置的时候,可以分配代表一些实际的场所,比如可以定义几个组播地址代表几个不同的房间。一共可以有16384个组播地址,其中SIG保留了256个,其他16128个都是动态分配的。
组播地址是蓝牙mesh网络中的另一种多播地址(multicast address),它通常代表一个或多个节点中的多个元素,包含两种类型:
- 动态分配的地址(Dynamically Assigned) -> 0xC000-0xFEFF
- 固定地址(Fixed Address) – 由蓝牙技术联盟分配,分为五段:
- 保留供将来使用 (RFU) –> 0xFF00-0xFFFB
- All-proxies -> 0xFFFC - 发送到启用代理(proxy)功能的所有节点
- All-friends -> 0xFFFD - 发送到启用friend功能的所有节点
- All-relays -> 0xFFFE - 发送到启用中继(relay)功能的所有节点
- All-nodes -> 0xFFFF - 发送到所有节点
发送到固定节点的所有消息都由节点的主元素(primary element)进行处理
虚拟地址是个挺有意思的概念。虚拟地址是与特定的UUID标签相关联的一组元素;这些地址可能会被发布或订阅。UUID标签是与多个来