目录

1、字节序

2、Low Transport PDU

2.1、Unsegmented Access Message

2.2、Segmented Access Message

2.3、Unsegmented Control Message

2.3.1、控制信息

2.3.2、分段消息的 ACK

2.4、Segmented Control Message

3、分段和重组

3.1、分段

3.1.1、SeqAuth

3.2、重组

3.3、分段具体行为

3.3.1、针对单播地址

3.3.2、针对群组/虚拟地址

3.4、重组具体行为

3.4.1 非 Low Power Node 情况下

3.5、ACK 小结

4、Friend Queue


前一节(BLE Mesh (4) —— Network Layer)描述了数据从空口传输后 Network Layer 层的操作,如果是接收方向,那么数据再满足 Network 层的条件后,将会传入 Lower Transport Layer,当然,如果是发送方向,Network 层的数据来自 Lower Transport Layer;

Low Transport 层主要处理数据的分片和组包,所以这一层几乎都围绕这部分展开

1、字节序

Low Transport Layer 的字节序被定义为 big endian,即,大端模式;

2、Low Transport PDU

这一层的数据包用一个叫 Low Transport PDU 来描述,Low Transport PDU 与 Network PDU 的对应关系是,Network PDU 中的

[ TransportPDU ] (BLE Mesh (4) —— Network Layer)字段直接对应到 Low Transport PDU;

Low Transport PDU 的第一个字节的第一个 bit 叫做 SEG这个 SEG 直接决定了当前的 PDU 是否是分片(Segment/UnSegment)的形式;配合 Network 层的 CTL 控制包的标志位,共同组成了 4 中类型的 Low Transport PDU :

分段/未分段的 Access/控制消息;

2.1、Unsegmented Access Message

未分段的 Access 消息,既然是 Access 消息,那么就是需要和更上层(Upper Layer)进行交互的,所以App Key相关信息一定是要存在的,所以他的数据包组成如下:


其中:

1、SEG:0,是 octet 0 的第一个 bit ,为 0 代表的是 Unsegmented Message;

2、AKF/AID:Application Key Flag / Application Key Identifier 用于加密 APP 数据

3、Upper Transport Access PDU:用于和更上层的交互

2.2、Segmented Access Message

分段的 Access 消息的 PDU 定义需要支持分段信息,他的 PDU 定义如下:

由于是分片,所以 SEG 一定为 1:

1、SEG:1,是 octet 0 的第一个 bit ,为 1 代表的是 Segmented Message;

2、AKF/AID:Application Key Flag / Application Key Identifier 用于加密 APP 数据;

3、SZMIC:该域指定了 Upper Transport Access PDU 中的 TransMIC 域的大小,如果 SZMIC 为 0 ,则 Upper Transport Access PDU 中的 TransMIC 域是 32-bits,否则如果 SZMIC 为 1,则 Upper Transport Access PDU 中的 TransMIC 域是 64-bits;

4、SeqZero:上层指定,SeqAuth 的最后几位;

5、SegO:由上层设置,指明了当前是第几个分片(从 0 到 m);

6、SegN:最后一个分片的编号(从 0 开始)

7、Segment m:分片的具体数据

注意:对每一组 Segmented Access message 来说,AKF,AID,SZMIC,SeqZero, SegN 都应该是一样的;

2.3、Unsegmented Control Message

Unsegmented Control Message,此类型的 PDU 用于表示未分段的控制信息或者对收到分段包的 ACK,他的 PDU 组成如下所示:

由一个 Opcode + Parameters 构成,由于是未分段的,所以 SEG 等于 0;

2.3.1、控制信息

所有的控制信息由 Opcode 来区分,当 Opcode 为 0x00 的时候,代表一个分段的 ACK,否则控制信息的具体类型查看  Opcode 列表:

2.3.2、分段消息的 ACK

当 Opcode 为 0x00 的时候,他表示对收到的分段的 message 进行 ACK,分段 ACK 用于 low transport layer 回复接受来自对端的分段包;所以,如果 Opcode 为 0x00 的时候,这个 PDU 的组成为:

1、SEG: 为 0,代表这是一个未分段的包;

2、Opcode: 为 0x00 固定

3、OBO:应由接收消息直接寻址的节点设置为 0,并且应为由代表低功耗节点确认此消息的好友节点设置为 1

4、SeqZero:更上层设置

5、RFU:预留

6、BlockAck:是一个 Bitmap,如果 n bits 设置为 1,则第 n 个分段消息将会被 ACK,以此类推

2.4、Segmented Control Message

此种类型描述的是分段的控制消息;PDU 的描述如下:

与分段的 Access 信息类似,都包含了 SegZero,SegO,SegN,Segment m 的信息,多了一个 Opcode 来区分每一个控制信息,去除了 APP Key 相关的内容(因为此类型消息不是发给 APP 的,不需要在 APP 层进行解密认证)

1、SEG:由于是分段的 Control 信息,所以设置为 1

2、Opcode:上层指定

3、SegZero:上层指定

4、SegO:由上层设置,指明了当前是第几个分片(从 0 到 m);

5、SegN:最后一个分片的编号(从 0 开始)

6、Segment m:分片的具体数据内容

注意,每个同一组的分片控制信息,它的 Opcode、SeqZero、SegN 字段应该一样;

3、分段和重组

Message 的分段是针对发送的消息大于了一次能够容纳数据量的情况;

Message 的重组是针对接收的时候,消息大于了一次空口能够容纳数据量的情况;

所以,一个是针对发送,一个是针对接收;

3.1、分段

分段是针对发送来说的,Message 分段在 Low Transport Layer 进行,同一时刻,只能进行一组 Message 的分段数据发送(即,不能进行多组分段 Message 在同一时刻交织发送),而且 mesh Spec 建议,能够使用不分段装下的数据,应该尽量不用分段,只有装不下了,才进行数据分段处理

分段后的消息发送,会在 low transport layer 进行 ACK,未分段的消息不会;

  • 每个 Upper Transport Access PDU 以 12 Bytes 作为切分分段;
  • 每个 Upper Transport Control PDU 以  8 Bytes 作为切分分段;

比如,当应用 32-bit TransMIC 的时候,如果 Upper Transport Access PDU 一共 42 Bytes,那么:

Segment 0:0 Byte      ~ 11 Bytes

Segment 1:12 Bytes  ~ 23 Bytes

Segment 2:24 Bytes  ~ 35 Bytes

Segment 3:36 Byte    ~ 41 Bytes

比如,如果 Upper Transport Control PDU 一共 42 Bytes,那么:

Segment 0:0 Byte      ~ 7 Bytes

Segment 1:8 Byte      ~ 15 Bytes

Segment 2:16 Byte    ~ 23 Bytes

Segment 3:24 Byte    ~ 31 Bytes

Segment 4:32 Byte    ~ 39Bytes

Segment 5:40 Byte    ~ 41 Bytes

每个分段的 Upper Transport Control/Access PDU 由其中的 SegO 域来进行区分;

3.1.1、SeqAuth

SeqAuth 由 IV Index(32 bits)和 sequence number(SEQ 24 bits)组成,所以这玩意一共 56 bits

这个玩意用于 Upper Transport Access PDU 来进行数据的加密和认证。

需要注意的是,其中 IV Index 是 MSB 的 ,sequence number 是 LSB 的。

而且这个 SeqAuth 的 最低的 13 bits 被叫做 SeqZero,在前面的包组成中体现。

3.2、重组

消息的重组依赖于一直处于接收对端的 Segment 消息的设备;

接收方一直接收 Segmented Message,SeqAuth 用于校验 Upper Transport PDU 此包是否已经被接收,如果没有被接收过,那么将该 PDU 存储到内存;

如果在没有用 Low Power Node 特性的节点,如果单播地址 OK 的情况下,设备处于无法接收 Upper Transport PDU(比如设备忙),的情况下,直接设置 BlockAck 字段为 0x00000000.

如果一组 Segmented Message 正在被接收,其中的 SegO 字段代表了此 PDU 位于分段消息的位置,首先将此 PDU 进行存储,然后更新对应的 BlockAck 位;

3.3、分段具体行为

一旦要发送的 Upper Transport PDU 被分段了,lower transport layer 将传输每个分段的消息:

1、如果传输的目的地址是单播地址,那么期待对方回复 Segment ACK(非 Low Power Node);

2、如果传输的目的地址是虚拟地址或者群组地址,对方不会回复 Segment ACK;

注意:如果是发送到了 Friend Node,那么这个消息暂时并没有直接发送到指定的地址(被 Friend Node 暂存),Friend Node 也会 ACK 此消息,只不过在 OBO 字段设置为 1,代表了此消息被 Friend Node 暂存;

注意:群组地址和虚拟地址不 ACK,为了保证正常接收,建议多发几次,同时,在发送几次之间插入 delay;

注意:发送给 Low Power Node 的分段,不会由 Low Power Node 回复,由其 Friend 回复;

3.3.1、针对单播地址

针对单播地址的情况:

1、当发送分段消息的时候,此刻起一个 Timer A,等待对方的 Segment ACK(Timer 的最小值是 200 + 50×TTL ms

2、如果 Segment ACK 正常收到,那么 Low Transport Layer 将会 Reset 这个 Timer A,同时重传所有未被 ACK 的 Lower Transport PDUs

3、如果所有的 Segment ACK都收到了,那认为此刻传输成功;

4、如果收到 BlockAck 字段为 0x00000000 的 Segment ACK 的话(说明对方不具备接收能力了),立刻取消 Upper Transport PDU

5、如果在 Timer A 到期的时候,还没有收到有效的 ACK,那么 lower transport layer 会再次重传未被 ACK 的 Lower Transport PDUs

注意:当开启重传的时候,Timer A 将会被重置

6、所有的 Lower Transport PDU 至少被传输 2 次,除非提前收到 ACK,如果在所有的 Lower Transport PDUs 在被正确 ACK 之前 lower transport layer 停止重传,那么就意味着 Upper Transport PDU 被取消了;

7、如果 OBO 被置 1,说明消息被 Friend 缓存

3.3.2、针对群组/虚拟地址

如果传输的目的地址是虚拟地址或者群组地址,对方不会回复 Segment ACK;

3.4、重组具体行为

重组端,主要是定义重组的行为和 ACK 对端的行为;

3.4.1 非 Low Power Node 情况下

对于非 LPN 情况下的重组行为,由于数据接收,会带有 SeqAuth 信息(代表了 message 序号),所以首先会对比这个 SeqAuth 信息,如果这个 SeqAuth 大于了当前本地的 sequence authentication 值的话,说明是一个新的一组分段数据包来了,如果收到的包的 SeqAuth 小于当前本地的 sequence authentication,说明过期,则直接不理会;

如果本端因为设备忙、资源不够等等情况,无法继续接受数据消息,那么设置 BlockAck 为 0x00000000,ACK 给对方;

当一切顺利,收到一组新的分段包的时候,本地开启一个 incomplete Timer A,最小 10s,用于判断在指定的这个期间内是否能够收到一个分段包,一旦本端的 lower transport layer 收到任何一个分段包中的一个分片,这个 incomplete Timer A 就会被 Restart,也就是针对一个 Multi-Segment 的一个Segment 超时 Timer 的含义;

当一切顺利,收到一组新的分段包的时候,本地开启一个 ACK Timer B,最小值为 150 + 50 × TTL ms,他指定了本端的 lower transport layer 给对方 ACK 的时间;

接收端会将接收到的分段包的情况标记到一个 BlockAck 的 bitmap 中并且给对方 ACK 过去;

当所有的分片的收完了,会设置 BlockAck 字段进行 ACK,同时取消本地的 incomplete Timer A 和 ACK Timer B,然后将重组完毕的消息发送给 upper transport layer

Timer 超期:

1、ACK Timer B 超期后:本端会发送已经置好 BlockAck 的 ACK 给对方(也就是说,有可能 Timer 开得大的话,一次收到很多 Segment 后,同时置了多个 BlockAck ,一次性给对方回复)

2、incomplete Timer A 超期后:本端认为,消息接收失败,关闭 ACK Timer B,所有已经接受到的当前未完成的分段消息全部丢弃;

注意:如果本机是 Friend node 的话,那么他会重组这些消息,并设置 OBO 为 1,并进行 ACK;否则 OBO 设置为 0

注意:群组地址和虚拟地址不接收到分段信息,不 ACK

3.5、ACK 小结

Low Transport Layer 的消息,并不是所有都会去 ACK 的,总结一下 ACK 和没有 ACK 的情况,

首先,只有接收到分段消息(Segment)才会有 ACK!

其次,如果设备的不是 Low Power Node 类型的话,那么会根据接收到分段消息的情况,设置 BlockACK,来进行 ACK

如果设备是 Low Power Node 的情况,不会去 ACK,转而由该 Low Power Node 的 Friend 通过设置 OBO 字段来进行 ACK

如果是虚拟地址,或者群组地址情况下,不会有 ACK

如果当前接收分段包的一段无法继续接收了,那么设置 BlockAck 为 0x00000000 告诉对方无法接收了

4、Friend Queue

Friend Queue 用于 Friend node 来转储别人发给 Low Power Node 的消息,如果是分段的消息的话,那么由这个 Friend 来负责接收全部的分段消息,并进行 ACK;

BLE Mesh (5) —— Lower Transport Layer相关推荐

  1. BLE Mesh (8) —— Friendship

    目录 1.Timing 2.建立 Friendship 2.1.大致过程 2.2.关键细节分析 2.2.1.Friend Request 2.2.2.Friend Offer 2.2.3.Friend ...

  2. BLE Mesh(一)基础介绍

    文章目录 Bluetooth Mesh Introduction 1 Overview 2 Topology 3 Publish/Subscribe 4 Provisioning 5 Addressi ...

  3. BLE Mesh (10) —— Mesh Provisioning

    目录 1.Provisioning bearer layer 1.1.PB_ADV 1.2.Generic Provisioning layer 1.2.1.Generic Provisioning ...

  4. BLE Mesh(六)配网流程

    配网流程 概述 配网协议 配网承载层(Provisioning Bearer) 配网协议(Provisioning Protocol) 流程详解 发送Beacon信号 邀请 交换公共密钥 认证 输出带 ...

  5. BLE Mesh (9) —— Mesh beacons

    前面说的都是在 node 已经入 mesh 网以后的行为,那么一个 node 是怎么入 mesh 网的呢?这里就要分为两个部分来介绍了,一边是,自报家门希望入网的节点,另一边是把这个希望入网的节点拉入 ...

  6. BLE 技术(八)--- BLE MESH 各层报文是如何设计的(上)?

    文章目录 前言: 一.SIG MESH Bearer Layer 1.1 Advertising Bearer Layer 1.2 GATT Bearer Layer 二.SIG MESH Provi ...

  7. Mesh networking----下层传输层(Lower Transport Layer)

    写在前面: 本文参考Mesh Core Spec 翻译而来,翻译能力有限肯定有理解不到位之处,还请大家指出.欢迎广大蓝牙.mesh爱好者一起交流,本人QQ:993650814. 正文: 一.下层传输层 ...

  8. BLE 技术(九)--- SIG MESH Models 是如何设计的(下)?

    文章目录 一.SIG Mesh Models Layer 1.1 MESH Model communication 1.2 MESH State transition 1.3 Overview of ...

  9. BLE 技术(三)--- 链路层七种状态与空口报文设计(Core_v5.2)

    文章目录 一.LE Link Layer States 二.Link Layer Packet format 2.1 Advertising physical channel PDU 2.1.1 Pr ...

最新文章

  1. C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
  2. java stack empty_java.util.Stack.empty()方法实例
  3. 【机器学习】太强了!这个建模神器可以玩一辈子
  4. Server 2008 Core/服务器核心环境安装SQL 2008 方法
  5. WPF-003 popup实现下拉列表的问题
  6. java 对象流_java 对象流的简单使用
  7. 1837Balance
  8. 济南昊锐科技谈程序员与用户UI
  9. Protobuffer教程
  10. dubbo 使用学习五(dubbo开发中使用到的一些服务配置方式)
  11. [转]C#操作注册表
  12. flask中的session对象方法
  13. 基于u-boot源码的简单shell软件实现
  14. mtk x20 android 开发环境配置
  15. 江民10日病毒播报称:小心“硬盘魔鬼”等病毒感染
  16. netron工具简单使用
  17. 多元统计分析 多元线性回归 python代码实现 简单线性回归
  18. layui教程(一) form 表单的提交问题
  19. Windows 句柄泄露学习总结
  20. 多账号自媒体工具,多平台同时发布

热门文章

  1. 猿创征文|深度学习基于前馈神经网络完成鸢尾花分类
  2. 百度地图、腾讯地图、高德地图之间的经纬度转换
  3. 用selenium模拟浏览器爬取淘宝订单信息
  4. 网易雷火工作室java_如何评价网易雷火工作室?
  5. 中国地理位置四至点及计算方法
  6. java进阶-day32-序列化、多线程
  7. 实时监控TCP Reset信息的二进制hook手艺
  8. 100个python算法超详细讲解:谁是窃贼
  9. 一生要看的50经典电影
  10. zzulioj1069