蓝牙Mesh的分包与重组-1

1. Segmentation

  1. Lower Transport Layer 同一时刻只能传输一个 Upper Transport PDU到同一地址。能不分段传输则不分段(好像是废话)。
  2. Segmented messages需要lower transpot layer应答,Unsegmented messages则不需要。
  3. 如果使用单分段传输比不分段消息传输更符合应用则应该使用单分段传输,因为分段消息有应答机制。
  4. 一旦可以确认的最后一个上层传输PDU的所有段都已确认或消息已取消,下层传输层应仅为同一目的地的另一个上层传输PDU发送分段消息(即每次只能传输一个Upper Transport PDU到同一地址)。

注意:PDU大小如下图

类型PDU Size(byte)
Unsegmented Access Message5-15
Segmented Access Message1-12
Unsegmented Control Message0-11
Segmented Control Message1-8

例如:使用32位Trans-MIC, Upper Transport Access PDU 为 42 字节,那么:

octetssegment/SegO
0 to 110
12 to 231
24 to 352
36 to 413

Upper Transport Control PDU 为 42 字节,那么:

octetssegment/SegO
0 to 70
8 to 151
16 to 232
24 to 313
32 to 394
40 to 415

一个Upper Transport PDU的每一个Lower Transport PDU(segment 0~n ) 的IV Index 都是一样的,它作为SeqAuth的一部分。

  1. Upper Transport Access PDU:SeqAuth用来加密或者解密Upper Transport Access PDU
  2. Upper Transport Control PDU:SeqAuth用来识别Upper Transport Access PDU

SeqAuth是一个56 bits的值,它的高位是IV Index(32 bits),低位是第一个分段(segment0)的SEQ(24 bits);分段消息和分段应答消息只包含SeqAuth的最低 13 bits,称为SqeZero。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

https://github.com/sifive/riscv-zephyr/blob/master/subsys/bluetooth/host/mesh/transport.c
https://elixir.bootlin.com/zephyr/v1.14.0-rc3/source/subsys/bluetooth/host/mesh/transport.c

#define SEQ_AUTH(iv_index, seq) (((u64_t)iv_index) << 24 | (u64_t)seq)

seq_zero = tx->seq_auth & 0x1fff;

u16_t seq_zero = *seq_auth & 0x1fff;

tx->seq_auth = SEQ_AUTH(BT_MESH_NET_IVI_TX, bt_mesh.seq);

由于 SeqZero 的大小有限,一旦 SEQ 比 SeqAuth 高 8192,就无法发送分段消息。 如果在 SEQ 比 SeqAuth 高 8192 时还没有确认分段消息,则应取消上层传输 PDU 的传递。

2. Reassembly

  1. 在接收设备中执行重新组装。 当使用低功耗节点功能时,消息的确认由朋友节点执行,低功耗节点不会发送段确认消息。
  2. 收到分段消息后,应检查 SeqAuth 以确定是否正在接收或先前已接收到上层传输 PDU。
  3. 如果尚未收到分段消息,则接收设备应分配足够的内存,由最后一个段号 (SegN) 确定,以存储接收到的上层传输 PDU 的段并跟踪它的段。 已收到,然后它会认为正在接收此消息。
  4. 如果未使用低功耗节点功能,并且消息的目的地是单播地址,并且节点此时无法接收此上层传输 PDU,例如因为节点忙或资源不足而无法重新组装 该消息,则节点应通过将 BlockAck 值设置为 0x00000000 向源节点发出信号,告知其无法接收此上层传输 PDU。
  5. 如果分段消息正在接收过程中,则段号(SegO)应用于确定该分段消息中的上层传输 PDU 八位字节应放置在先前为该消息分配的存储器中的位置。 接收方应更新 BlockAck 值以记录分段的成功传递。
  6. 一旦接收到给定 SeqZero 的上层传输 PDU 的所有段,上层传输层将检查上层传输 PDU。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值