蓝牙mesh模型(Model)是mesh模型架构中基础业务单元,可以认为每个模型对应一个特定的业务(也有可能多个模型组合对应一个特定的业务)。每个元素(Element)上可以存在多个不同的模型,相同的模型也可以存在与一个设备不同的元素上。例如,一个三孔插座,分别由3个元素代表3个不同的孔,每个元素上都有一个开关模型(Generic Onoff Server Model)。
模型又分为服务模型(Server Model)和终端模型(Client Model)。我们在IOT设备上配置的模型均为服务模型,表示该设备具有特定的业务能力。蓝牙mesh模型分为3种不同的类型,分别是基础模型(Foundation Model)、通用模型(Generic Model)、以及厂商自定义模型(Vendor Model)。
基础模型
基础模型定义了用于配置和管理蓝牙mesh网络的消息,分为配置模型(Confirmation Model)和健康模型(Health Model)两个部分。其中配置模型仅存在于设备的主元素(Primary Element)上,其他元素不需要添加该模型;健康模型必须存在于该设备的主元素上,其他元素则可以根据需要选择是否添加该模型。
配置模型
配置模型在配网阶段使用设备密钥加密应用层数据,在其他阶段使用应用秘钥加密应用层数据。
多个Key索引的组合
SIG Mesh定义的NetKey和AppKey长度都为16字节,如果在数据传输过程中加入完整的Key,则会导致mesh网络发包数增加,同时将Key在空中频繁传输会增加泄露的风险。因此SIG Mesh定义了12位的Key索引(Key Index)来表示特定的Key,Key与Key索引一般为一一对应关系(在Key刷新过程中,一个Key索引对应新旧两个Key)。在数据传输过程中,一般使用Key索引来指定对应的Key,以提高消息传递的效率和安全性。将新的密钥传输到节点时,使用通用的消息分割和重组机制将新的密钥传输到节点。
配置终端(Confirmation Client)维护两个索引:全局NetKey和AppKey列表。每个Key在相应的列表中应有唯一的索引号,该索引号用于标识模块中对应的Key。
每个索引长度为12位,一个消息可能包含一个、两个或多个Key索引。为了实现更高效率的传输机制,每两个Key索引被组合成3字节。当消息包含的Key索引个数为奇数时,除最后一个Key索引外,所有的Key索引按顺序被两两组合成3字节,最后一个Key索引表示为两字节。如果消息包含的Key索引个数为偶数,则所有的Key索引按顺序被两两组合成3字节。
在将两个Key索引组合成3字节时,第一个Key索引值的低8位填充至第一个字节中,剩下的高4位填充至第2个字节的低4位中。第二个Key索引的低4位填充到第二字节的高4位中,剩下的高8位填充至第三字节中。
将一个Key索引表示为两字节时,Key索引值的低8位填充至第一个字节中,剩下的高4位填充到第二个字节的低4位中,第二个字节的高4位应设置为0.
AppKey
AppKey包含16字节的AppKey值,以及12位的AppKey索引。AppKey与AppKey索引存储在AppKey列表中,AppKey列表中的每个条目都包含一个AppKey索引、最多两个AppKey值(新的AppKey值与旧的AppKey值)。密钥刷新流程(Key Refresh Procedure)描述了新AppKey值与旧AppKey值的使用过程。
当元素接收AppKey配置消息并成功执行后,需要在AppKey列表中添加新的AppKey索引,并将AppKey绑定至NetKey对应的索引号,返回AppKey状态消息,消息中的NetKeyIndexAndAppKeyIndex字段定义为接收的消息的内容,并且状态字段被设置为成功。
添加AppKey
添加AppKey配置消息(Config AppKey Add)用于向AppKey列表中添加AppKey,被添加的AppKey必须与对应的NetKey共同使用。AppKey用于对接收和发送的消息进行身份验证和加密。当设备接收添加AppKey配置消息时,需要回复AppKey状态消息。
更新AppKey
更新AppKey配置消息(Config AppKey Update)用于更新AppKey列表中的AppKey。更新后的AppKey用于对收到和发送的消息进行身份验证和加密。收发消息时是使用更新前还是更新后的AppKey,由密钥刷新流程决定。当设备收到更新AppKey配置消息时,需要回复AppKey状态消息。
删除AppKey
删除AppKey配置消息(Config AppKey Delete)用于从AppKey列表中删除AppKey。当设备收到删除AppKey配置消息时,需要回复AppKey状态消息。
AppKey状态
AppKey状态配置消息(Config AppKey Status)用于报告请求配置AppKey消息的状态,该消息包含NetKey列表上的NetKey索引,以及AppKey列表上的AppKey索引。
状态字段表示最后一次对AppKey列表的操作状态。如果接收的请求是冗余的(添加相同的已存在的AppKey、更新已处于更新状态的AppKey或者删除不存在的AppKey),且没有采取进一步措施,则状态字段应设置为成功。
获取AppKey
获取AppKey配置消息(Config AppKey Get)用于查询所有绑定至指定NetKey索引的AppKey。
AppKey列表
AppKey列表配置消息(Config AppKey List)用于报告所有绑定至指定NetKey索引的AppKey。
模型与AppKey
当一个元素收到一个模型与AppKey绑定的消息并成功执行后,它应该将AppKey索引对应的AppKey绑定到特定的模型上,并给模型返回AppKey状态消息。
模型与AppKey绑定
模型与AppKey绑定配置消息(Config Model App Bind)用于给特定模型绑定指定的AppKey。当设备接收模型与AppKey绑定配置消息时,需要回复模型与AppKey绑定状态消息。
模型与AppKey解绑
模型与AppKey解绑配置消息(Config Model App Unbind)用于解除特定模型与指定AppKey的绑定关系。当设备接收模型与AppKey解绑配置消息时,需要回复模型与AppKey的绑定状态消息。
模型与AppKey绑定状态
模型与AppKey绑定状态配置消息(Config Model App Status)用于反馈模型与AppKey绑定/解绑消息的执行结果。该消息包含元素的Unicast地址、在AppKey列表中对应AppKey的索引和模型标识符。
模型订阅
设备上的每个元素都管理着本元素的模型订阅(Model Subscription)列表。该列表包含的订阅地址可以是组播地址,也可以是其他设备的地址。
当设备收到一条消息时,如果判断该消息的目标地址是本设备元素地址,或者模型订阅列表中的一个,并且该消息的Opcode是该元素上的模型支持的Opcode,则设备响应该消息,并做相应的逻辑处理。
添加模型订阅
添加模型订阅配置消息(Config Model Subscription Add)用于向模型订阅列表新增一条模型订阅地址。当设备收到添加模型订阅配置消息时,需要回复模型订阅状态消息。
删除模型订阅
删除模型订阅配置消息(Config Model Subscription Delete)用于从模型订阅列表中删除特定模型的特定订阅地址。当设备收到删除模型订阅配置消息时,需要回复模型订阅状态消息。
删除全部模型订阅
删除全部模型订阅配置消息(Config Model Subscription Delete All)用于从模型订阅列表中删除指定模型的全部订阅地址。当设备收到删除全部模型订阅配置消息时,需要回复模型订阅状态消息。
模型订阅状态
模型订阅状态配置消息(Config Model Subscription Status)用于上报设备的模型订阅状态。
当设备收到模型订阅新增或删除消息,但执行失败时,需要将状态字段设置为对应的错误原因,其他字段(除Opcode和状态字段外)设置为0.
网友评论