查看: 1756|回复: 0

[技术交流] 【和你一起聊聊BLE】 -——广播和数据报文结构分析

[复制链接]

108

主题

163

帖子

618

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
618
发表于 2019-8-2 10:39:20 | 显示全部楼层 |阅读模式
广播与数据报文


低功耗蓝牙规范中,有两类报文:广播报文和数据报文。两类报文具有两种完全不同的用途。设备利用广播报文发现、连接其他设备。一旦连接建立之后,则开始使用数据报文。而两者的区别在于,数据报文只能被连接中的两个设备(主、从设备)所理解,而广播报文则可以广播给多个侦听设备或者只发送给某个特定的设备。
是广播报文还是数据报文由其传输所在的信道决定。低功耗蓝牙规定了3个广播信道37个数据信道。如果报文在某个广播信道传输,则为广播报文;反之,则为数据报文。


前导(1Byte)

    报文最开始的8比特是“01010101”或者“10101010”序列。这是很简单的交替序列。接收机可以用它来配置自动增益控制,以及确定“0”、“1”比特所使用的频率。


    该序列之所以非常重要,是因为芯片必须能够应对输入信号强度的可能范围。接收机需要应付“-10dBm ~ -90dBm”的信号强度,也就是80dB的动态范围。从接收机的角度讲,也就是“1pW ~ 0.1mW”的能量。自动增益控制器必须检测出输入信号的能量等级,并调整增益,使得信号刚好处于接收机能够轻松工作的范围之中。

接入地址(4Bytes)
    接入地址的第一个比特决定了前导是“01010101”还是“10101010”。如果接入地址的第一个比特位是“0”,则使用“01010101”序列;如果是“1”,则使用“10101010”序列。这保证了任一报文的前9个比特都是交替的,即要么是“101010101”,要么是“010101010”。
    报文接下来的32比特是接入地址。有两种类型:

    1.广播接入地址
    广播通道固定为0x8E89BED6
   

    2.数据接入地址
    对于数据信道,接入地址是一个随机值,不同的连接有不同的值。这一随机值也需要符合一些规定,主要是为了保证接入地址有足够好的白化特性。
    数据信道的接入地址与广播信道接入地址至少要有1个比特的不同。数据信道接入地址也不能有任何重复的模式,各个八位组必须互不相同。数据信道接入地址也不能有超过24次的比特翻转,防止使用逐比特交替的序列。最后一点,最后6个比特需要有至少两次比特翻转,这样可以确保报头开始前有一些比特翻转,以防报头有较长的连“0”或者连“1”而带来不好的影响。
    符合以上规则的有效随机接入地址大概有231个。换句话说,20亿个低功耗蓝牙设备可以在互相可通信的范围内同时工作。这个设计看起来可能有点大材小用,但请记住低功耗蓝牙已经是成功的设计,每个部分的设计都有它的合理性考虑。数据信道的随机接入地址还有一个有用的特性,就是攻击者无法根据接入地址来确定某个连接中是哪两个设备。

报头+长度(2Bytes)
    1.对于广播报文,如下所示:
   
    报头包含了广播报文的类型以及一些标记位,这些标记位指出了报文使用的是公共地址还是随机地址。广播报文类型共有7种,每种类型都具有不同的净荷格式及行为:
    ADV_IND:通用广播指示
    ADV_DIRECT_IND:定向连接指示
    ADV_NONCONN_IND:不可连接指示
    ADV_SCAN_IND:可扫描指示
    SCAN_REQ:主动扫描请求
    SCAN_RSP:主动扫描响应
    CONNECT_REQ:连接请求
    广播类型决定了回应包类型,下表列出各种类型下的扫描请求和连接请求的对照关系:
   
    长度域包含6个比特,有效值的范围是“6 ~ 37”。对于数据报文,长度域包含5个比特,有效值的范围是“0 ~ 31”。长度域之后是净荷,其长度是长度域指出的字节数。
   
    广播报文和数据报文的长度域有所不同可能显得有些奇怪。这一设计的主要原因是,广播报文除了最多31个字节的数据之外,还要包含6个字节的广播设备地址。6个字节加31个字节导致报文长度最多为37个字节,因此需要6比特的长度域。


    2.对于数据报文,如下所示:
   

    包含如下标记位:报文可靠传输使能、低功耗管理、净荷路由(发给控制器或是主机)。

    数据报文就简单多了。数据报文长度不是那么关键,多数待传的数据只有几个字节,因此达到最大长度的报文很少用到。这里要注意的是,如果报文被加密,则需要包含4字节的消息完整性检查域,实际的净荷数据将被减少到最多27个字节。为了使得链路层设计得到简化,未加密报文的净荷也不允许超过27个字节的限制,以减低链路层缓存的复杂度。


净荷(0-296Bytes)
    净荷是所传输的“真实”数据,可以是关于设备的广播数据,或者是发给一定区域内所有设备的服务数据;可以是主动扫描响应的附加数据,如设备名称,实现的服务;可以是建立或保持连接所需要的信息;可以是从一个设备到另一个设备的应用层数据。


CRC(3个字节用于CRC数据校验)

    CRC校验,计算公式 x24 + x10 + x9 + x6 + x4 + x3 + x + 1


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表