前篇博文BLE MESH 各层报文是如何设计的 介绍了BLE MESH Advertising Bearer 和GATT Bearer 、Network Layer、Transport Layer 报文格式分别是如何设计或定义的?这些报文各字段如何实现MESH 各协议层设计的功能?比如如何实现MESH Provisioning Process、Key Refresh procedures、IV Update procedure、Network addressing process、Encrypted/Obfuscated process、Segmentation and reassembly process 等?本文主要介绍SIG 设计或定义了哪些MESH Models?一个Model 通常定义了哪些 states、messages、behavior / procedure?MESH client model 与MESH server model 之间传输的messages 如何由Access Layer 承载、Transport Layer 加解密认证和分段重组的?
一、SIG Mesh Models Layer
博文BLE MESH 如何定义并传递消息 已经简单介绍了State、Message、Model 的定义以及它们之间的关系。简单来说,一个BLE MESH 设备经过Provisioning Process 入网后就成为一个MESH Node,一个Node 设备可能包含多个独立的子设备Elements(每个元素一个单播地址,作为寻址的依据),每个Element 可能包含多个Models(每个模型定义元素的一个基本功能)。
1.1 MESH Model communication
MESH Model 采用Client – Server 架构通信,Server Model 定义了一组 States、作用于这些状态的Messages、响应这些消息的Behaviors 等,Client Model 则通过作用于状态的Messages 获取或者更改特定的State value。Client Model 通过特定的Messages 访问或更改Server Model 定义的特定State 的过程如下:
Client Model 向Server Model 发送的Messages 主要有两种:一种是查询Server Model 上特定的State 信息;另一种是设置Server Model 上特定的State 信息。Server Model 向Client Model 发送的Messages 主要也有两种:一种是用Present State 响应来自Client Model 的查询消息;另一种是按照预设条件(比如当前状态发生改变时,或周期性时间间隔耗尽时)向该模型订阅者发送Present State 消息。
从上图可以看出,Client Model 向Server Model 发送的消息主要有Get message 和Set message 两种。Server Model 向其它节点发送的消息都是 Status message,一种是用来响应Client Model 的,另一种是在状态发生改变或者周期性定时间隔超时时发送给该模型订阅组的(上图省略了周期性发布消息图示)。假如Client Model 也是Server Model Publish Group 中的一员,Client Model 向Server Model 发送Set message 后将收到至少两个同样的 Status message,为了降低对MESH 网络资源的占用,Set message 定义为Acknowledged set 和Unacknowledged set 两种。
Client Model 与Server Model 之间交互的 messages 主要是用来传递Present State 信息或Target State 信息的。State 可能就是一个数值(比如开关状态可以用一个布尔值表示,亮度或速度状态可以用一个整数表示等),也可能是由多个数值组合成的Composite state(比如彩色灯光状态可以由色调、饱和度、亮度三种状态组合而成),多个State 之间也可能定义了略复杂的绑定关系(Bound state 表示绑定关系中的一个状态发生变化,可能会引起另一个状态的联动变化)。
与GATT Profiles / Services 类似,SIG 也提供了一些标准的SIG Model,比如Configuration Server/ Client model、Health Server / Client model 等Foundation models,比如Generic OnOff Server / Client model、Generic Level Server / Client model、Sensor Server / Client models 等SIG models。每个Model 都有一个唯一的Model ID(每个SIG Model ID 都由 2 个字节唯一标识,限于篇幅只列出部分作为示例):
SIG Model ID | Model Name |
---|---|
0x0000 0x0001 |
Configuration Server Configuration Client |
0x0002 0x0003 |
Health Server Health Client |
0x1000 0x1001 |
Generic OnOff Server Generic OnOff Client |
0x1002 0x1003 |
Generic Level Server Generic Level Client |
… | … |
0x1100 0x1101 0x1102 |
Sensor Server Sensor Setup Server Sensor Client |
… | … |
考虑到现实应用场景中,可能有很多功能超出了SIG 定义的标准模型的范畴,SIG 也允许Vendor 在SIG Models 无法满足需求的情况下自己定制Vendor Models。Vendor Model ID 使用两个字段32 位标识(由Company ID 和vendor-assigned model ID 构成):
Client Model 与Server Model 之间交互的 messages 主要由Opcode 和Parameters 两部分构成,每个消息都有一个唯一的Opcode(不同model 的message opcode 都不同,可仅通过opcode 知道该message 属于哪个model)。与Model 类似,Message 也分为SIG Message 和Vendor Message,SIG Message 使用 1 字节或 2 字节的Opcode,Vendor Message 使用 3 字节的Opcode(后两个字节是Company ID,也即下图中的“zzzzzzzz”)。
SIG 可使用的Opcode 一共有 27 - 1 + 214 = 16511 个,足够使用了。每个Company ID 可供使用的Opcode 只有 26 = 64 个,如果不够用还需要再申请Company ID。
下面给出几个SIG Message Opcode 作为示例:
Opcode | Message Name |
---|---|
0x00 0x80 0x00 0x80 0x01 0x80 0x02 0x80 0x03 0x01 |
Config AppKey Add Config AppKey Delete Config AppKey Get Config AppKey List Config AppKey Status Config AppKey Update |
… | … |
0x80 0x3D 0x80 0x3E 0x80 0x3F |
Config Model App Bind Config Model App Status Config Model App Unbind |
… | … |
0x82 0x01 0x82 0x02 0x82 0x03 0x82 0x04 |
Generic OnOff Get Generic OnOff Set Generic OnOff Set Unacknowledged Generic OnOff Status |
… | … |
MESH Message 中的Parameters 跟具体模型的具体状态相关,由于Message 是作用于State 的,想了解某个Message 的Parameters 需要先了解其查询或设置的具体State。
1.2 MESH State transition
以比较简单的Generic OnOff state 为例,使用布尔值就可以描述状态信息,比如0x00 表示Generic Off state、0x01 表示Generic On state。Generic Level state 则使用 16 位有符号整数值就可以描述状态信息,比如0x0010 可以表示电机转速或灯光亮度为16。State 表示相对简单,如何表示State 变更或转换过程呢?
Generic Level state 状态的变化不可能瞬时发生,从Initial State 到Target State 一般需要一个转换时间 transition time,SIG 定义的state transition 过程如下:
Server Model 收到来自Client Model 的Set message 后,会延迟一段时间Delay time(比如多个LED 灯可通过设置不同延迟时间实现顺序点亮效果)后才开始状态转换,从Initial State 转换到Target State 需要的时间称为Transition Time,状态转换过程中的状态为Present State,从Present State 转换到Target State 需要的时间称为 Remaining Time。
前面也谈到,MESH Message 是作用于State 的,以Generic OnOff messages 为例,Generic OnOff Set 的Opcode 是0x82 0x02,Parameters 如下:
State value Filed 是OnOff,占用 1 个字节,有些状态值占用更多字节,比如 Level 占用两个字节。
TID Filed (Transaction Identifier) 用来标识该消息是一个新的消息还是旧的重传消息,为了保证Set Message 能正确送达,Client Model 通常在一定时间内未收到响应消息会重新发送该消息,Server Model 通过TID 字段来区分收到的消息是否是重发的,对于重发的消息不重复响应。
Transition Time 和Delay 都是步进的(而