蓝牙mesh数据包格式解析

1. 蓝牙mesh数据包的结构

蓝牙mesh数据包的结构如下图:在这里插入图片描述
在这里插入图片描述

总长31个字节。

Length (1Byte):数据长度

Type (1Byte):广播类型

IVI (1bit):用来认证加密Network PDU的IV index的最低位

NID (7bits):网络ID,network ID。从网络密钥(NetKey)派生的值,用于识别保护此PDU的加密秘钥和隐私密钥。决定使用哪个mesh网络传递数据

CTL (1bit):网络控制,用于确定消息是否包含访问消息或者控制消息

TTL (7bits):生存时间。0 不会被中继,1 不会被中继,2-126可能已被中继,并且可以被中继,127 没有被中继过,可以被中继。

SEQ (3Byte):序列号,每个Mesh信息的SEQ必须不同。

SRC (2Byte):源地址,必须是一个单播地址

DST (2Byte):目标地址,可以使单播地址、组播地址、虚拟地址。

MIC(4 Byte):网络消息完整校验值

Header (1Byte):包头

TMIC(4 Byte):传输层消息完整校验值

Opcode(3 Byte):操作可以是1、2或3个字节序列,操作码的第一个字节决定了使用字节的数量。如果操作码第一个字节的最高位是0,那么操作码只包含一个字节。如果最高两位是10,那么操作码包含2个字节。如果最高的两位是11,那么操作码包含3个字节。

在这里插入图片描述

1-octet 操作码是蓝牙SIG定义的应用操作码,最多可以定义127个1-octet操作码,0x7F是保留给未来使用的。

2-octet也是蓝牙SIG定义的应用操作码,最多可以定位16384个2-octet操作码

3-octet操作码是供制造商使用的操作码,每一个公司共有64个3-octet操作码。

Parameters(8 Byte):有效负载

2. Lower Transport PDU

底层传输层将来自上层传输层的PDU发送给另外一个节点,如果数据不需要分包,就单个底层传输层PDU发送出去,如果长度太长,则需要对数据分包之后再发送出去。接收消息时,也会判断是否是分包数据,如果是分包数据,则再组装之后,再传给上层传输层。

底层传输层PDU的第一个字节的最高位是SEG字段,也是最重要的一个位,该字段用来确认此PDU是经过分包的还是未分包消息。在网络层中,CTL字段确定消息是访问消息还是控制消息。根据这两个字段值的不同,可以将消息分为4种类型:1.未分包访问消息 2.分包访问消息 3未分包控制消息 4.分包控制消息

CTLSEG底层传输层PUD类型
00未分包访问消息
01分包访问消息
10未分包控制消息
11分包控制消息

2.1 未分包访问消息

字段长度(bits)备注
SEG10=未分包消息
AKF1应用秘钥标志位
AID6应用秘钥标识
Upper Transport Access PDU40~120上层传输层访问PDU
上层传输层根据应用秘钥(Application Key)和设备秘钥(Device Key)来设置应用秘钥标志位(AKF)和应用秘钥标识(AID)的值。

PDU格式:

在这里插入图片描述

2.2 分包访问消息

在这里插入图片描述

字段长度(bits)备注
SEG11=分包消息
AKF1应用秘钥标志位
AID6应用秘钥标识
SZMIC1TransMIC长度
SeqZero13SeqAuth的低有效位
SegO5分包号
SegN5最后一包分包号
Segment m8~96上层传输层访问PDU中的Segment m

SZMIC字段表示上层传输层访问PDU中的TransMIC的大小。若SZMIC字段为0,则TransMIC是一个32bit的值;若SZMIC字段为1,TransMIC则是一个64bit的值。

SeqZero字段由上层传输层设置;SegO字段应被设置为该上层传输层PDU的m分包的分包号(从0开始);SegN字段应该被设置为该上层传输层PDU的最后一个分包号。

Segment m字段是分包号为m的内容,除最后一个分包外的分包Segment m,它的内容是从第12×m字节到第12×m+11字节,而最后一个分包内容则是从第12×m字段到消息结尾。

对于相同的上层传输层访问PDU,每个分包访问消息的AKF、AID、SZMIC、SeqZero和SegN字段应该具有相同的值。

2.3 未分包控制消息

未分包控制消息用于传输一个应答消息或者传输控制消息。
在这里插入图片描述

字段长度(bits)备注
SEG10=未分包消息
Opcode70x00=分包应答\n 0x01到0x7F=传输控制消息的OPCode
Parameters0到88传输控制消息参数

分包应答消息的Opcode字段应设为0,底层传输层使用分包应答消息来确认分包消息。Parameters字段根据Opcode字段的需要来设置。

分包应答消息格式

在这里插入图片描述

字段长度(bits)备注
SEG10=未分包消息
Opcode70x00=分包应答
OBO1朋友代理低功耗节点
SeqZero13上层传输层PDU的SeqZero
RFU2保留
BlockAck32分包的块应答

OBO为0,表示接收信息的节点直接寻址;OBO字段为1,表示接收信息的是朋友节点,朋友节点代表低功耗节点应答此消息。

SeqZero字段应被设置为被应答的上层传输层消息的SeqZero。

BlockAck字段应被设置为收到的分包。最低有效位,即位0表示分包0;最高有效位,即位31表示分包31。如果位n被设置为1,则表示应答分包n。大于SegN的分包的位应被设置为0并在接收时忽略。

如果在接收的分包信息中TTL为0,则建议在发送分包应答消息中也将TTL设置为0.

2.4 分包控制消息

当传输控制消息不适合使用单个网络层PDU来传输的时候,就使用分包控制消息来传输。

分包控制消息的格式

在这里插入图片描述

字段长度(bits)备注
SEG11=分包消息
Opcode70x00=保留\n 0x01到0x7F=传输控制消息的OPCode
RFU1保留
SeqZero13SeqAuth的低有效位
SegO5分包号
SegN5最后一包分包号
Segment m8~64上层传输层访问PDU中的Segment m
  • OPCode字段由上层传输层设置,0x00为保留值,收到后不得传输,直接忽略
  • SeqZero字段应由上层传输层设置。
  • SegO字段应被设置为该消息中包含的上层传输层PDU的分包号(从0开始)。
  • SegN字段应被设置为该上层传输层PDU的最后一个分包号。
  • Segment m字段是分包号为m的内容,除最后一个分包外的分包Segment m,它的内容是从第8×m字节到第8×m+7字节,而最后一个分包内容则是从第8×m字节到消息结尾。

对于相同的上层传输层控制PDU,每个分包控制消息应具有相同的OPCode、SeqZero和SegN值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Opcode碰撞检测是一种用于计算机图形学和游戏开发中的碰撞检测技术。它是基于分离轴定理(Separating Axis Theorem)的一种快速且高效的方法。 在碰撞检测中,我们需要判断两个物体是否相交或者重叠。Opcode(Object Oriented Collision Detection Engine)是一个用于加速碰撞检测的库或引擎。它提供了一些优化算法和数据结构,可以快速地计算出两个物体之间的碰撞。 Opcode的基本原理是将物体表示为包围盒(Bounding Box),这是一个简单的几何形状,可以用边界框来近似表示物体的形状。使用包围盒可以大大减少需要进行详细碰撞检测的物体数量,从而提高碰撞检测的效率。 具体而言,Opcode使用了一种层次结构,称为包围盒层次(Bounding Volume Hierarchy,简称BVH)。BVH是一个树状结构,每个节点都代表一个包围盒,而叶子节点代表具体的物体。通过构建这样的树状结构,可以快速地排除一些不可能发生碰撞的物体对,从而减少了实际需要进行碰撞检测的数量。 当进行碰撞检测时,Opcode会遍历BVH树,并使用分离轴定理来判断两个包围盒是否相交。如果两个包围盒相交,那么就需要进一步检测它们所代表的物体的碰撞。否则,可以直接排除它们,不进行进一步的检测。 通过使用Opcode碰撞检测,可以大大提高碰撞检测的效率和性能,特别是在处理大量物体或复杂场景时。它在许多实时应用中都得到了广泛的应用,如游戏开发、虚拟现实和计算机动画等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值