文章目录
- 1.BLE 广播基本知识
- 1.1 BLE广播信道
- 1.2 BLE广播数据结构
- 1.3 广播间隔
- 1.4 广播类型
- 1.41 非定向可连接 广播 事件(ADV_IND)
- 1.4.2 定向可连接 广播 事件(ADV_IND)
- 1.4.3 非定向不可连接事件(ADV_NONCONN_IND)
- 1.4.4 可 发现不可连 事件(ADV_DISCOVER_IND/ADV_SCAN_IND)
- 2 回应包
1.BLE 广播基本知识
1.1 BLE广播信道
BLE要用无线电波传递信息,就是将数据编码,调制到射频信号中发射。通俗地讲BLE使用的电波频率是2.4G,也就是和Wi-Fi、无线键盘鼠标, 还有Zigbee、Thread等协议使用的2.4GHz一个概念。那么问题来了,这些信号会不会互相干扰?
首先要明确2.4GHz这个说法指的是一个频段而不是单一频率(全称2.4GHz Industry Science Medicine band),覆盖从2400MHz到2483.5MHz, 是一个用于短距离,无须执照使用的开放频段。还必须明确:任何带有信息的信号传递都要占用一定的带宽,不可能是一个单一频率。单一的频率只能是一个永久恒定的正弦信号——它无法携带信息。例如,无线电广播所指的频率是其信号的中心频率。
BLE在这个2.4GHz频段安排了40个信道(channel),中心频率从2402MHz开始,以2MHz为间隔。如下图上半部分
一个BLE设备,在任一时刻,只能选择40个信道之中的一个进行发射或者监听。发射或者试图监听的载波频率,就是对应信道的中心频率。
BLE使用的调制方式叫做GFSK,这是FSK调制的一个改进形式。FSK (Frequency Shift Keying) 是一种简单的调制的:就是将输出信号频率从2N个频率中根据调制编码进行选择切换,最简单是1-bit调制,称为2-FSK(本文不讨论其它的)如下图所示:
1.2 BLE广播数据结构
接收状态的BLE设备需要在同一信道上监听,才有可能收到这个数据包。接收方还需要知道数据包长度才能进行CRC校验,包长度是包含在PDU段内的。包的类型不同,PDU的具体格式也不同
在广播事件中,每一个广播事件都会在 3 个广播信道中进行数据传输,而且每一个事件都是以最小的信道编号开始传输。也就是说当而且每一个事件都是以最小的信道编号开始传输。也就是说当广播事件来了,这个 PDU 是依次从广播通道 37、38、39 中进行传输.
在BLE 4.0和4.2时,信道37、38和39用于advertising, 这是BLE从设备用来表示自己存在的三个信道,也是主设备用来扫描和发起连接用的。在这三个信道中,数据包格式如下图
具体的广播类型的有什么区别,可以参考之前已写的博客:广播类型区别详解
广播数据结构组成:
(1)前导(1Byte)
报文最开始的8比特是“01010101”或者“10101010”序列。这是很简单的交替序列。接收机可以用它来配置自动增益控制,以及确定“0”、“1”比特所使用的频率。
该序列之所以非常重要,是因为芯片必须能够应对输入信号强度的可能范围。接收机需要应付“-10dBm ~ -90dBm”的信号强度,也就是80dB的动态范围。从接收机的角度讲,也就是“1pW ~ 0.1mW”的能量。自动增益控制器必须检测出输入信号的能量等级,并调整增益,使得信号刚好处于接收机能够轻松工作的范围之中
(2)接入地址(4Bytes)
接入地址的第一个比特决定了前导是“01010101”还是“10101010”。如果接入地址的第一个比特位是“0”,则使用“01010101”序列;如果是“1”,则使用“10101010”序列。这保证了任一报文的前9个比特都是交替的,即要么是“101010101”,要么是“010101010”。
报文接下来的32比特是接入地址。有两种类型
1.广播接入地址
广播通道固定为0x8E89BED6
2.数据接入地址
对于数据信道,接入地址是一个随机值,不同的连接有不同的值。这一随机值也需要符合一些规定,主要是为了保证接入地址有足够好的白化特性。
数据信道的接入地址与广播信道接入地址至少要有1个比特的不同。数据信道接入地址也不能有任何重复的模式,各个八位组必须互不相同。数据信道接入地址也不能有超过24次的比特翻转,防止使用逐比特交替的序列。最后一点,最后6个比特需要有至少两次比特翻转,这样可以确保报头开始前有一些比特翻转,以防报头有较长的连“0”或者连“1”而带来不好的影响。
符合以上规则的有效随机接入地址大概有231个。换句话说,20亿个低功耗蓝牙设备可以在互相可通信的范围内同时工作。这个设计看起来可能有点大材小用,但请记住低功耗蓝牙已经是成功的设计,每个部分的设计都有它的合理性考虑。数据信道的随机接入地址还有一个有用的特性,就是攻击者无法根据接入地址来确定某个连接中是哪两个设备
(3)报头+长度(2Bytes)
(4)净荷(0-296Bytes)
净荷是所传输的“真实”数据,可以是关于设备的广播数据,或者是发给一定区域内所有设备的服务数据;可以是主动扫描响应的附加数据,如设备名称,实现的服务;可以是建立或保持连接所需要的信息;可以是从一个设备到另一个设备的应用层数据。
(5)CRC(3个字节用于CRC数据校验)
CRC校验,计算公式 x24 + x10 + x9 + x6 + x4 + x3 + x + 1
1.3 广播间隔
设备每次广播时,会在3个广播信道上发送相同的报文。这些报文被称为一个广播事件。除了定向报文以外,其他广播事件均可以选择“20ms ~ 10.28s”不等的间隔。通常,一个广播中的设备会每一秒广播一次。两个相邻广播事件之间的时间称为广播间隔。
但是,设备周期性的发送广播会有一个问题:由于设备间的时钟会不同程度的漂移,两个设备可能在很长一段时间同时广播而造成干扰。为防止这一情况的发生,除定向广播之外的其他广播类型,发送时间均会被扰动。实现该扰动的方式为,在上一次广播事件后加入“0 ~ 10ms”的随机延时。这意味着,即使两个设备广播间隔相同,并在相同信道及时间点上发送造成了冲突,但它们发送下一个广播事件时也会有很大可能不再冲突。
所以,两个相邻的广播事件的之间的时间间隔(T_advEvent)为:
T_AdvEvent = advInterval + advDelay
其中,advInterval 必须是“0.625ms”的整数倍,范围是“20ms ~ 10.24s”之间。对于可扫描非定向广播和不可连接非定向广播这两种广播类型,该值最好不小于100ms,即(160个0.625ms)。advDelay是Link Layer(链接层)分配的一个伪随机数,它的范围为**“0 ~ 10ms**”。
广播包的截图如下:
当然,实际设置过程中没有广播间隔参数,而是设置Advertising_Interval_Min(最小广播间隔)和Advertising_Interval_Max(最大广播间隔)这两个参数来调整广播间隔,它们都是以“0.625ms”为单位,如果要固定广播间隔为某一个值,只需要将这两个参数设置为同一个有效数值即可
1.4 广播类型
广播的类型一般分为四种,分别是:
1.41 非定向可连接 广播 事件(ADV_IND)
这其实就是链路层通过广播信道发送**(ADV_IND PDU)通用广播报文。这个报文发送之后可以接收由扫描者发送的(SCAN_REQ PDU)扫描请求,或者由发起者发送的(CONNECT_REQ PDU)**连接请求。而接收后链路层需要早同一个信道上进行扫描者或者发起者的应答。当接收的数据报文没能通过广播滤波政策,要么就用下一个广播信道进行广播
要么就关闭广播事件。如果接收到的 SCAN_REQ PDU 通过了滤波政策,那么广播者需要在同一信道并且在接收到数据到发送 SCAN_RSP PDU 扫描应答报文的时间一定是 150±2 µs 完成。如果接收到 CONNECT_REQ PDU,那么就进入连接状态,这个过程比较复杂,这个时候并不需要进行应答.
鉴于此种广播类型用的最多,下面我们来讨论一下此类型下广播事件中广播包的发送情况,另外要注意在一个广播事件中,前一个“ADV_IND PDUs”的开始到相邻的下一个“ADV_IND PDUs”的开始处的时间要小于等于 10ms :
(1)第一种情况:仅仅有广播 PDUs 。如下图:
(2)第二种情况:在广播事件的中间有“SCAN_REQ”和“SCAN_RSP PDUs”。如下图:
注意: 当有扫描请求包在广播事件中的中间信道上收到时,注意图中的 T_IFS,这是帧间隔,它的时间是 150us
(3)第三种情况:在广播事件的结尾有“SCAN_REQ”和“SCAN_RSP PDUs”。截图显示如下
当有扫描请求包在广播事件中的最后信道上收到时,
(4)第四种情况:在广播事件的中间接收到连接请求包–“CONNECT_REQ PDU”的情况。截图显示如下:
当有连接请求包在广播事件中的信道上收到时,没有应答
1.4.2 定向可连接 广播 事件(ADV_IND)
这个广播是为了快速建立连接。这种报文包含两个地址:广播者地址和发起者的地址。发起设备收到发给自己的定向广播报文后,可以立刻发送连接请求事件作为回应,并进入连接状态
定向广播事件有特殊的时序要求。完整的广播事件必须每 3.75ms之内重复一次。这一要求似的扫描设备只需扫描 3.75ms 便可以收到定向广播设备的消息。如
这么快的发送速度让周围充斥着广播信道,这使得该区域的其他广播事件无法进行广播。所以,协议规定:
也就是定向广播不能持续 1.28s 以上的时间。如果主机没有主动要求停止,或者连接没有建立,控制器都会自动停止广播。一旦超过1.28s,主机只能使用通用广播让其他设备连接。
1.4.3 非定向不可连接事件(ADV_NONCONN_IND)
这是一个很奇葩的事件,它像是一个车模,大张旗鼓的告诉别人,但是不允许别人摸她,而这个事件比模特更加的奇葩,模特至少可以合个影,但是这个事件大声的告诉别人我在这里,之后就不搭理别人了,不接受任何信息,只管自己在每个广播事件中发送数据。时间要求和通用广播事件一样。它只能根据主机的要求在广播态和就绪态间切换,也是唯一可用于只有发射机而没有接收机设备的广播类型。
1.4.4 可 发现不可连 事件(ADV_DISCOVER_IND/ADV_SCAN_IND)
这个广播其实是一个非定向可发现的广播,它和通用广播的时间控制是一样的,应答也是 SCAN_REQ PDU 和 SCAN_RSP PDU,这个广播和通用广播的区别是,它不能建立连接,只能处于广播态或者就绪态.这是一种适用于广播数据的广播形式,动态数据可以包含于广播数据中,而静态数据可以包含于扫描响应数据之中。
注意:所谓的定向和非定向针对的是广播的对象,如果是针对特定的对象进行广播(在广播包PDU中会包含目标对象的MAC)就是定向广播,反之就是非定向。可连接和不可连接是指是否接受连接请求,如果是不可连接的广播类型,它将不回应连接请求。可扫描广播类型是指回应扫描请求。
不同的广播类型对扫描请求和连接请求的不同结果如下图:
2 回应包
回应包的信道
说明回应包的信道是根据主机的请求信道来的