蓝牙mesh基础(基本概念)

1. 背景

之前大多数BLE设备都是进行一对一的数据通信。这是一种点对点的网络拓扑类型,在蓝牙核心规范中被称为”微微网“(piconet)。
假设一个智能手机与一个心率检测器建立了一个点对点的连接,这样它们之间就可以传输数据了,蓝牙的一个优点就是可以让设备建立多个连接,所以这个智能手机可以再与另一个运动追踪设备建立连接。此时,手机可以同另外两个设备进行通信,而这两个设备之间无法直接进行通信。
与上述情况相反的是,mesh拥有多对多的网络拓扑类型。每台设备都可以与网络中的其他设备进行通信。设备之间的通信以消息的形式传递,一台设备可以将某一台设备发来的消息中继到另一台设备,这样就可以扩展端到端的通信范围,这个范围远超过一个单独设备蓝牙无线电所覆盖的范围。
在这里插入图片描述

2. 设备和节点

mesh网络中的单台设备称为节点(node),网络外的设备称为“未开通配置设备”(unprovisioned devices)。将某台“未开通配置设备”接入网络成为网络节点的过程称为“开通配置”(provisioning)。例如,新买的带有mesh功能的蓝牙灯,需要进行简单配置才能将其加入家中原有的蓝牙mesh网络中,这样就可以通过家里的电灯开关与调光器对其进行控制了。这个过程就是“开通配置”。
“开通配置”过程是每台新设备都要经历的,在这个过程中,新设备会获取一系列的密钥,同时告知“启动配置设备”(provisioner device, 通常是智能手机或者平板电脑)有新设备加入到网络中。其中有一个密钥叫做网络密钥,即NetKey,这个是为了提高mesh的安全性,后续会讲解。

3. 元素

有些节点由多个独立的部分组成,每一个部分都可以进行单独的控制。在蓝牙mesh中,这些独立的部分称为元素(element)。如图1,网络中的一个灯节点,它有5个元素,每个LED灯泡有一个元素。每个节点至少拥有一个元素,称为主元素(Primary Element)。节点中的每个元素都有一个唯一确定的地址,称为单播地址(unicast address),这样每个元素都可以独立寻址。
图1. 五个元素组成一个灯节点

4. 消息

当某个节点需要获取其他节点的状态时,或需要以某种方式控制其他节点,它会发送消息(message)。如果某节点需要向其他节点汇报状态,它也会发送消息。在mesh网络中,所以通信都是以消息的形式传递的。协议规范中定义了多种消息类型,每种消息类型都有自己唯一的操作码。
对于应答与否的方面,消息可以分为两种类型:需要应答和不需要应答。需要应答的消息要求接收节点接收到消息后返回一条响应信息。这条响应信息有两个作用:

  1. 告知消息发送方,消息已接收。
  2. 返回消息接收方需要告知发送方的某些数据。
    需要应答的消息如果没有得到响应,则可能会被发送多次,所以这种消息必须具有幂等性。幂等性意味着这种消息不论到达接收节点多少次,与其到达接收节点一次产生的效果都是相同的。否则如果因为某些意外,消息多次到达接收节点,则有可能使接收节点的状态变得不确定。
    不需要应答的消息不要求接收者发送响应消息。
    某个特定类型的消息可以对一个或多个状态值进行操作。消息也可以分为3类:GET、SET、STATUS,对应于蓝牙mesh网络支持的3种操作。
    GET消息可以用来向一个或多个节点请求状态值,之后,相应节点会返回STATUS信息,告知请求的状态值。
    SET消息可以改变既定状态的值,有些SET消息需要应答,要求返回一条STATUS消息,有些消息不需要应答。
    STATUS消息可以用来应答GET消息,也可以用来应答SET消息或者通过某元素中的定时器定时发送。
    我们可以通过消息操作码(opcode)识别到特定状态。另一方面,我们也可以在通用属性相关消息中使用16位属性ID来直接引用属性。

5. 地址

消息必须从一个地址发送到另一个地址。蓝牙mesh协议中定义了3种地址(不包括未分配地址)
单播地址用于唯一确定单个元素。在“开通配置”过程中,会将单播地址赋给设备。
群组地址是一种多播地址,它可以代表一个或多个元素。群组地址要么是动态分配的,要么是蓝牙技术联盟预先定义的(SIG固定群组地址)。蓝牙技术联盟已经定义了4个固定群组地址,即All-proxies,All-friends,All-relays及All-nodes。我们可以通过配置应用程序来建立动态群组地址,这些地址反映了一栋建筑的某些实体分配,例如为大楼里的每一个房间定义一个群组地址。
虚拟地址可以赋给一个或多个元素,横跨一个或多个节点。虚拟地址与128位UUID的形式类似,任何元素都可以与其相关联,它更像一个标签。
虚拟地址可以在出厂前就进行预先配置,然后用于某些特定场景,例如使某个厂商制作的投影仪的寻址更加方便。

6. 状态和属性

元素可能处在各种条件下,在蓝牙mesh中称之为状态(state)。一个元素可以有多个状态,每个状态都是一组特定值。状态与特定的行为有关,不能在其他地方重用。
例如,蓝牙mesh定义了通用开关状态来形容某个电灯可能存在的状态,为其赋值1,电灯打开,为其赋值0,电灯关闭。
属性(property)与状态类似,它们都包含与元素相关的数值,但在其他方面二者存在显著差异。
熟悉BLE的朋友应该了解特性(characteristic),它们是一种没有与特定行为相联系的数据类型,这样它们就很容易得到重(chong)用。利用上面提到的属性,可以将特性与具体含义相联系。有一点需要特别注意,这里的属性(property)与BLE协议栈中的属性(attribute)是完全不同的,为了防止混淆,我们也可以将前者翻译成“性质”(property)。

7. 模型

模型将之前提到的概念组合在一起,定义了元素的功能。当前蓝牙mesh规范中一共定义了3类模型。
第一种是服务器模型(server model),定义了一系列的状态、状态转换、状态绑定以及模型中元素可以收发的消息。同时它也定义了与消息、状态、状态转换相对应的行为。
第二种是客户端模型(client model)没有定义任何状态,它只定义了几种消息。可以利用这些消息来对相应服务器模型中的状态进行操作,如GET、SET和STATUS。
第三种是控制模型(Control model)包含一个服务器模型和一个客户端模型。服务器模型可以用来与其他客户端进行通信,而客户端模型可以用来与其他服务器模型进行通信。
可以通过扩展某个模型来创建新的模型。不过有一种模型不能扩展,这种模型称为root模型。
模型不能被改变,也就是说不能向模型中加入或移除相关行为。实现新模型的唯一方法就是扩展已经存在的模型。

8. 特性

所有的节点都可以发送和接收mesh消息,但是也可以单独赋予某些节点额外的特性,使其拥有某些特定功能。一共有四种特性可以选择:中继(Relay)、代理(Proxy)、友(Friend)和低功耗(Low Power)特性。每个节点都可以支持以上四种特性中的0个或者多个,而且随时可以取消已经配置好的特性。

猜你喜欢

转载自blog.csdn.net/panpan_jiang1/article/details/126533066