BLE Link Layer【状态机】:Advertising、Scanning、Initiating、Connection 到底是什么关系?

发布时间:2026/6/30 4:41:22
BLE Link Layer【状态机】:Advertising、Scanning、Initiating、Connection 到底是什么关系? 在学习 BLE Legacy 广播、扫描、连接流程时很容易只盯着 HCI Command 看比如LE Set Advertising Parameters LE Set Advertising Data LE Set Scan Response Data LE Set Advertising Enable LE Set Scan Parameters LE Set Scan Enable LE Create Connection但是如果只看 HCI Command很容易出现一个问题知道了 Host 给 Controller 下发了什么命令却不清楚 Controller 底层的 Link Layer 到底处于什么状态。所以在继续理解 BLE 广播、扫描、发起连接、连接建立之前很有必要先理解 Bluetooth Core Spec 中对Link Layer State Machine的描述。这部分内容主要回答几个问题BLE Link Layer 有哪些状态 Advertising State、Scanning State、Initiating State、Connection State 是什么关系 Central / Peripheral 角色是怎么来的 Advertiser 能不能主动发起连接 Central 定义连接时序是什么意思 一个连接事件里可以发送几包数据 为什么有些 BLE 芯片不支持某些 HCI Command一、原文翻译1. General description1. 总体描述1.1 Link Layer states1.1 链路层状态Link Layer 的运行可以用一个状态机来描述该状态机包含以下状态Standby State Advertising State Scanning State Initiating State Connection State Synchronization State Isochronous Broadcasting State对应翻译如下Standby State待机状态 Advertising State广播状态 Scanning State扫描状态 Initiating State发起连接状态 Connection State连接状态 Synchronization State同步状态 Isochronous Broadcasting State等时广播状态Link Layer 状态机一次只允许一个状态处于激活状态。Link Layer 至少应该有一个 Link Layer 状态机并且该状态机至少要支持 Advertising State 或 Scanning State 其中之一。Link Layer 可以拥有多个 Link Layer 状态机实例。Link Layer 处于 Standby State 时不发送也不接收任何包。Standby State 可以从任何其他状态进入。Link Layer 处于 Advertising State 时会发送 advertising physical channel packets也就是广播物理信道包并且可能监听和响应由这些广播物理信道包触发的响应。处于 Advertising State 的设备称为 advertiser也就是广播者。Advertising State 可以从 Standby State 进入。Link Layer 处于 Scanning State 时会监听正在广播的设备发送的 advertising physical channel packets。处于 Scanning State 的设备称为 scanner也就是扫描者。Scanning State 可以从 Standby State 进入。Link Layer 处于 Initiating State 时会监听来自指定设备的 advertising physical channel packets并响应这些包从而发起与另一个设备的连接。处于 Initiating State 的设备称为 initiator也就是连接发起者。Initiating State 可以从 Standby State 进入。Connection State 可以从 Initiating State 进入也可以从 Advertising State 进入。处于 Connection State 的设备称为处于连接中。在 Connection State 中定义了两个角色Central Role Peripheral Role对应翻译如下Central Role中心角色 Peripheral Role外围角色如果是从 Initiating State 进入 Connection State那么 Connection State 应处于 Central Role。如果是从 Advertising State 进入 Connection State那么 Connection State 应处于 Peripheral Role。处于 Central Role 的 Link Layer 会与处于 Peripheral Role 的设备通信并且定义传输时序。处于 Peripheral Role 的 Link Layer 会与单个处于 Central Role 的设备通信。Link Layer 处于 Synchronization State 时会监听周期性物理信道包这些包组成一个特定的周期广播序列并且来自某个正在发送 periodic advertising 的指定设备。Synchronization State 可以从 Standby State 进入。在该状态下Host 可以指示 Link Layer 去监听来自指定设备的等时数据包该设备正在发送 Broadcast Isochronous Group也就是 BIG。处于 Synchronization State 并且正在接收等时数据包的设备称为 Synchronized Receiver也就是同步接收者。Link Layer 处于 Isochronous Broadcasting State 时会在等时物理信道上发送等时数据包。Isochronous Broadcasting State 可以从 Standby State 进入。处于 Isochronous Broadcasting State 的设备称为 Isochronous Broadcaster也就是等时广播者。图 1.1 是 Link Layer 状态机的状态图。1.1.1 Permitted state and role combinations1.1.1 允许的状态和角色组合Link Layer 可以选择性地支持多个状态机。如果 Link Layer 支持多个状态机那么可以支持任意状态和角色组合。特别是在满足第 4.5 节要求的前提下Link Layer 可以多次处于 Connection State并且这些连接可以是 Central Role 和 Peripheral Role 的任意组合。注意如果一个设备支持扫描 periodic advertising也就是周期广播扫描那么它必须至少支持两个状态机。Link Layer 的实现不要求支持规范允许的所有状态组合。但是如果它支持表 1.1 中 “Combination A” 列给出的某个状态或状态组合那么它也必须支持 “Combination B” 列中对应的状态或状态组合。表 1.1对支持状态和状态组合的要求Combination ACombination BInitiating 加上其他状态的任意组合 CConnectionCentral role加上相同的组合 CConnectionCentral role加上 Initiating再加上其他状态的任意组合 CConnectionCentral role与多个处于 Peripheral role 的设备连接加上相同的组合 C一个 connectable Advertising state加上其他状态的任意组合 CConnectionPeripheral role加上相同的组合 CConnectionPeripheral role加上一个 connectable Advertising state再加上其他状态的任意组合 CConnectionPeripheral role与多个处于 Central role 的设备连接加上相同的组合 C在每一种情况下其他状态组合 C 可以为空。在最后两行中“other states” 包括其他 connectable Advertising states。1.1.2 Devices supporting only some states1.1.2 只支持部分状态的设备如果设备只支持部分 Link Layer 状态或者只支持 Connection State 中两个角色之一那么它不要求支持那些只被它不支持的状态或模式使用的功能。这些功能包括但不限于特定 PDU 特定 procedure 特定 data length 特定 HCI command 某个 HCI command 中的特定功能也就是说如果一个设备根本不支持某个 Link Layer 状态或者角色那么它也不必支持那个状态或角色专用的底层能力。二、必要 TipTip 1这部分是 BLE Link Layer 的“状态机总地图”这部分内容不是在讲某一个 HCI Command而是在讲 BLE Controller 底层 Link Layer 的状态机。可以把它理解成 BLE 底层行为的总地图。比如设备不工作时Standby State 设备发广播时Advertising State 设备扫描广播时Scanning State 设备主动发起连接时Initiating State 设备连接成功后Connection State常见流程可以这样理解从设备广播 Standby - Advertising 主设备扫描 Standby - Scanning 主设备发起连接 Standby - Initiating - Connection(Central) 从设备被连接 Standby - Advertising - Connection(Peripheral)所以在学习 BLE 广播、扫描、连接时不能只看 App 层 API也不能只看 HCI Command还要理解 Link Layer 当前处于什么状态。Tip 2单个 Link Layer 状态机一次只能处于一个状态规范中有一句非常关键的话The Link Layer state machine allows only one state to be active at a time.意思是一个 Link Layer 状态机一次只允许一个状态处于激活状态。所以对于同一个 Link Layer 状态机来说它不能同时既是 Advertising State又是 Initiating State。比如单个状态机下Advertising State 不能直接同时也是 Initiating State Scanning State 不能直接同时也是 Advertising State Connection State 不能直接同时也是 Standby State但是规范后面又说The Link Layer may have multiple instances of the Link Layer state machine.也就是说Link Layer 可以有多个状态机实例。所以要区分两个概念单个状态机一次只能处于一个状态 整个蓝牙控制器可能支持多个状态机因此可以同时做多件事情Tip 3Advertising State 下的设备能不能进入 Initiating State这个问题要分两层看。如果说的是同一个 Link Layer 状态机那么 Advertising State 不能直接进入 Initiating State。从规范图来看Advertising State 和 Initiating State 都是从 Standby State 进入的。对于单个状态机更合理的路径是Advertising - Standby - Initiating而不是Advertising - Initiating所以严格来说Advertising State 本身不是 Initiating State Advertiser 当前不是连接发起者 Advertiser 在可连接广播中是被连接的一方例如 Legacy 可连接广播中Advertiser 发送 ADV_IND Initiator 扫描到 ADV_IND Initiator 发送 CONNECT_IND Advertiser 接收 CONNECT_IND Advertiser 进入 Connection State此时 Advertiser 的路径是Advertising State - Connection State它进入连接后是Peripheral Role但是如果说的是同一个物理蓝牙设备答案又不一样。如果这个蓝牙控制器支持多个 Link Layer 状态机那么同一个设备可以一个状态机在 Advertising State另一个状态机在 Initiating State。例如状态机 AAdvertising State 状态机 BInitiating State这样看起来就是这个设备一边在广播 这个设备一边又主动连接另一个设备但更严谨的说法是不是 Advertising State 直接发起连接 而是同一个控制器的另一个 Link Layer 状态机处于 Initiating State 并发起连接。所以这个问题可以总结为单个 Link Layer 状态机下Advertiser 不能直接从 Advertising State 进入 Initiating State。 但是如果控制器支持多个 Link Layer 状态机同一个物理设备可以同时作为 advertiser 和 initiator。Tip 4Advertiser 在可连接广播中是被连接的一方Advertising State 的设备会发送 advertising physical channel packets并且可能监听和响应这些广播包触发的响应。这句话很重要因为 Advertising State 不是“只发广播”。在 Legacy 广播中Advertiser 可能会遇到两类典型响应第一类是扫描请求Advertiser 发送 ADV_IND / ADV_SCAN_IND Scanner 发送 SCAN_REQ Advertiser 回复 SCAN_RSP第二类是连接请求Advertiser 发送 ADV_IND Initiator 发送 CONNECT_IND Advertiser 接收 CONNECT_IND Advertiser 进入 Connection State所以 Advertiser 虽然主要是在“广播”但它也可能会监听并响应对端请求。不过注意回复 SCAN_RSP 不代表建立连接 接收 CONNECT_IND 才表示进入连接建立流程Tip 5Scanning State 和 Initiating State 都是在监听广播但目的不同Scanning State 和 Initiating State 都会监听 advertising physical channel packets。但是两者目的不同。Scanning State 的目标是发现设备Scanner 监听广播包 可能发送 SCAN_REQ 可能收到 SCAN_RSP 最后上报 Advertising Report 给 HostInitiating State 的目标是建立连接Initiator 监听指定设备的广播包 找到目标后发送连接请求 然后进入 Connection State所以不能把扫描和发起连接混为一谈。可以这样理解Scanning State我只是想发现附近有哪些设备 Initiating State我已经有目标了我要连接某个设备在 HCI Command 层面对应关系可以粗略理解为LE Set Scan Parameters / LE Set Scan Enable 主要对应 Scanning 行为 LE Create Connection 主要对应 Initiating 行为当然具体还要看 Legacy Advertising、Extended Advertising、Filter Policy、Accept List 等配置。Tip 6Central / Peripheral 角色不是随便定义的而是由进入 Connection State 的路径决定规范中说得很清楚When entered from the Initiating state, the Connection state shall be in the Central Role. When entered from the Advertising state, the Connection state shall be in the Peripheral Role.翻译过来就是从 Initiating State 进入 Connection State连接角色是 Central。 从 Advertising State 进入 Connection State连接角色是 Peripheral。所以 Central / Peripheral 不是随便叫的也不是根据设备性能强弱决定的。更准确地说主动发起连接的一方Initiator - Connection(Central) 被连接的一方Advertiser - Connection(Peripheral)也就是Initiating State - Connection State Central Role Advertising State - Connection State Peripheral Role这对理解 BLE 连接非常重要。不是“手机一定是 Central蓝牙模块一定是 Peripheral”。在很多常见场景中确实是手机扫描并连接蓝牙模块所以手机是 Central模块是 Peripheral。但是从协议角色来说角色取决于连接建立路径而不是设备类型。如果一个蓝牙模块主动连接另一个设备那么这个模块在这条连接中也可以是 Central。如果一个手机发广播并被其他设备连接那么手机在这条连接中也可以是 Peripheral。Tip 7同一个设备可以在不同连接中扮演不同角色如果控制器能力足够同一个设备可以同时存在多条连接并且在不同连接中扮演不同角色。例如Device A ├── 对 Device B作为 Peripheral └── 对 Device C作为 Central也就是说Central / Peripheral 是针对某一条连接来说的角色 不是整个设备永久固定的身份一个设备在连接 1 中是 Central在连接 2 中也可以是 Peripheral。但是这要求底层控制器支持多个 Link Layer 状态机、多连接、多角色能力。不是所有 BLE 芯片都支持这种能力。Tip 8Central 定义传输时序是什么意思规范中说The Link Layer in the Central Role will communicate with a device in the Peripheral Role and defines the timings of transmissions.这里的关键是Central Role defines the timings of transmissions.翻译成中文就是Central 角色定义传输时序。这句话可以理解为BLE 连接建立以后不是双方想什么时候发就什么时候发 而是由 Central 规定连接通信的节奏 Peripheral 按照这个节奏醒来、监听、收发数据。BLE 连接后的通信是发生在一个个 Connection Event 中的。Connection Interval 决定连接事件多久来一次。例如Connection Interval 30 ms可以简单理解为每隔 30 msCentral 和 Peripheral 进行一次连接事件时间线大致如下0 ms 30 ms 60 ms 90 ms |----------|----------|----------| 连接事件1 连接事件2 连接事件3 连接事件4在每个连接事件中通常是 Central 先发包Peripheral 再回应。Connection Event Central - Peripheral Peripheral - Central Central - Peripheral Peripheral - Central ...Peripheral 不能随便想什么时候发就什么时候发。Peripheral 的工作方式更像是根据连接参数计算下一次连接事件时间 到时间点醒来监听 等待 Central 发第一个包 收到后再回应 本次连接事件结束后继续休眠 等待下一次连接事件所以可以这样记Central 定节奏 Peripheral 跟节奏 双方在一个个 Connection Event 中通信这也是 BLE 能够低功耗运行的重要原因之一。Peripheral 不需要一直开着射频监听它只需要按照 Central 定义的连接时序周期性醒来。Tip 9连接请求中会包含连接时序相关参数Central 之所以能够定义连接时序是因为它在发起连接时会在连接请求中带上连接相关参数。以 Legacy 连接为例Initiator 会发送 CONNECT_IND。CONNECT_IND 中会包含一系列连接参数例如Access Address CRC Init Window Size Window Offset Connection Interval Peripheral Latency Supervision Timeout Channel Map Hop Increment Sleep Clock Accuracy这些参数会告诉 Advertiser连接从什么时候开始 连接事件多久来一次 使用哪些数据信道 如何跳频 Peripheral 可以跳过多少个连接事件 多久没通信就认为连接断开所以 Advertiser 接收连接请求并进入 Connection State 后就会按照这些参数作为 Peripheral 与 Central 通信。这就是“Central 定义时序”的具体体现。Tip 10一个连接事件可以发送几包数据一个 Connection Event 里可以发送几包数据规范上不是一个固定值。不能简单理解成一个连接事件只能发一包更准确的理解是一个连接事件中Central 和 Peripheral 可以交替发送多个 Link Layer Data PDU。 具体能发送几包取决于连接事件长度、PHY、Data PDU 长度、MD 位、控制器调度能力等因素。最简单的连接事件可以是一来一回Connection Event Central - Peripheral 1 包 Peripheral - Central 1 包如果双方还有数据并且连接事件时间允许就可以继续交替发送Connection Event Central - Peripheral Data PDU 1 Peripheral - Central Data PDU 1 Central - Peripheral Data PDU 2 Peripheral - Central Data PDU 2 Central - Peripheral Data PDU 3 Peripheral - Central Data PDU 3 ...也就是说一个连接事件不是只能传一包而是可以在这个连接事件时间窗口内连续传多包。Tip 11MD 位可以表示“我后面还有数据”Link Layer Data PDU 中有一个字段叫MD More Data可以简单理解为MD 1我这边后面还有数据 MD 0我这边暂时没有更多数据如果一方设置 MD1说明它还有更多数据希望继续发送。对端收到后通常会继续在当前连接事件中给它机会交换数据。不过 MD 位不是唯一决定因素。最终当前连接事件能不能继续发还要受到这些因素影响连接事件剩余时间 PHY 速率 Data PDU 长度 双方控制器能力 控制器调度策略 是否还有其他连接/扫描/广播任务所以 MD1 可以理解成“我想继续发”但不是“我一定能无限发”。Tip 12Connection Interval 不等于一个连接事件的持续时间很多人容易把 Connection Interval 理解成“一个连接事件持续多久”这是不准确的。Connection Interval 表示的是两个相邻 Connection Event 之间的时间间隔例如Connection Interval 30 ms意思是每隔 30 ms 左右发生一次连接事件但是每个连接事件内部到底持续多久不完全等于 30 ms。一个连接事件可能只持续几百微秒也可能持续几毫秒具体由控制器调度和连接事件长度等因素决定。可以这样理解Connection Interval多久来一次连接事件 Connection Event Length一次连接事件最多可以持续多久 每个事件可发送的包数取决于这个事件实际持续时间、PHY、PDU 长度和控制器调度所以不要用 Connection Interval 直接推导“每个连接事件能发几包”。Tip 13影响一个连接事件内可发送包数的因素一个连接事件内能发送多少包主要受以下因素影响。第一Connection Event Length。它可以理解为一个连接事件最多持续多长时间连接事件时间越长同一个连接事件中通常能发送的包越多。第二PHY 速率。不同 PHY 下同样大小的数据包占用的空口时间不同。LE 1M PHY普通速度 LE 2M PHY速度更快同样时间内可传更多数据 LE Coded PHY速度更慢同样时间内可传更少数据第三Data PDU 长度。每个 Link Layer Data PDU 越大单包占用空口时间越长。小包一个连接事件里可能塞更多包 大包一个连接事件里包数可能更少但单包有效数据更多第四控制器调度能力。即使规范允许一个连接事件中连续传多包具体芯片、手机、系统也可能因为调度策略限制只给当前连接很短的事件时间。尤其手机作为 Central 时系统可能还要同时处理Wi-Fi 经典蓝牙 其他 BLE 连接 BLE 扫描 BLE 广播 系统省电策略 App 前后台状态所以 App 层看到的 BLE 吞吐量往往不是由单个参数决定的而是多个因素共同决定的。Tip 14BLE 吞吐量可以先用这个模型理解BLE 的吞吐量可以先粗略用这个模型理解吞吐量 ≈ 每个连接事件可传数据量 / Connection Interval更展开一点吞吐量 ≈ 每个 Data PDU 的有效载荷 × 每个连接事件中的 PDU 数量 × 每秒连接事件数量所以影响吞吐量的核心因素包括Connection Interval Connection Event Length PHY Data Length Extension MTU ATT/L2CAP 分包 控制器调度 手机系统限制 Peripheral 处理能力这也是为什么 BLE 传输测试中经常会遇到这种现象同样是 Notify有的设备吞吐高有的设备吞吐低 同样是 Write Without Response有的手机快有的手机慢 同样的 MTU不同连接参数下速度差异很大 同样的模块不同手机测试结果也不同背后本质上都和连接时序、连接事件、底层调度有关。Tip 15Peripheral 不是不能发数据而是不能随便决定空口发送时间很多初学者容易误解Central 定义传输时序是不是 Peripheral 不能主动发数据不是。Peripheral 当然可以向 Central 发数据比如通过Notification Indication Read Response Write Response但是 Peripheral 发送这些数据也要发生在连接事件中并且要跟随 Central 定义的连接时序。也就是说Peripheral 可以有数据要发 但是它要等连接事件到来 通常要等 Central 先发包或打开这个连接事件 然后 Peripheral 才能在该连接事件内回应或发送数据所以更准确的理解是Peripheral 可以主动产生上行数据 但不能随意决定空口发送时刻例如一个传感器 Peripheral 采集到数据后可以准备好 Notification。但是这个 Notification 真正在空口发出去仍然要等到后续某个 Connection Event。Tip 16Standby State 是很多状态的入口和出口从规范图来看Standby State 在 Link Layer 状态机中非常重要。它可以理解为很多状态的基础状态。Standby - Advertising Standby - Scanning Standby - Initiating Standby - Synchronization Standby - Isochronous Broadcasting同时Standby State 也可以从任意其他状态进入。也就是说一个状态机想从 Advertising 切换到 Scanning通常不是直接切换而是类似Advertising - Standby - Scanning一个状态机想从 Scanning 切换到 Initiating也可以理解为Scanning - Standby - Initiating当然具体控制器内部如何实现可能会被协议栈封装但从规范状态机角度看Standby 是非常核心的中间状态。Tip 17不是所有设备都必须支持所有状态规范 1.1.2 中说Devices supporting only some Link Layer states or only one of the two roles within the Connection state are not required to support features that are only used by a state or mode that the device does not support.意思是如果设备只支持部分 Link Layer 状态或者只支持 Connection State 中两个角色之一 那么它不需要支持那些只被未支持状态或模式使用的功能。这可以解释很多实际开发中遇到的问题。比如某个 BLE 模块只设计为 Peripheral 设备那么它可能不支持主动扫描 主动发起连接 作为 Central 建立连接 Central 相关 HCI Command 某些扫描相关 HCI Command再比如某个控制器不支持 Extended Advertising那么它就不需要支持扩展广播相关能力。所以在判断一个 BLE 模块支持什么功能时不能只问它是不是 BLE 设备而要问得更具体它支持哪些 Link Layer 状态 它支持 Central 还是 Peripheral 它支持单角色还是多角色 它支持单连接还是多连接 它支持 Legacy Advertising 还是 Extended Advertising 它支持 Periodic Advertising 吗 它支持 Isochronous Broadcasting 吗Tip 18为什么有些 HCI Command 不支持这部分规范也说明了一个很实际的问题为什么有些 BLE 模块不支持某些 HCI Command原因可能不是厂商“没做好”而是它底层本来就不支持对应的 Link Layer 状态、角色或模式。例如如果设备不支持 Scanning State那么扫描相关 HCI Command 可能就不支持。如果设备不支持 Initiating State那么主动连接相关 HCI Command 可能就不支持。如果设备不支持 Central Role那么 Central 相关功能就不支持。如果设备不支持 Periodic Advertising那么周期广播同步相关命令就不支持。如果设备不支持 Isochronous Broadcasting那么 BLE Audio 广播等时相关能力就不支持。所以 HCI Command 的支持情况和 Link Layer 能力是强相关的。可以这样理解HCI Command 是 Host 控制 Controller 的命令入口 Link Layer 状态和角色决定了 Controller 底层能不能真正执行这些行为。三、结合 BLE Legacy 广播、扫描、连接来理解如果只看广播、扫描、连接流程可以先把状态机简化成下面几个状态Standby Advertising Scanning Initiating Connection1. 广播流程从设备配置广播参数、广播数据、扫描响应数据然后使能广播。对应状态可以理解为Standby - Advertising在 Advertising State 中设备会发送广播包ADV_IND ADV_DIRECT_IND ADV_NONCONN_IND ADV_SCAN_IND如果是可扫描广播Advertiser 可能响应 SCAN_REQScanner - AdvertiserSCAN_REQ Advertiser - ScannerSCAN_RSP如果是可连接广播Advertiser 可能接收 CONNECT_IND 并进入连接Initiator - AdvertiserCONNECT_IND AdvertiserAdvertising - Connection(Peripheral)2. 扫描流程主设备打开扫描后对应状态可以理解为Standby - ScanningScanner 会监听广播物理信道上的广播包。如果是主动扫描还可能发送 SCAN_REQScanner - AdvertiserSCAN_REQ Advertiser - ScannerSCAN_RSP然后 Controller 会把扫描到的结果通过 HCI Event 上报给 Host例如 Advertising Report。3. 发起连接流程主设备要连接某个广播设备时会进入 Initiating State。对应状态可以理解为Standby - InitiatingInitiator 会监听目标设备的可连接广播包然后发送连接请求。Legacy 连接中可以理解为Advertiser - InitiatorADV_IND Initiator - AdvertiserCONNECT_IND连接建立后InitiatorInitiating - Connection(Central) AdvertiserAdvertising - Connection(Peripheral)4. 连接后通信流程连接建立后双方进入 Connection State。但是角色不同主动连接的一方Central 被连接的一方Peripheral连接后的通信发生在 Connection Event 中。Connection Event 1 Central - Peripheral Peripheral - Central Connection Event 2 Central - Peripheral Peripheral - Central Connection Event 3 Central - Peripheral Peripheral - CentralCentral 定义连接事件的时序Peripheral 按照这个时序参与通信。四、几个容易混淆的问题总结1. Advertiser 是不是一定只能广播不能收包不是。Advertiser 在 Advertising State 中会发送广播包同时也可能监听和响应由广播包触发的响应。例如SCAN_REQ - SCAN_RSP CONNECT_IND - 进入连接2. Scanner 和 Initiator 是不是一回事不是。Scanner 的目标是发现设备。Initiator 的目标是发起连接。Scanning State扫描广播发现设备 Initiating State监听目标广播发送连接请求3. Advertiser 能不能发起连接对于单个 Link Layer 状态机来说Advertising State 不能直接进入 Initiating State。但是同一个物理设备如果支持多个状态机可以一个状态机广播另一个状态机发起连接。所以严谨表达是Advertiser 当前这条广播流程中不是连接发起者 但是同一个设备可以在另一个状态机中作为 initiator 主动发起连接。4. Central / Peripheral 是不是固定设备身份不是。Central / Peripheral 是连接角色不是设备永久身份。同一个设备可以在一条连接中是 Central在另一条连接中是 Peripheral前提是底层控制器支持多状态机、多角色、多连接。5. Central 定义时序是不是 Peripheral 不能主动发数据不是。Peripheral 可以通过 Notification、Indication、Read Response、Write Response 等方式向 Central 发送数据。但是 Peripheral 的空口发送时刻要跟随 Central 定义的连接事件节奏。简单说Peripheral 可以有数据要发 但要等连接事件到来 在连接事件中与 Central 交换数据。6. 一个连接事件是不是只能发一包不是。一个连接事件中可以交替发送多个 Link Layer Data PDU。例如Central - Peripheral Peripheral - Central Central - Peripheral Peripheral - Central ...具体能发几包取决于连接事件长度 PHY Data PDU 长度 MD 位 控制器调度 双方是否还有数据7. Connection Interval 是不是等于连接事件持续时间不是。Connection Interval 表示两个连接事件之间的间隔。Connection Event Length 才更接近“一次连接事件可以持续多久”。Connection Interval多久来一次 Connection Event Length一次可以持续多久 每个连接事件可发包数一次持续时间内能塞下多少 PDU五、最终总结这部分规范虽然看起来只是 Link Layer 状态机的总览但它其实是理解 BLE 广播、扫描、连接、角色、吞吐量的基础。可以总结为BLE Link Layer 可以用状态机描述。 常见状态包括 Standby、Advertising、Scanning、Initiating、Connection。 单个 Link Layer 状态机一次只能处于一个状态。 Advertising State 主要用于发送广播包并可能响应 SCAN_REQ 或 CONNECT_IND。 Scanning State 用于监听广播包目标是发现设备。 Initiating State 用于监听指定设备的广播包并发起连接。 从 Initiating State 进入 Connection State 的一方是 Central。 从 Advertising State 进入 Connection State 的一方是 Peripheral。 Central 在连接中定义传输时序Peripheral 按照 Central 定义的连接事件节奏通信。 一个 Connection Event 中可以发送多个 Link Layer Data PDU不是固定只能发一包。 同一个物理设备如果支持多个 Link Layer 状态机可以同时承担多个状态或多个角色。 不是所有 BLE 设备都必须支持所有状态、所有角色、所有 HCI Command。如果用一句话来概括BLE 广播、扫描、发起连接、连接通信本质上都是 Link Layer 状态机在不同状态之间切换后的表现。理解了这张状态机图再去看 BLE Legacy 广播、扫描、连接请求、Connection Event、Central / Peripheral就会清晰很多。