蓝牙mesh基本概念讲解(2)

时间:2024-03-19 08:19:29

发布和订阅(Publish/Subscribe)

在蓝牙mesh里面发消息的动作我们叫做发布(Publish)。光从字面意思理解大家基本上就能看懂了。我想告诉别人什么事情发生或者做什么事情就叫做发布。谁对某些消息感兴趣就可以订阅这些内容。节点发布消息到单播地址,组播地址或者虚拟地址。节点有兴趣接收这些数据的可以订阅这些地址。

蓝牙mesh基本概念讲解(2)

 

在上图中,开关1 发布信息给组播地址”厨房“, 节点灯1, 灯2, 灯3 每个都注册到了”厨房“这个地址上, 因此他们能收到处理发给厨房的消息。换句话说, 灯1,灯2 和灯3 都能被开关1控制开关。 开关2 发布消息到”餐厅“,只有灯3订阅了"餐厅"这个地址,所以只有灯3能被开关2控制。在这个例子里同样说明了每个节点可以订阅多个确切的地址。同样的,你一定也注意到了,开关5和开关6同样都可以发布消息到”花园“。

状态和属性(States and Properties)

在蓝牙mesh中,元素的不同情况叫做状态(States),状态是一个特定类型的值,在每个元素内部存在。除了本身的值以外,状态还有一些相关的行为。 拿灯来说,蓝牙mesh定义了一个状态叫”Generic OnOff.“  灯收到了一个ON的状态,理解以后就会执行相应的动作比方说 点亮灯泡的行为。

在蓝牙mesh里面的属性它提供一个来解释Characteristic的上下文。举个例子。如果有一个Characteristic,叫做Temperature 8,一个8位的温度状态类型,它有着一些相关联的属性, 包含现在室内环境温度和现在室外环境温度。这两个属性允许一个传感器来发布传感器消息,收到的客户端(关于客户端和服务器端的内容我们后面会讲)会根据属性得知到底是哪个温度信息。

消息,状态和属性的关系 (Messages, States and Properties)

蓝牙Mesh里面,要进行某种操作,就是调用消息这一基本机制。一个给定的消息类型代表了一个对状态的操作或者对多个状态的采集。所有的消息都可以分成三种简单类型:get 、set 、 status。

GET 顾名思义,就是获取一个节点或者多个节点的给定的状态。当收到GET消息以后,STATUS消息就发出来了。当然,它里面带着的是相对应的状态内容。

SET消息分为有应答和无应答两种。如果是有应答的,就会有STATUS消息跟着出来,如果是无应答的话,那就没有应答包。

STATUS 消息,除上面的两种情况会出现之外,也可以在其他的消息中出现,当然也可以独立出现。比方说某个元素用定时器每隔一段时间发送一次。

在蓝牙mesh里面定义了很多种消息,通过Opcode来区分,还包含了相关联的参数和行为。Opcode可以是单字节,双字节(常见)或者三字节(厂商指定)。

绝大部分的mesh消息都是对状态进行操作的,只有特别的和属性相关的消息,才会对属性进行操作,而且需要制定16位的属性ID。

 

状态转换(State transitions)

上面说到了状态的设置和获取,那么在进行状态改变的时候,这种改变可以是立刻发生的,也可以是过一段时间发生的。下图把不同的时间给表示出来了。

蓝牙mesh基本概念讲解(2)

 

初始化状态(initial State)是指刚收到SET新的状态值的时间。从收到SET消息到状态改变的时间叫做转换时间。从STATUS消息发出(可以在中间的任何时间点)到目标状态完成这个叫保持时间(Remaining time), 所以当你收到STATUS消息的时候,状态可能还没有变化,在STATUS消息里也可以包含离目标状态的变化还有多少时间。

状态绑定(Bound States)

不同的状态之间可能会有一些关系。比如说一个状态的变化会造成另外状态的触发,这种关系叫做状态绑定。状态的绑定是可以跨Model的,(Model这个重要概念我们马上会提到),也可以在多个元素中。再举个例子,灯光亮度状态和开光状态。当你把亮度状态改到0了,也就触发了开关状态的“关”状态,反之亦然。