找回密码
 立即注册
首页 业界区 安全 深入BLE 4.2(八):链路层Link Layer

深入BLE 4.2(八):链路层Link Layer

呵烘稿 2025-12-18 17:40:01
目录

  • 8.1 引言 (Introduction)
  • 8.2 链路层状态概览 (Overview of Link Layer States)

    • 8.2.1 待机状态 (Standby State)
    • 8.2.2 广播状态 (Advertising State / Advertiser)
    • 8.2.3 扫描状态 (Scanning State / Scanner)
    • 8.2.4 发起状态 (Initiating State / Initiator)
    • 8.2.5 连接状态 (Connection State / Master or Slave)

  • 8.3 设备地址 (Device Address)

    • 8.3.1 公开设备地址 (Public Device Address)
    • 8.3.2 随机地址 (Random Address)

  • 8.4 物理信道 (Physical Channel)
  • 8.5 信道映射图 (Channel Map)
  • 8.6 自适应跳频 (Adaptive Frequency Hopping)
  • 8.7 事件 (Events)

    • 8.7.1 广播事件
    • 8.7.2 连接事件

  • 8.8 拓扑结构 (Topology)
  • 8.9 数据包格式

    • 8.9.1 前导码 (Preamble)
    • 8.9.2 接入地址 (Access Address)
    • 8.9.3 循环冗余校验 (CRC)
    • 8.9.4 协议数据单元 (PDU)

      • 8.9.4.1 广播信道 PDU
      • 8.9.4.2 数据信道 PDU (Data Channel PDUs)
      • 低功耗数据包扩展 (Low Energy Data Packet Extensions)


  • 8.10 位流处理 (Bit Stream Processing)
  • 8.11 链路层状态 (Link Layer States)

    • 8.11.1 非连接状态(Nonconnected states)

      • 8.11.1.1 待机状态 (Standby State)
      • 8.11.1.2 广播状态 (Advertising State)

        • 可连接非定向事件 (Connectable Undirected Event)
        • 可连接定向事件 (Connectable Directed Event)
        • 不可连接非定向事件 (Nonconnectable Undirected Event)
        • 可扫描非定向事件 (Scannable Undirected Event)

      • 8.11.1.3 扫描状态 (Scanning State)

        • 被动扫描 (Passive Scanning)
        • 主动扫描 (Active Scanning)

      • 8.11.1.4 发起状态 (Initiating State)

    • 8.11.2 连接状态 (Connection State)

  • 8.12 链路层控制过程 (Link Layer Control Procedures)

    • 8.12.1 连接更新过程 (Connection Update Procedure)
    • 8.12.2 信道映射图更新过程 (Channel Map Update Procedure)
    • 8.12.3 加密过程 (Encryption Procedure)



        • 8.12.3.1 启动加密过程 (Encryption Start Procedure)

      • 8.12.3.2 暂停加密与重新启动加密过程 (Encryption Pause Procedure and Encryption Restart Procedure)

    • 8.12.4 特性交换过程 (Feature Exchange Procedure)
    • 8.12.5 版本交换过程 (Version Exchange Procedure)
    • 8.12.6 终止过程 (Termination Procedure)
    • 8.12.7 连接参数请求过程 (4.1 增加)
    • 8.12.8 LE Ping 过程 (4.1 增加)
    • 8.12.9 数据长度更新过程 (4.2 增加)

  • 8.13 链路层过程管理 (Management of Link Layer Procedures)



      • 8.13.1 过程响应超时 (Procedure Response Timeout)
      • 8.13.2 过程冲突 (Procedure Collisions)
      • 8.13.3 LE 已认证载荷超时 (LE Authenticated Payload Timeout)


  • 8.14 链路层隐私 1.2 (Link Layer Privacy 1.2)

    • 8.14.1 在控制器而非主机中进行地址解析

      • 8.14.1.1 设备身份与解析列表 (Device Identity and Resolving List)

    • 8.14.2 更好的隐私 (Better Privacy)

      • 8.14.2.1 私有地址生成间隔 (Private Address Generation Interval)
      • 8.14.2.2 不同状态下的隐私 (Privacy in Different States)


  • 8.15 设备过滤与白名单 (Device Filtering and White List)

    • 8.15.1 广播过滤政策 (Advertising Filter Policy)
    • 8.15.2 扫描过滤政策 (Scanner Filter Policy)
    • 8.15.3 发起过滤政策 (Initiator Filter Policy)

  • 8.16 实际案例 (Practical Examples)
  • 8.17 总结 (Summary)

翻译自《Inside Bluetooth Low Energy, Second Edition》Naresh Gupta
8.1 引言 (Introduction)

本章主要介绍链路层(Link Layer)的运行机制。该层负责控制、协商和建立链路,选择数据传输频率,支持不同的拓扑结构以及多种数据交换方式。
链路层在 LE 协议栈中的位置如图 8.1 所示。它位于物理层(Physical Layer)之上,并向 L2CAP 层提供服务。

8.2 链路层状态概览 (Overview of Link Layer States)

链路层的运行可以通过一个非常简单的状态机来描述,该状态机包含以下五种状态:

  • 待机状态 (Standby State)
  • 广播状态 (Advertising State)
  • 扫描状态 (Scanning State)
  • 发起状态 (Initiating State)
  • 连接状态 (Connection State)

通常情况下,规范允许 LE设备支持多个实例,但通常只有一个实例。如果设备支持多个状态机实例,则每个状态机在同一时刻只能有一个状态处于活跃(Active)状态。此外,强制要求至少有一个状态机支持广播状态或扫描状态。
以下是对这五种状态的简要说明:
8.2.1 待机状态 (Standby State)

这是链路层的默认状态。在此状态下,不接收也不发送任何数据包。设备可以从任何其他状态进入待机状态。
8.2.2 广播状态 (Advertising State / Advertiser)

在此状态下,链路层发送广播数据包。它还可以监听响应广播包的设备,并据此对这些设备做出响应。当链路层决定开始广播时,可以从待机状态进入此状态。处于此状态的链路层被称为广播者(Advertiser)
示例:一个温度计持续向周围设备广播“我是一个温度计”。它还可以广播额外信息,例如提示有数据待发送。周围任何处于扫描状态的设备都可以捕获该数据包,并向温度计查询详细信息或决定与其建立连接。
8.2.3 扫描状态 (Scanning State / Scanner)

在此状态下,链路层监听来自广播者的数据包,并可以请求广播者提供额外信息。当链路层决定开始扫描时,可以从待机状态进入此状态。处于此状态的链路层被称为扫描者(Scanner)
8.2.4 发起状态 (Initiating State / Initiator)

在此状态下,链路层监听来自广播者的数据包,并通过发起连接来响应这些数据包。当扫描者决定与广播者发起连接时,可以从待机状态进入此状态。处于此状态的链路层被称为发起者(Initiator)
8.2.5 连接状态 (Connection State / Master or Slave)

在连接状态下,设备已与另一台设备建立连接。该状态定义了两种角色:主机角色(Master Role)从机角色(Slave Role)

  • 发起状态进入连接状态时,设备充当主机。
  • 广播状态进入连接状态时,设备充当从机。
根据 4.0 规范,从机角色只能与一台主机设备通信,不支持类似于 BR/EDR 的散射网(Scatternet)场景,这简化了链路层设计。而 4.1 规范 允许链路层支持散射网场景,设备可以作为一个微网(Piconet)的主机同时是另一个微网的从机,或者在不同的微网中担任多个从机角色。
8.3 设备地址 (Device Address)

与 BR/EDR 设备仅有一个蓝牙设备地址(BD_ADDR)不同,LE 设备可以拥有公开地址(Public Address)随机地址(Random Address) 或两者兼有。为了识别设备,必须至少拥有其中一种地址。
8.3.1 公开设备地址 (Public Device Address)

这种地址类似于 BR/EDR 设备的 BD_ADDR。在双模设备中,LE 控制器和 BR/EDR 控制器应共享相同的地址。它是一个全球唯一的 48 位地址,由 IEEE 管理,类似于以太网 MAC 地址。
公开地址由两个字段组成:

  • 24 位公司 ID:由 IEEE 注册机构分配,称为组织唯一标识符(OUI)。
  • 24 位唯一数字:由公司分配给每个控制器。
8.3.2 随机地址 (Random Address)

随机地址是 LE 的一项隐私特性,允许设备隐藏真实地址,使用随时间变化的随机地址。这可以确保设备不被追踪。
隐私场景示例:假设某人穿着支持 LE 的鞋子,鞋子会持续发送步数数据。如果使用固定地址,任何人都可以通过监听数据包来追踪该人的行踪。通过使用随机地址(每次发送数据时可以使用不同的地址),就可以防止这种追踪。LE 提供了一种解析机制,使得只有预期的接收者能够识别出这些不同的地址其实来自同一个设备。
随机地址分为两类:

  • 静态地址 (Static Address):设备在每次上电后可以初始化为一个新值,但在通电期间不能更改。
  • 私有地址 (Private Address)

    • 不可解析私有地址:对端设备永远无法发现真实地址。
    • 可解析私有地址:对端设备可以使用随机地址和连接的链路密钥推导出真实地址。

8.4 物理信道 (Physical Channel)

正如前一章提到的,LE 在 2.4 GHz ISM 频段中使用了 40 个射频(RF)信道。这些信道的间隔为 2 MHz。
这些射频信道被分为两个物理信道:

  • 广播物理信道 (Advertising Physical Channel):该物理信道使用三个射频信道(即信道 0、12 和 39),用于以下活动:

    • 发现设备。
    • 创建连接。
    • 广播和接收数据。

  • 数据物理信道 (Data Physical Channel):该物理信道使用剩余的 37 个射频信道,用于处于连接状态的设备之间的通信。
蓝牙规范精心选择了这些间隔较远的广播信道,以确保如果某一频率范围内存在其他设备的干扰,至少还有其他频率范围可用于广播。例如,如果 2400 MHz 到 2420 MHz 频段存在干扰,那么只有信道 0 会受到影响,而信道 12 和 39 仍可用于广播。
选择这些信道的另一个原因是为了减少与 WiFi 的干扰。许多支持蓝牙的设备(如手机、平板和笔记本电脑)也配有 WiFi 射频模块。因此,尽可能减少与 WiFi 的干扰至关重要。当 WiFi 设备开启时,默认使用 WiFi 信道 1、6 和 11。广播信道的频率范围经过精心选择,以避免与 WiFi 的这三个信道重叠。
40 个射频信道被映射为“数据信道索引”或“广播信道索引”。如图 8.3 所示。例如:

  • 射频信道 1 映射到数据信道 0。
  • 射频信道 2 映射到数据信道 1。
  • 射频信道 12 映射到数据信道 11。
  • 射频信道 0 映射到广播信道 37
  • 射频信道 12 映射到广播信道 38
  • 射频信道 39 映射到广播信道 39
    链路层在任何给定时间仅使用一个物理信道。

8.5 信道映射图 (Channel Map)

与 BR/EDR 类似,主机的链路层将数据信道分类为“已使用(Used)”或“不使用(Unused)”。如果主机的链路层怀疑某个信道存在干扰,它可以将该信道标记为未用。这样做有两个好处:

  • 存在潜在干扰的信道可以从跳频模式中排除。这减少了因在这些信道上传输失败而导致的重传次数。
  • 受到干扰的信道实际上可能正被共享 ISM 频段的其他技术使用。因此,这减少了蓝牙传输对这些技术的影响。
主机以位图(Bitmap) 的形式将已用和未用信道的信息提供给从机,以便两台设备可以使用相同的跳频频率。该位图被称为信道映射图(Channel Map)
如果主机怀疑有干扰,可以持续将信道标记为未用,直到剩下至少 2 个已用信道。这是主机必须使用的最小信道数量。
8.6 自适应跳频 (Adaptive Frequency Hopping)

LE 使用自适应跳频技术在 37 个数据信道中进行频率跳变。所使用的算法非常简单:

\[f_{n+1} = (f_n + \text{hopIncrement}) \pmod{37}\]

  • 如果 \(f_n\) 是一个已使用(Used)信道,则直接使用它。
  • 如果 \(f_n\) 是一个不使用(Unused)信道,则将其重新映射到“良好信道”集合中。(链路层会建立一个重映射表,将所有未用信道映射到已用信道上。)
主机在创建连接时设置跳跃增量(hop increment) 的值。它被设置为 5 到 16 之间的随机值。注意,跳跃增量是 LE 中引入的一个新概念,旨在简化下一个跳频频率的计算。在 BR/EDR 中,跳频模式的下一跳是主机参数(如时钟和 BD_ADDR)的函数。LE 通过简单地使用 5 到 16 之间的随机值作为增量简化了这一过程。更简单的算法在实现时自然会减少逻辑门数量(从而降低成本)和处理量(从而降低功耗)。之所以需要随机值,是因为如果恰好与另一个主机在某个频率上发生碰撞,两个主机后续的频率将基于不同的随机数。这样可以避免后续持续发生碰撞。
8.7 事件 (Events)

物理信道被细分为若干时间单位,这些单位被称为事件 (Events)
事件分为两类:

  • 广播事件 (Advertising Events)
  • 连接事件 (Connection Events)
8.7.1 广播事件

广播事件用于在广播物理信道上的传输。在每个广播事件开始时,广播者(Advertiser)发送一个广播包。扫描者(Scanner)接收该数据包,并根据广播包的类型,可能会向广播者发回请求。广播者在同一个广播事件内对该请求做出响应。随后,广播事件关闭。广播者在下一次发送广播包时会使用下一个广播信道。


图 8.4 展示了三个广播事件的示例。图 8.5 则展示了六个广播事件的嗅探器(Sniffer)抓包结果:

  • 第 425 帧:在信道 38 上的第一个广播事件(ADV_IND)。
  • 第 426 帧:在信道 39 上的第二个广播事件(ADV_IND)。
  • 第 427, 428, 429 帧:在信道 37 上的第三个广播事件。它由三个包组成:

    • 广播者发给扫描者的 ADV_IND 包。
    • 扫描者发给广播者的 SCAN_REQ 包。
    • 广播者响应扫描者的 SCAN_RSP 包。
    • 所有这些包构成一个完整的广播事件,且都在同一个信道上发送。

  • 第 430, 431, 432 帧:分别在信道 38、39、37 上进行的后续广播事件。
这表明广播者在三个广播信道(37, 38, 39)上按顺序循环广播。从 Delta 时间戳可以看出,广播者连续快速地在三个信道上发送数据包(间隔约 300-400 微秒),然后等待约 39 或 42 毫秒后再开始下一轮广播。这种巨大的时间间隙有助于广播者节省电池电量。
广播事件的定时由两个参数决定:

  • 广播间隔 (advInterval):范围从 20 毫秒到 10.24 秒。
  • 广播延迟 (advDelay):一个 0 到 10 毫秒的随机值。

\[T_{advEvent} = advInterval + advDelay\]
连接延迟与广播间隔成反比。广播间隔越大,建立连接所需的时间越长;反之则连接更迅速,但会更频繁地发送广播包,从而增加功耗。
4.1 版本规范为定向广播(Directed Advertising)引入了一种低占空比(Low Duty Cycle)模式。 这种模式适用于希望重新连接,但不要求必须快速连接的情况;或者在不确定预期的连接设备是否在覆盖范围内时也非常有用。由于广播数据包是以较低的速率发送的,因此低占空比模式下消耗的功耗更少。 蓝牙技术联盟(SIG)会根据所使用的广播模式推荐相应的扫描间隔,但具体选择哪种模式和间隔取决于应用程序的偏好。例如:如果外设在刚开机后希望快速建立连接,它可以执行快速广播(即较小的广播间隔);随后,根据所使用的应用程序类型,它可能会转而请求较慢的连接速率。
8.7.2 连接事件

连接事件用于在主机(Master)和从机(Slave)之间发送数据包。连接事件的起点被称为锚点 (Anchor Point)
在锚点处,主机向从机发送一个数据信道 PDU。随后,主机和从机在连接事件中交替发送数据包。从机总是响应主机的包,而主机则视情况响应从机的包。连接事件可由任一方关闭。同一事件内的所有包都在同一频率上传输,跳频发生在每个连接事件开始时。图 8.6 展示了三次连接事件。

连接事件的时序由两个参数决定:

  • 连接事件间隔 (connInterval):两个连续锚点之间的时间。它是 1.25 毫秒的倍数,范围在 7.5 毫秒到 4.0 秒之间。
  • 从机潜伏期 (connSlaveLatency):指从机在必须监听主机之前可以跳过的连续连接事件的数量。例如,若设为 10,则从机只需每 10 个事件监听一次。
此外,监督超时 (connSupervisionTimeout) 用于检测连接是否丢失。若在该时间内未收到任何包,则认为连接断开。
第一个连接事件安排在主机发送 CONNECT_REQ PDU 之后的一段时间内。主机会在 CONNECT_REQ PDU 中提供两个参数来指示传输窗口(Transmit Window)

  • transmitWindowOffset:指示 CONNECT_REQ PDU 与传输窗口之间的时间差。
  • transmitWindowSize:指示传输窗口的大小。
连接间隔(Connection Interval)和广播间隔(Advertising Interval)是影响设备电池寿命的两个重要参数。需要注意的是,这两个参数之间互不相关。广播间隔在连接建立阶段发挥作用,而连接间隔则在数据传输阶段发挥作用。
举例说明
考虑一个正在展出画作的艺术馆。当用户靠近一幅画时,关于艺术家的详情和画作描述可能会发送到用户的手机上。在这种情况下,建立连接如果花费几秒钟是可以接受的(因为在这种场景下,用户的行为可能是从一幅画缓慢走向另一幅画,并且在阅读详情前会先观赏画作)。然而,一旦连接建立,人们自然期望数据能被迅速传输。因此,可以据此对间隔进行微调:采用较高的广播间隔较低的连接间隔,这样既能提高电力效率,又不会损害用户体验。
8.8 拓扑结构 (Topology)

LE 的可能拓扑结构如图 8.7 所示:

  • 场景 A:一个广播者向两个扫描者发送广播包。
  • 场景 B:显示了一个微网(Piconet),其中一个主机连接了三个从机。此时,主机还同时充当扫描者,监听其他广播者的信号。如果该主机决定与新的广播者连接,该广播者将加入该微网并成为第四个从机。

与 BR/EDR 限制最多 7 个从机不同,LE 规范没有上限限制。主机的连接能力仅受其内存和处理能力的限制。
在 4.0 规范中,LE 设备一次只能属于一个微网,不支持散射网(Scatternet)。而 4.1 规范取消了这一限制,允许 LE 设备同时成为多个微网的一部分(例如在一个微网中当主机,在另一个中当从机),这支持了如传感器同时连接两部手机等更丰富的应用场景。
8.9 数据包格式

链路层只有一种数据包格式,同时用于广播物理信道和数据物理信道。这与 BR/EDR 形成了鲜明对比,后者拥有多种数据包格式(如 ID、NULL、POLL、FHS、DM)。这是低功耗蓝牙(LE)简化设计的又一举措。数据包格式如图 8.8 所示。

8.9.1 前导码 (Preamble)

前导码由接收器用于执行频率同步、符号定时估计和自动增益控制 (AGC) 训练。前导码是 1 和 0 交替的序列,可以是 10101010b 或 01010101b。接收器利用这一序列将其射频(Radio)同步到准确的频率,并调整增益,以确保后续数据包被正确接收。
8.9.2 接入地址 (Access Address)

接入地址被调谐到物理信道的设备用作相关码 (Correlation Code)。由于 LE 使用的物理信道数量有限,不相关的 LE 设备可能会在同一时间使用相同的射频信道。接入地址的作用是作为一种编码,确保传输确实是发送给正在接收它的设备的。每两个设备之间的每个链路层连接都有一个不同的接入地址。
如果链路层同步了信道的以下参数,则称其已连接到该信道:

  • 定时 (Timing)
  • 频率 (Frequency)
  • 接入地址 (Access Address)
链路层不必主动参与数据交换即可保持连接状态。这是相比 BR/EDR 的又一增强。为了保持连接,链路层不需要持续发送和接收数据。而在 BR/EDR 中,如果链路层已连接但没有数据要发送,它们仍会持续交换 POLL/NULL 包。
8.9.3 循环冗余校验 (CRC)

CRC 是在 PDU 上计算的 24 位校验和。LE 的一项增强是采用了 24 位 CRC,而 BR/EDR 使用的是 16 位。与 16 位相比,24 位 CRC 有助于检测更多类型的位错误(bit-errors)。这增强了鲁棒性,特别是在噪声环境下,此时发生多位错误的概率更高。
8.9.4 协议数据单元 (PDU)

PDU 分为两种类型:

  • 广播信道 PDU:用于在广播物理信道上发送数据包。
  • 数据信道 PDU:用于在数据物理信道上发送数据包。
8.9.4.1 广播信道 PDU

广播信道 PDU 的格式如图 8.9 所示。


  • PDU Type (PDU 类型):该字段指示广播信道 PDU 的具体类型。
  • TxAdd 和 RxAdd:分别为每种 PDU 类型单独定义,可能并不适用于所有 PDU 类型。它们用于指示载荷中包含的地址是公开地址(TxAdd/RxAdd = 0)还是随机地址(TxAdd/RxAdd = 1)。
  • Length (长度):指示载荷字段的长度(以八位字节/字节为单位)。
广播信道 PDU 主要有三类:

  • 广播 PDU (Advertising PDUs):由处于广播状态的链路层发送,由处于扫描状态或发起状态的链路层接收。不同类型的广播 PDU 见表 8.1。
  • 扫描 PDU (Scanning PDUs):由扫描者的链路层用于向广播者请求数据,以及由广播者用于响应扫描者的请求。不同类型的扫描 PDU 见表 8.2。
  • 发起 PDU (Initiating PDUs):由链路层用于向广播者发起连接。只有一种类型,见表 8.3。
广播和扫描 PDU 的示例如图 8.5 所示。在该例中,广播者在第 425、426、427、430、431 和 432 帧中发送了 ADV_IND PDU。

  • 扫描者在第 428 帧发送了 SCAN_REQ PDU。
  • 广播者在第 429 帧以 SCAN_RSP PDU 进行了响应。
PDU 名称广播事件类型发送方链路层状态接收方链路层状态ADV_IND可连接非定向广播广播状态 (Advertising)扫描/发起状态 (Scanning/Initiating)ADV_DIRECT_IND可连接定向广播广播状态 (Advertising)扫描/发起状态 (Scanning/Initiating)ADV_NONCONN_IND不可连接定向广播广播状态 (Advertising)扫描/发起状态 (Scanning/Initiating)ADV_SCAN_IND可扫描非定向广播广播状态 (Advertising)扫描/发起状态 (Scanning/Initiating)表 8.1 广播 PDU (Advertising PDUs)
PDU 名称扫描事件类型发送方链路层状态接收方链路层状态SCAN_REQ扫描者向广播者请求数据扫描状态 (Scanning)广播状态 (Advertising)SCAN_RSP广播者响应扫描者的请求广播状态 (Advertising)扫描状态 (Scanning)表 8.2 扫描 PDU (Scanning PDUs)
PDU 名称发起事件类型发送方链路层状态接收方链路层状态CONNECT_REQ发起者请求与广播者连接发起状态 (Initiating)广播状态 (Advertising)表 8.3 发起 PDU (Initiating PDUs)
8.9.4.2 数据信道 PDU (Data Channel PDUs)

数据信道 PDU 的格式如图 8.10 所示。

LLID 指示链路层 PDU 的类型,共有两种可能:

  • 链路层数据 PDU:用于发送 L 2 CAP 数据。
  • 链路层控制 PDU:用于控制和协商两个链路层之间的连接。定义了多种类型的链路层 PDU,用于与其他设备的链路层交换控制信息。
    NESN 字段表示期望从对端设备接收的下一个数据包的序列号。
    MD 指示设备有更多数据要发送,用于决定是否关闭当前的连接事件。
    SN 字段表示序列号,标识当前数据包。
    Length 指示载荷和 MIC 字段的大小(以字节为单位)。
    消息完整性检查(MIC) 字段仅在加密的链路层连接且载荷字段大小不为零时包含,用于对数据 PDU 进行身份验证。
    载荷(Payload) 字段的长度为 0 到 251 字节。
SN 和 NESN 这两个比特为数据包的确认和流量控制提供了一个非常简单的机制。如果数据包被正确接收,NESN 位就会增加,这作为给发送方的确认信号。如果数据包出错,NESN 不增加,指示发送方重发前一个包。如图 8.11 所示。

低功耗数据包扩展 (Low Energy Data Packet Extensions)

4.2 规范中最重要的变化之一是将长度字段从 5 位增加到 8 位。这使得支持的数据包大小从 27 字节增加到 251 字节。这在以下情况中非常有用:

  • 空中(OTA)固件升级:27 字节的包大小进行升级会耗时数分钟且耗电严重。增加包大小后,升级时间和能耗仅为 4.0 规范设备的一小部分。
  • 上传日志:对于收集大量数据(如每分钟记录一次心率)的传感器,使用更大的数据包传输速度更快且更省电。
    通常,大数据包比小数据包更有效率,因为协议头部的占比降低了(例如从 22% 降至 2%)。此外,更快的传输速度减少了丢失重要数据包的机会。
8.10 位流处理 (Bit Stream Processing)

图 8.12 展示了发送方加密、CRC 生成和白化,以及接收方逆向处理的步骤。其中数据是以 LSB First 的顺序传输的。

数据白化 (Data Whitening) 是为了避免在传输过程中出现长串的 0 或 1。在发送前,数据包的报头(Header)和载荷(Payload)会使用一个“白化字”进行扰码。这使数据随机化,从而降低出现长串连续 0 或 1 的可能性。在接收端,使用相同的白化字对数据进行解扰,以恢复原始数据。
当接收到一个数据包时,第一步是进行错误检查。这包括:

  • 检查接入地址 (Access Address):确保该数据包确实是发往当前链路层所连接的信道的。
  • CRC 校验
    LE 做出的一项重要优化是:在发送数据时,先加密再生成 CRC;在接收数据时,先检查 CRC 再进行解密。这与 BR/EDR 正好相反(BR/EDR 是发送时先 CRC 后加密,接收时先解密后 CRC)。在 LE 中,这种顺序具有以下优势:

  • CRC 校验比解密快得多。如果先进行 CRC 检查:

    • 快速确认:一旦 CRC 检查完成,就可以立即对接收到的数据包进行确认(ACK)。这样可以立即关闭射频(Radio)模块,而无需等待漫长的解密过程。
    • 降低峰值功耗:完整的解密过程可以在射频模块关闭后“离线”完成。由于解密和射频不同时工作,这有助于降低设备的峰值功耗。
    • 早期过滤损坏包:如果数据包在接收时已经损坏,CRC 检查会尽早发现并立即丢弃该包。对于这类损坏的包,不需要再浪费电量去执行解密操作。

8.11 链路层状态 (Link Layer States)

链路层状态可分为非连接状态连接状态,如图 8.13 所示。

为了降低复杂度,LE 不允许散射网(Scatternet) 场景,这意味着:

  • 设备不能同时担任 Master 和 Slave。
  • 处于 Slave 角色的设备不能进入发起(Initiating)状态。
  • 设备不能有多个 Slave 连接。
  • 如果已处于连接或发起状态,不能以会导致 Slave 角色连接的类型进行广告。
8.11.1 非连接状态(Nonconnected states)

包括:待机(Standby)广播(Advertising)扫描(Scanning)发起(Initiating) 状态。待机是默认状态,不收发数据,它是其他状态切换的中间跳板。
8.11.1.1 待机状态 (Standby State)

这是链路层的默认状态。在此状态下,既不发送也不接收任何数据包。从待机状态出发,设备可以进入广播状态扫描状态发起状态。但它不能从待机状态直接进入连接状态。设备可以从任何其他状态进入待机状态。事实上,为了简化状态机并减少状态转换的可能组合数量,链路层状态机被设计为仅保留最少必要的转换路径,而待机状态则被用作一个中间状态
例如,若要从扫描状态切换到发起状态,链路层首先从扫描状态进入待机状态,然后再从待机状态进入发起状态。
8.11.1.2 广播状态 (Advertising State)

在此状态下,链路层在广播事件(Advertising Events)中发送广播 PDU。在一个广播事件期间,链路层在每个使用的广播信道上发送一个或多个广播 PDU(主机可以要求链路层使用三个广播信道——37、38 和 39 中的全部或子集)。处于此状态的设备被称为广播者(Advertiser)
广播事件分为以下四种类型,与这些事件相关的广播 PDU 已在表 8.4 中列出:

  • 可连接非定向事件 (Connectable undirected event)
  • 可连接定向事件 (Connectable directed event)
  • 不可连接非定向事件 (Non-connectable undirected event)
  • 可扫描非定向事件 (Scannable undirected event)
广播事件类型使用的 PDU来自远端设备的可接受响应 PDU扫描者 (SCAN_REQ)发起者 (CONNECT_REQ)可连接非定向事件ADV_IND是是(来自任何发起者)可连接定向事件ADV_DIRECT_IND否是(仅来自寻址的发起者)不可连接非定向事件ADV_NONCONN_IND否否可扫描非定向事件ADV_SCAN_IND是否表 8.4 广播事件类型、使用的 PDU 及可接受的响应
可连接非定向事件 (Connectable Undirected Event)

当广播者希望另一个设备与其连接时,会发送此类事件。它在广播信道上发送一个广播指示(ADV_IND) PDU。其他设备在决定与该广播者连接之前,可能还会请求额外的信息。
可连接非定向事件(Connectable Undirected Event)的接收者既可以处于扫描状态,也可以处于发起状态

  • 如果处于扫描状态,它可以使用 SCAN_REQ PDU 请求更多信息。
  • 如果处于发起状态,它可以使用 CONNECT_REQ PDU 发送连接请求。
    这两种场景如图 8.14 所示。设备可以使用第一种场景,也可以使用第二种,或者先执行第一种(扫描请求)紧接着执行第二种(连接请求)。
    可连接非定向事件的载荷(Payload)包含以下两个字段:
  • AdvA (6 字节):广播者的公开地址或随机地址。地址类型由 TxAdd 字段指示(见图 8.9)。
  • AdvData (0-31 字节):包含来自广播者主机的广播数据。

一个可能的例子:安置在建筑物中的温度计。

  • 温度计可以持续广播——“我是一个温度计”;
  • 附近的任何手机都可以查询——“你支持以华氏度显示温度吗?”;
  • 温度计可以回答——“支持”;
  • 随后,手机可以连接到温度计并获取温度数据。
图 8.5 展示了一个 ADV_IND 的空口日志示例。广播者在第425 、 426 帧等发送广播 PDU。针对第427 帧发送的 ADV_IND 数据包,扫描者使用 SCAN_REQ PDU 请求额外信息。
可连接定向事件 (Connectable Directed Event)

当广播者(Advertiser)希望特定设备与其连接时,会使用可连接定向事件类型。它在广播信道上发送定向广播指示(ADV_DIRECT_IND)PDU。另一台设备在收到此 PDU 后,可以请求与广播者连接。ADV_DIRECT_IND PDU 包含了发起者(Initiator)广播者两者的设备地址。因此,只有其地址包含在该 PDU 中的发起者才被允许建立连接。其时序图如图 8.15 所示。

可连接定向事件的载荷包含以下两个字段:

  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 TxAdd 字段指示(见图 8.9)。
  • InitA (6 字节):发起者的公开地址或随机地址。类型由 RxAdd 字段指示(见图 8.9)。
这与“可连接非定向事件”形成对比:在非定向事件中,任何处于扫描或发起状态的设备都可以请求额外信息或连接广播者。而在此(定向事件)中,不允许请求额外信息,且只有特定的设备可以发起连接。
一个可能的例子:放置在慢跑者鞋里的计步器。
计步器可能需要向该人的手机发送信息:

  • 计步器可以广播:“我是计步器。我想向手机 A 发送数据。”
  • 手机 A 可以接收到此请求,连接到计步器并获取数据,然后显示给用户。
不可连接非定向事件 (Nonconnectable Undirected Event)

当广播者想要向所有设备提供某些信息,但不希望设备连接它或询问更多信息时,会使用不可连接非定向事件类型。它在广播信道上发送不可连接广播指示(ADV_NONCONN_IND)PDU。其他设备只能监听这些信息。其时序图如图 8.16 所示。

这与“可连接非定向”和“可连接定向”事件不同,因为接收者(必须处于扫描状态)只能接收此信息,既不能连接,也不能询问更多信息
不可连接非定向事件的载荷包含以下两个字段:

  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 TxAdd 字段指示(见图 8.9)。
  • AdvData (0–31 字节):包含来自广播者主机的广播数据。
    一个可能的例子:微波炉。
  • 微波炉可以广播:“我是微波炉。食物已煮好,请取出。”
  • 屋子里的人可以在他们的手机、电视或机顶盒上接收到此信息,并采取适当的行动。
可扫描非定向事件 (Scannable Undirected Event)

当广播者(Advertiser)希望允许扫描者(Scanner)向其请求更多信息时,会使用可扫描非定向事件类型。它发送一个可扫描广播指示(ADV_SCAN_IND)PDU,扫描者随后可以使用 SCAN_REQ PDU 请求更多信息。
这与“不可连接非定向广播事件”略有不同,因为在不可连接事件中,扫描者无法发回任何请求。而在这种模式下,扫描者可以发送扫描请求以获取更多数据。其时序图如图 8.17 所示。

可扫描非定向事件的载荷包含以下两个字段:

  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 TxAdd 字段指示(见图 8.9)。
  • AdvData (0–31 字节):包含来自广播者主机的广播数据。
    一个可能的例子:遥控器。
  • 遥控器可以广播:“我是遥控器。有一个按键被按下了。”
  • 扫描者可以发送一个 SCAN_REQ PDU,以获取有关“哪个按键被按下”的信息。
四种广播事件类型的总结见表 8.4。
8.11.1.3 扫描状态 (Scanning State)

在此状态下,链路层在广播信道(37、38、39)上监听来自广播者的任何 PDU。处于此状态的设备被称为扫描者 (Scanner)
扫描事件分为以下两种类型:

  • 被动扫描 (Passive Scanning)
  • 主动扫描 (Active Scanning)
被动扫描 (Passive Scanning)

在被动扫描中,链路层仅接收数据包,不发回任何数据包。一旦接收到数据包,它会去除重复内容,然后向主机发送广播报告。其时序图如图 8.18 所示。

主动扫描 (Active Scanning)

在主动扫描中,链路层监听广播 PDU,然后根据广播 PDU 的类型,可能会使用 SCAN_REQ PDU 向广播者请求额外信息。
只有当广播者使用可连接非定向事件(ADV_IND PDU)或可扫描非定向事件(此处指 ADV_SCAN_IND)时,才允许扫描者发送 SCAN_REQ。

SCAN_REQ PDU 的载荷包含以下两个字段:

  • ScanA (6 字节):扫描者的公开地址或随机地址。类型由 TxAdd 字段指示。
  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 RxAdd 字段指示。
    SCAN_RSP PDU 的载荷包含以下两个字段:
  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 TxAdd 字段指示。
  • AdvData (0–31 字节):包含来自广播者主机的广播数据。
    其时序图如图 8.19 所示。主动扫描的一个实际例子见图 8.5:在第 #428 帧,扫描者发送了 SCAN_REQ 以从广播者获取更多信息。
8.11.1.4 发起状态 (Initiating State)

在发起状态下,链路层在广播信道(37、38、39)上监听来自广播者的任何 PDU。如果获得许可,它会向广播者发送连接请求。
只有当广播者使用可连接非定向事件(ADV_IND PDU)或可连接定向事件(ADV_DIRECT_IND PDU)时,发起者才被允许发送 CONNECT_REQ。在后一种情况下,发起者的地址必须与定向广播 PDU 中提供的地址匹配。其时序图如图 8.20 所示。


图 8.21 展示了连接发起过程的嗅探器抓包。可以观察到以下现象:

  • 广播者在第 #670 、 #671 和 #672 帧发送了广播事件(ADV_IND)。
  • 发起者在第 #673 帧响应了 CONNECT_REQ 以创建连接。
8.11.2 连接状态 (Connection State)

当发起者(Initiator)向广播者(Advertiser)发送 CONNECT_REQ PDU 时,即进入此状态。如图 8.13 所示,进入此状态有两种方式:

  • 由处于发起状态的链路层进入:发起者成为连接的主机(Master)
  • 由处于广播状态的链路层进入:广播者(应指原 Advertiser)成为连接的从机(Slave)
进入连接状态后,连接被视为已“创建 (Created)”(但尚未“建立”)。连接创建后,一旦从对端设备接收到数据信道数据包,连接就被视为已“建立 (Established)”。两台设备之间只能存在一个 LE 连接。
CONNECT_REQ PDU 的载荷包含以下三个字段:

  • InitA (6 字节):发起者的公开地址或随机地址。类型由 TxAdd 字段指示(见图 8.9)。
  • AdvA (6 字节):广播者的公开地址或随机地址。类型由 RxAdd 字段指示(见图 8.9)。
  • LLData (22 字节):包含与连接相关的各种参数。

    • AA (4 字节):链路层连接的接入地址 (Access Address)。
    • CRCInit (3 字节):CRC 计算的初始化值(随机值)。
    • WinSize (1 字节):指示传输窗口大小 (transmit window size)。
    • WinOffset (2 字节):指示传输窗口偏移量 (transmit window offset)。
    • Interval (2 字节):连接间隔 (connInterval)。
    • Latency (2 字节):从机潜伏期 (connSlaveLatency)。
    • Timeout (2 字节):连接监督超时 (connSupervisionTimeout)。
    • ChM (5 字节):指示已用和未用信道的信道映射位图 (Channel bitmap)。
    • Hop (5 比特):用于跳频算法的跳跃增量 (Hop increment)。
    • SCA (3 比特):指示主机睡眠时钟的最差精度。

其中一些参数在本章前面的“连接事件”部分已经解释过。其时序图如图 8.22 所示。一旦连接建立,主机和从机就可以在连接事件中交换数据信道 PDU。

图 8.21 展示了连接发起过程的嗅探器抓包。左侧显示了 CONNECT_REQ PDU 的参数,包括:

  • InitA (6 字节):发起者的公开地址。
  • AdvA (6 字节):广播者的公开地址。
  • 连接接入地址 (Access Address)
  • LLData (22 字节) 包含以下内容:

    • CRC 初始化值:由主机提供的用于 CRC 计算的随机值。
    • transmitWindowSize = 3.75 ms。
    • transmitWindowsOffset = 86.25 ms。
    • connInterval = 86.25 ms。
    • connSlaveLatency = 0(这意味着从机必须监听每一个连接事件)。
    • connSupervisionTimeout = 7000 ms(这意味着如果 7 秒内未收到任何数据包,则认为连接丢失)。
    • ChannelMap:指示哪些信道可用于数据传输。
    • HopIncrement:10。这指示了在计算下一个跳频频率的算法中使用的跳跃增量。

8.12 链路层控制过程 (Link Layer Control Procedures)

链路层控制协议 (LLCP) 用于控制和协商两个链路层之间的连接。表 8.5 总结了链路层控制过程及其关联的 PDU。4.1 和 4.2 版本规范在现有过程中引入了一些新的过程和 PDU,这些也在表 8.5 中列出。这些 PDU 被封装在链路层控制 PDU 中,而后者是数据信道 PDU 的一部分。数据信道 PDU 的格式已在之前的图 8.10 中进行了说明。
这些过程只能串行调用。这意味着在任何给定时间,只能启动一个链路层过程。下一个链路层过程必须在前一个过程完成或超时后才能启动。唯一的例外是终止过程 (Termination procedure),它可以随时启动。
链路层过程链路层控制 PDU 名称简要目的连接更新过程LL_CONNECTION_UPDATE_REQ进入连接状态后,主机随时使用此过程更新连接的链路层参数。信道映射图更新过程LL_CHANNEL_MAP_REQ进入连接状态后,主机使用此过程更新用于跳频的信道映射图。启动加密过程LL_ENC_REQ
LL_ENC_RSP
LL_START_ENC_REQ
LL_START_ENC_RSP主机使用此过程启动加密,或在暂停加密过程后重新启动加密。暂停加密过程LL_PAUSE_ENC_REQ
LL_PAUSE_ENC_RSP如果主机想更换加密密钥,则使用此过程。暂停后通常紧跟启动加密过程以更换链路密钥。特性交换过程LL_FEATURE_REQ
LL_FEATURE_RSP连接建立后,由主机发起,用于交换支持的特性集信息。版本交换过程LL_VERSION_IND进入连接状态后,主机或从机均可发起,用于交换版本信息。终止过程LL_TERMINATE_IND连接状态下,主机或从机均可发起,用于终止连接。未使用/不支持的 PDULL_UNKNOWN_RSP如果收到未使用或不支持的 PDU,则发送此 PDU 作为响应。拒绝响应LL_REJECT_IND如果拒绝对方的请求则发送此 PDU。例如,当主机尝试启用加密而从机不支持时,从机发送此响应。连接参数请求过程 (4.1 增强)LL_CONNECTION_PARAM_REQ
LL_CONNECTION_PARAM_RSP主机或从机使用此过程请求对方更新连接参数。LE Ping 过程 (4.1 增强)LL_PING_REQ
LL_PING_RSP主机或从机使用此过程验证远端链路层的存在。数据长度更新过程 (4.2 增强)LL_LENGTH_REQ
LL_LENGTH_RSP主机或从机使用此过程通知对方数据 PDU 长度和 PDU 时间值的变化。特性交换过程 (4.1 增强)LL_SLAVE_FEATURE_REQ4.1 规范定义的新 PDU,允许从机请求主机支持的特性。扩展拒绝响应 (4.1 增强)LL_REJECT_IND_EXT4.1 规范定义的新 PDU,用于向对方支持扩展的拒绝指示。表 8.5 链路层控制过程与 PDU
8.12.1 连接更新过程 (Connection Update Procedure)

连接更新过程用于更新连接的以下链路层参数:

  • 连接间隔 (Connection Interval)
  • 从机潜伏期 (Connection Slave Latency)
  • 连接监督超时 (Connection Supervision Timeout)
    此过程只能由主机在进入连接状态后发起。其时序图如图 8.23 所示。

8.12.2 信道映射图更新过程 (Channel Map Update Procedure)

信道映射图更新过程用于更新连接的信道映射图。该映射图包含两个参数:

  • 信道映射图 (Channel Map):指示哪些信道被启用的位图。
  • 跳跃增量 (Hop Increment):指示后续每次跳频时跨越的信道数量。
    通过此过程,主机可以禁用那些可能存在干扰的信道上的跳频,从而减少因在受干扰信道上传输而导致的重传。这是支持自适应跳频 (AFH) 的核心过程。
    此过程只能由主机在进入连接状态后发起。其时序图如图 8.24 所示。

8.12.3 加密过程 (Encryption Procedure)

8.12.3.1 启动加密过程 (Encryption Start Procedure)

链路层使用启动加密过程来开启数据包的加密功能。该过程由主机(Host)通过向链路层发送启动加密请求来发起。主机还会提供长期密钥 (Long_Term_Key, LTK)。LTK 是一个 128 位密钥,用于生成在该加密连接中使用的会话密钥 (Session Key)。如果连接尚未加密,则直接使用启动加密过程 (Encryption Start Procedure)。如果连接已经处于加密状态,则需要先执行“暂停加密过程”,紧接着再执行“启动加密过程”。

8.12.3.2 暂停加密与重新启动加密过程 (Encryption Pause Procedure and Encryption Restart Procedure)

如果链路已加密,但需要在不掉线的情况下使用新的加密密钥,链路层会使用此过程。链路层先暂停加密,然后使用新密钥重复前一节所述的启动加密过程。
加密重新启动 (Encryption Restart) 在需要动态增加或减少安全级别时非常有用。例如,初始建立连接时安全级别较低,但在传输敏感数据时,可以使用此过程更换链路密钥并提升安全级别。

8.12.4 特性交换过程 (Feature Exchange Procedure)

特性交换过程用于交换有关当前支持的特性集(Feature Set) 的信息。特性集是一个位图(Bitmap),展示了主机或从机的特性能力。在 4.0 规范中,特性集仅包含“是否支持加密”的信息,其他位预留。
此过程仅应在进入连接状态后由主机(Master) 发起。该过程的时序图如图 8.27 所示。
4.1 和 4.2 版本规范对特性集(Feature Set)及特性交换过程进行了多项增强。
支持特性的信息可以在两个层级进行交换:

  • 从控制器发送到主机的信息:在这种情况下,不支持的特性通过将 FeatureSet 字段中对应的位(Bit)设为 0 来表示。
  • 从控制器发送到对端控制器的信息:在这种情况下,如果控制器允许使用某项特性,它会将 FeatureSet 字段中对应的位设为 1。
    以下特性已添加到 4.1 规范的特性集中:
  • 连接参数请求过程 (Connection parameters request procedure)
  • 扩展拒绝指示 (Extended reject indication)
  • 从机发起的特性交换 (Slave-initiated features exchange)
  • LE Ping
    4.1 及以上版本的规范允许主机和从机双方均可发起特性交换过程。这在图 8.27 中有所展示。
    以下特性已添加到 4.2 及以上版本的特性集中:
  • LE 数据包长度扩展 (LE data packet length extension)
  • 链路层隐私 (LL privacy)
  • 扩展扫描器过滤策略 (Extended scanner filter policies)
    有关位偏移位置、其对应的特性,以及这些位在“控制器到主机”或“控制器到控制器”之间是否有效的详细信息见表 8.6。
位偏移链路层特性引入规范版本控制器 -> 主机控制器 -> 对端0LE 加密 (LE Encryption)4.0是 (Y)是 (Y)1连接参数请求过程 (Connection Parameters Request Procedure)4.1是 (Y)是 (Y)2扩展拒绝指示 (Extended Reject Indication)4.1是 (Y)是 (Y)3从机发起的特性交换 (Slave-initiated Features Exchange)4.1是 (Y)是 (Y)4LE Ping (LE Ping)4.1是 (Y)否 (N)5LE 数据包长度扩展 (LE Data Packet Length Extension)4.2是 (Y)是 (Y)6LL 隐私 (LL Privacy)4.2是 (Y)否 (N)7扩展扫描器过滤策略 (Extended Scanner Filter Policies)4.2是 (Y)否 (N)8–63预留 (RFU)---表 8.6 特性集位映射 (Bit Mapping for Feature Set)
8.12.5 版本交换过程 (Version Exchange Procedure)

进入连接状态后,主机或从机均可发起此过程来交换版本信息,包括:

  • 公司 ID (Company ID)
  • 链路层版本 (Link Layer Version)
  • 子版本号 (Sub Version Number)
如果对端在当前连接中尚未发送过版本信息,它会使用相同的 PDU (LL_VERSION_IND) 进行响应。

8.12.6 终止过程 (Termination Procedure)

主机或从机均可使用此过程来终止当前连接。一旦进入连接状态即可使用。

8.12.7 连接参数请求过程 (4.1 增加)

主机或从机均可使用此过程请求对端在连接状态下更新连接参数,包括:

  • connInterval (连接间隔)
  • connSlaveLatency (从机潜伏期)
  • connSupervisionTimeout (监督超时)
如果接收设备不接受这些参数,它可以回复一套备选参数或发送 LL_REJECT_IND_EXT PDU。

8.12.8 LE Ping 过程 (4.1 增加)

类似于网络世界的 Ping 命令,此过程用于验证远端链路层的存在。此外,它还可以通过请求远端 ACL 层发送带有有效消息完整性检查 (MIC) 的数据包来检查消息的完整性。
如果远端链路层不支持 Ping 命令,它会回复 LL_UNKNOWN_RSP

8.12.9 数据长度更新过程 (4.2 增加)

此过程用于通知远端链路层以下参数的变化:

  • 最大接收 PDU 载荷长度 (connMaxRxOctets)
  • 最大接收 PDU 时间 (connMaxRxTime)
  • 最大发送 PDU 载荷长度 (connMaxTxOctets)
  • 最大发送 PDU 时间 (connMaxTxTime)
这允许设备根据缓冲区情况动态调整。例如,如果接收缓冲区快满了,它可以通知对方减小最大 PDU 长度;当缓冲区释放后,再重新调大。

8.13 链路层过程管理 (Management of Link Layer Procedures)

为了确保对等链路层之间能够平滑交互,规范定义了关于超时和冲突处理的特定规则。
8.13.1 过程响应超时 (Procedure Response Timeout)

由于 LE 是一种无线协议,对等设备可能会随时超出通信范围,并可能在一定时间间隔内重新回到范围内。此外,远程设备也可能停止响应(例如由于固件 Bug 导致设备挂起或电池耗尽)。
链路层定义了 40 秒 的过程响应超时。如果在此超时时间内未收到对链路层 PDU 的响应,则认为连接已丢失,并向主机(Host)发出通知。
需要注意的是,这与 BR/EDR 中用于监控链路丢失的“链路监督超时(Link Supervision Timeout)”非常相似。如果在此期间未收到来自远端的数据包,则会向主机指示链路监督超时事件。BR/EDR 的默认链路监督超时为 20 秒,而链路层过程使用的超时为 40 秒。
8.13.2 过程冲突 (Procedure Collisions)

主机(Master)和从机(Slave)可能会同时发起相同的过程,或发起更新相同链路层参数的不同过程。在这种情况下,由主机发起的过程序具有优先级。因此,如果主机已经发起或正在发起与从机类似的过程,主机将拒绝从机发起的过程。
8.13.3 LE 已认证载荷超时 (LE Authenticated Payload Timeout)

4.1 版本规范引入了一项支持:定义了一个最大时间间隔,在此间隔内必须从对端设备接收到一个“已认证数据包”(即包含有效 MIC 校验的数据包)。
如果在此间隔内未收到数据包且超时即将到期,链路层可以发送一个 Ping 请求(LE_Ping 过程),以便从远端接收一个已认证的数据包。该超时的默认值为 30 秒
8.14 链路层隐私 1.2 (Link Layer Privacy 1.2)

由于许多 LE 设备(如鞋子、手表、心率传感器等)都是由人携带或佩戴的,追踪这些设备就意味着可以通过追踪其发射信号来追踪个人。这可能会损害个人隐私。
例如,一个佩戴在手腕上的健身手环。每当它需要向手机传输数据时,它就会开始广播。这些广播包可以被嗅探器或恶意设备截获以确定用户的位置。因此,长期追踪广播包可以作为一种追踪用户的手段。
隐私特性通过频繁更换蓝牙设备地址来防止设备被追踪。它不在广播包中发送真实地址,而是插入一个随时间变化的伪随机值(Resolvable Private Address, RPA)。如何将此随机地址解析为真实地址的信息仅对等设备已知,因为这是在设备配对(Pairing) 时交换的。
在配对期间,两个设备之间会交换身份解析密钥 (Identity Resolution Keys, IRK)。只有拥有 IRK 的设备才能将伪随机地址解析为真实地址。伪随机地址会以两个设备都已知的频繁间隔进行更换。
这是一项可选功能,最初在 4.0 规范中引入,隐私相关的处理由协议栈的高层(通常运行在主机 Host 中)完成。而 4.2 规范的一项关键增强是实现了链路层级别(控制器端)的隐私保护。
8.14.1 在控制器而非主机中进行地址解析

以健身手环为例,为了维护隐私,其地址会不断变化。当手机收到手环的广播包时,运行在控制器(Controller) 中的链路层可以通过解析该地址来确定数据包是否来自该手环。因此,链路层仅向主机传递选中设备的信息,而不是所有设备的信息。
在 4.0 规范中,私有地址由主机生成和解析;而在 4.2 规范中,私有地址由控制器独立完成生成和解析,无需主机参与。主机仅向控制器提供设备身份信息
如果周围有多个设备,而主机对其他设备的传输不感兴趣,这种机制可以带来巨大的省电效果,因为主机不需要被频繁唤醒去解析地址。
8.14.1.1 设备身份与解析列表 (Device Identity and Resolving List)

主机向控制器提供设备身份信息后,控制器即可自行解析地址。一个设备身份包含对端设备的身份地址以及解析身份所需的本地和对端密钥对(即 IRK)。
主机和控制器在相互通信时通过身份地址来指代对端设备。如果控制器能够解析出对端设备,它会在事件中(如提供 LE 广播报告事件时)发送该设备身份地址。
解析列表(Resolving List) 是所有已绑定设备的身份集合。主机维护此列表并将其提供给控制器。主机可以使用 HCI 命令(如 LE_Add_Device_To_Resolving_List)随时添加或删除身份。如果控制器存储空间有限,主机可以仅提供解析列表的一个子集。
8.14.2 更好的隐私 (Better Privacy)

设备的私有地址被用于广播包中,并由对端设备用于创建连接。该地址会以固定的时间间隔进行更改。对端设备在发起连接之前,必须先解析此地址。
8.14.2.1 私有地址生成间隔 (Private Address Generation Interval)

链路层使用一个定时器来定期生成私有地址。私有地址会在以下两种情况下生成:链路层重置定时器到期
一旦生成了新地址,定时器就会重新启动。协议规范建议该定时器时长为 15 分钟
8.14.2.2 不同状态下的隐私 (Privacy in Different States)

链路层在广播(Advertising)扫描(Scanning),和发起(Initiating) 状态下均会使用私有地址。
延续之前的例子:当健身手环想要与手机建立连接时,它会在广播包(ADV_IND 或 ADV_DIRECT_IND)中发送其私有地址。手机接收并解析该地址后,在发送扫描请求和连接请求时,可以发送它自己的私有地址,同时指向该健身手环的私有地址。
8.15 设备过滤与白名单 (Device Filtering and White List)

LE 引入的一项重要节能机制是设备过滤。通过设备过滤,链路层可以被限制为仅响应一组特定的设备。这是通过链路层维护的白名单(White List) 实现的。白名单本质上是链路层允许响应的设备集合(广播者、扫描者或发起者)。
来自不在白名单中的设备的传输将被直接忽略。这减少了链路层的发射次数,从而降低了控制器的功耗。此外,它还减少了控制器与主机之间的通信,进一步降低了两者的功耗。
除了节能,白名单还简化了主机在某些场景下的处理。例如,当主机希望与列表中的任意一个设备建立连接时,可以指定白名单,由控制器自动连接其中一个可用设备。
8.15.1 广播过滤政策 (Advertising Filter Policy)

该政策决定广播者的链路层如何处理扫描和连接请求。主机可以通过 HCI 命令选择四种模式:

  • 仅处理白名单中设备的扫描和连接请求。
  • 处理所有设备的扫描和连接请求(不使用白名单,这是重置后的默认值)。
  • 处理所有设备的扫描请求,但仅处理白名单中设备的连接请求。
  • 处理所有设备的连接请求,但仅处理白名单中设备的扫描请求。
注意:此政策不适用于可连接定向广播,因为定向广播仅接受其指定的特定设备的请求。
8.15.2 扫描过滤政策 (Scanner Filter Policy)

该政策决定扫描者的链路层如何处理广播包:

  • 仅处理白名单中设备的广播包。
  • 处理所有广播包(不使用白名单,默认值)。
4.2 版本的增强
4.0 规范中,如果不包含扫描者地址的定向广播会被忽略,但这在扫描者使用 RPA(可解析私有地址) 时会出问题。4.2 增加了增强政策:在过滤时,如果发起者地址是一个可解析私有地址,则不会立即忽略,而是先进行解析再决定是否接受。这大大加强了链路层隐私。
8.15.3 发起过滤政策 (Initiator Filter Policy)

决定发起者的链路层如何处理广播包:

  • 处理来自白名单中所有设备的可连接广播包。
  • 仅处理来自主机指定的单个特定设备的可连接广播包(不使用白名单,默认值)。
8.16 实际案例 (Practical Examples)

图 8.33展示了两个设备的链路层之间为支持 Proximity Profile(近场感应规范) 而进行的交互空口日志。这些过程是在两个设备建立连接后执行的。

执行的过程顺序如下:

  • 第 #676 和 #677 帧:主机和从机的链路层交换它们支持的版本信息。
  • 第 #702 到 #708 帧:这些帧用于在链路路上启动加密。
  • 第 #2628 , #2985 , #3578 帧:主机的链路层向从机提供更新后的信道映射图(Channel Map)。
  • 第 #4785 帧:从机请求终止链路。
8.17 总结 (Summary)

顾名思义,链路层负责链路的维护。这包括建立链路、选择频率、支持不同的拓扑结构以及断开链路。LE 为链路层使用了非常简单的架构,仅包含五个状态。它施加了多项限制以使链路层状态机保持极简,从而降低了实现的芯片成本和功耗。
LE 使用专用信道进行广播和数据传输。本章详细解释了两个设备的链路层之间可以交换的 PDU 格式。
下一章将重点讨论 HCI 接口。上层协议栈正是通过 HCI 接口与链路层进行交互的。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2025-12-29 06:54:31

举报

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