Mesh Profile (3.7)访问层

(翻译自《MeshProfile v1.0》3.7 Access Layer)

综述

访问层定义了更高层次的应用如何使用高传输层。

该层定义了应用数据的格式;

定义和控制了应用数据在高传输层的加密(应用数据的加密本身发生在高传输层);

在递交收到的数据到更高层之前,访问层检查了数据是否通过正确的网络和应用秘钥接收。

模型标识符

一个模型通过唯一的标识符标识区分。

对于SIG定义的模型,该标识符16bit。

对于由厂商定义的模型,该表示符32bit。厂商模型ID由两部分组成:16bit的蓝牙组织公司标识符和16bit厂商赋值模型标识符。

访问层负载数据

访问层数据逻辑上由两个部分组成:

Opcode    1,2,3octet    操作码

Parameters   0~379octet  应用参数 

一个访问层负载数据最多发送32个分片,每个分片12octets。这意味着包含TransMIC,最多384octets。(分片行为发生在低传输层,此时已经计算出TransMIC)。

对于4octets的TransMIC,访问层负载数据最多380octets(含操作码)。因此,当操作码为1octet时,参数字段最大为379octet;操作码为2octets时,参数字段最大378octet;操作码为3octets时,参数字段最大377octets。

低传输层将消息分片为更小的PDU,然后递交给网络层。

操作码

操作码是一个包含1,2或者3个octets的数组。第一个octet决定了整个操作码中octet的个数。

如果操作码第一个octet的最高有效位是0,那么该操作码包含1octet。

如果操作码第一个octet的最高两位有效位是10,那么该操作码包含2octets。

如果操作码第一个octet的最高两位有效位是11,那么该操作码包含3octets。

1octet的操作码用于SIG定义的应用操作码。一共127个可定义操作码,0x7F保留为将来可能的扩展使用。

2octet的操作码用于SIG定义的应用操作码。一共有16384个可定义的操作码。

3octet的操作码用于制造商定义。对于每个厂商ID,有64个操作码(6bit)。剩下的2octet(16bit)用于厂商ID。

应用参数

参数由每一个操作码各自定义。参数的长度可以是0。

访问层行为

发送一个访问层消息

 一条消息通过模型发送到一个目的地址。这个目的地址可以是单播地址,组地址或者虚拟地址。

一条消息的源地址,是发送元素的单播地址。

TTL字段由应用定义,表示了从源地址到目的地址传输过程中的跳数。

SRC字段表示了消息起源的节点上发送该消息的元素的单播地址。

DST字段可以被设置为单播地址,组地址或者虚拟地址,表示消息的指向。

访问层并不保证消息的分发。每个模型决定一个消息是否应该别重传和如何处理潜在的拷贝操作。

如果一个消息是一条收到的消息(该收到的消息是发向单播地址)的响应回复,那么该响应消息的传输应该有一个20~50ms的随机延时

如果一条小时是一条收到的消息(该收到的消息是发向组地址或者虚拟地址)的响应回复,那么该响应消息应该有一个20~500ms的随机延时。

这样减少了多个节点同时响应一条消息的可能性,进而增加了消息成功分发的可能性而减少了消息冲突。

由于带宽(在所有节点和所有蓝牙设备间共享)的限制,观察由节点发起的通信的体量是很重要的。一个节点在一个可移动的10s的窗口内应该发起少于100个低传输层PDU(经过了分片)。

接收一个访问层消息

如果遇到下列情况,一条消息要被递交给模型处理:

  • 操作码属于被寻址的元素
  • 目的地址被设置为该模型中某个元素的单播地址,或者该模型的元素订阅的组地址和虚拟地址。或者目的地址是节点主元素固定的的组地址(all-proxied, all-friend, all-relays, all-nodes)。
  • 该模型被绑定到用于加密该消息传输的应用秘钥和设备秘钥上。(如何理解模型和秘钥的绑定关系?

安全考虑

消息错误处理过程

非确认消息和确认消息

非确认消息

确认消息

发布和订阅

发布

订阅

原文地址:https://www.cnblogs.com/minnowbin/p/9636059.html