【消息序列】详解(4):同步连接(SCO/eSCO)的建立与断开流程

目录

一、概述

1.1. 蓝牙同步逻辑连接基础

1.2. SCO 与 eSCO 逻辑传输方式

1.3. ACL 连接的前置重要性

二、同步连接建立

2.1. 同步连接请求

2.1.1. Step 1a:Central requests a synchronous connection with a device

2.1.2. Step 1b: Peripheral requests a synchronous connection with a device

2.1.3. Step 1c: Central requests a SCO connection with a device

2.1.4. Step 1d:Host device requests a SCO connection with a device

2.2. eSCO连接重新协商

2.2.1. Step 2a:Central renegotiates eSCO connection 

2.2.2. Step 2b:Peripheral renegotiates eSCO connection

2.3. 同步连接断开

2.3.1. Step 3a:eSCO disconnection

2.3.2. Step 3b:SCO disconnection

三、使用增强型同步命令建立同步连接

3.1. eSCO/SCO连接建立

3.1.1. Step 1a: 中心设备请求与外围设备建立eSCO连接

3.1.2. 步骤 1b:外围设备请求eSCO连接

3.1.3. 步骤 1c:中央设备请求SCO连接

3.1.4. 步骤 1d:外围设备请求SCO连接

3.2. 重新协商eSCO连接

3.2.1. 步骤 2a:中央设备重新协商eSCO连接

3.2.2. 步骤 2b:外围设备重新协商eSCO连接

四、总结


在蓝牙通信的链路管理体系中,HCI(Host Controller Interface,主机控制器接口)扮演着极为关键的角色,它是主机(Host)与蓝牙控制器进行交互的桥梁。而其中的 HCI_Setup_Synchronous_Connection 命令有着特定且重要的功能。当主机执行这一命令时,它具备了向已有的链路(link)中添加一个同步逻辑通道(synchronous logical channel)的能力。

一、概述

1.1. 蓝牙同步逻辑连接基础

在蓝牙技术的通信体系里,同步逻辑连接起着关键作用,尤其是针对那些对实时性要求颇高的应用场景,例如语音通话、实时监测数据传输等。为了达成这样的同步逻辑连接,主机(Host)拥有专门的指令工具,即 HCI_Setup_Synchronous_Connection 命令。这一命令的核心功能在于,它能够让主机在已经存在的链路基础之上,额外添加一个同步逻辑通道。形象地说,就好比在已有的交通网络中开辟出一条专门用于特定车辆(同步数据)按时、有序通行的专属车道,以此来保障同步数据可以按照固定的节奏、稳定地在蓝牙设备之间进行传输。

1.2. SCO 与 eSCO 逻辑传输方式

  • SCO 连接特性及应用场景:SCO(Synchronous Connection Oriented)连接作为一种较为原始但实用的面向连接的同步数据传输方式,有着鲜明的特点。它最大的优势在于能够提供低延迟的通信通道,意味着数据在传输过程中几乎可以实时地从发送端抵达接收端,不会出现明显的滞后情况。正是基于这一特性,SCO 连接在语音通信这类对实时性要求极高的应用场景中表现出色。比如我们日常使用的蓝牙耳机与手机之间进行语音通话时,通过 SCO 连接,说话人的声音能够迅速且流畅地传输到接听者的耳机中,让双方可以顺畅交流,不会因为数据传输延迟而出现对话卡顿等影响体验的情况。

  • eSCO 连接特性及优势:eSCO(Enhanced Synchronous Connection Oriented)连接则是在 SCO 连接基础上进行了功能强化。它不仅继承了 SCO 连接面向连接、支持同步数据传输以及具备一定实时性的特点,还额外增加了错误检测和恢复机制。在实际的数据传输过程中,由于外界干扰(如周围其他无线信号干扰、电磁环境波动等)或者设备自身偶尔出现的小故障等原因,数据可能会出现错误或者丢失的情况。而 eSCO 连接的错误检测机制就像是一个敏锐的 “监察员”,能够及时发现这些问题,并且借助恢复机制进行纠正,例如通过重传出错的数据分组等方式,确保数据传输的完整性和准确性,从而极大地提高了数据传输的可靠性和稳定性。这使得它在诸如高品质音频传输、对数据准确性要求苛刻的实时传感器数据反馈等场景中更具优势,即使在相对复杂、容易出现干扰的环境下,也能保障数据稳定且高质量地传输。

1.3. ACL 连接的前置重要性

值得着重强调的是,在着手创建同步连接之前,ACL(Asynchronous Connection-Less)连接的建立是必不可少的前置步骤。ACL 连接就像是蓝牙设备之间构建起的一条基础 “主干道”,负责承载各种一般性的数据传输任务,比如设备之间的配置信息交互、简单状态报告传递等。这条 “主干道” 的存在为后续更具针对性、对实时性要求更高的同步连接(如同分支道路)的建立奠定了基础。只有当 ACL 连接成功搭建起来,主机才有条件使用 HCI_Setup_Synchronous_Connection 命令去进一步请求建立同步连接,以此确保整个蓝牙通信链路从基础的、一般性的数据传输链路逐步拓展到能够满足特定实时性需求的同步连接链路,实现通信链路在不同层次和类型上的有序且合理构建,就如同城市交通网络先规划好主干道,再依据需求逐步拓展出各种功能各异的分支道路一样,保障整个交通体系(通信链路)的顺畅运行。

通过准确运用 HCI_Setup_Synchronous_Connection 命令,并依据实际应用场景的需求,谨慎选择合适的 SCO 或 eSCO 逻辑传输方式,蓝牙设备之间能够成功建立起稳定、可靠的同步连接,进而有效满足诸如语音通话、实时音频播放、传感器实时数据反馈等各种对实时性要求较高的应用场景,为用户提供高质量的蓝牙通信体验,推动蓝牙技术在众多领域的广泛应用。

二、同步连接建立

在蓝牙通信中,同步连接的建立与断开是一个复杂但有序的过程。首先,我们来看同步连接的建立步骤。

2.1. 同步连接请求

2.1.1. Step 1a:Central requests a synchronous connection with a device

中央设备(Central)主动向一个设备请求建立同步连接(HCI_Setup_Synchronous_Connection命令)。通常涉及发送一个包含连接参数的请求命令,并等待对方的响应。

整个流程起始于 Host A决定向 Device B 发起建立同步连接的请求。这表明中心设备期望与目标设备之间搭建起一个能满足实时性数据传输要求的链路,以便后续进行有序且按固定时间间隔的数据交互活动,符合相关应用场景对同步性的需求。 

  • 中心设备发起eSCO连接请求
    • 中心设备(Host A)的蓝牙协议栈首先通过发送HCI_Create_Connection命令来尝试与外围设备(Host B)建立ACL(异步无连接)连接。这是建立eSCO连接的前提。
    • ACL连接建立后,中心设备会发送一个HCI_Add_Sco_Connection命令。会指定eSCO连接的类型(如EV3、EV4或EV5)和其他参数。
  • HCI命令状态反馈:中心设备(Host A)会收到一个HCI_Command_Status事件,指示其发出的HCI命令是否已被成功接收和处理。
  • LMP eSCO链路请求:在ACL连接上,中心设备的链路管理器(LM­A)会发送一个LMP_eSCO_LINK_REQ消息给外围设备的链路管理器(LM­B),请求建立eSCO链路。这个消息包含了eSCO连接的参数,如最大传输速率、数据包大小和重传策略等。
  • 外围设备接受或拒绝eSCO连接请求
    • 外围设备(Host B)的链路管理器(LM­B)会接收到LMP_eSCO_LINK_REQ消息,并根据其策略决定是否接受该请求。
    • 如果外围设备接受请求,它会发送一个LMP_ACCEPTED_EXT消息给中心设备,表明它同意建立eSCO链路,并可能包含协商后的eSCO参数。
    • 如果外围设备拒绝请求,它会发送一个拒绝消息。
  • eSCO连接建立完成:一旦eSCO链路成功建立,中心设备和外围设备都会收到相应的HCI事件来通知它们。对于中心设备(Host A),它可能会收到一个类似于HCI_Synchronous_Connection_Complete(但指定为eSCO连接)的事件。对于外围设备(Host B),它也可能收到一个类似的事件或通过其他内部机制来更新其连接状态。
  • 连接状态更新:最后,中心设备和外围设备的蓝牙堆栈都会更新其内部状态,以反映新的eSCO连接。

请注意,上述流程是基于蓝牙规范的一般描述,并可能因具体的蓝牙版本、设备和蓝牙协议栈实现而有所不同。因此,在实际应用中,需要参考具体的蓝牙协议栈文档和设备规范来了解如何正确建立eSCO连接。

2.1.2. Step 1b: Peripheral requests a synchronous connection with a device

在某些情况下,外围设备(Peripheral)也可能主动请求与中央设备建立同步连接。这同样需要发送请求命令,并等待中央设备的响应。

注意:虽然Step 1a和Step 1b描述了中央和外围设备分别发起同步连接请求的情况,但在实际通信中,通常只有一方会发起请求,另一方则作为响应方。

2.1.3. Step 1c: Central requests a SCO connection with a device

中心设备再次发起与一个设备的 SCO连接请求,SCO 连接常用于对实时性要求极高、且传输的数据具有连续性和周期性特点的场景。

整个流程起始于 Host A决定向 Device B 发起建立同步连接的请求,并且明确是要建立 SCO 连接类型,这意味着后续建立好的连接将用于按固定时间间隔、有序地传输数据,以保障实时性的数据交互需求。

  • HCI_Setup_Synchronous_Connection (HV1|HV2|HV3|EV3|EV4|EV5)(主机控制器接口设置同步连接命令):Host A 通过 HCI发送 HCI_Setup_Synchronous_Connection 命令,并携带了 (HV1|HV2|HV3|EV3|EV4|EV5) 这些参数。HCI_Setup_Synchronous_Connection 命令本身是用于启动同步连接设置流程的关键指令,而括号里的参数有着特定含义。HV1、HV2、HV3 通常是指不同的语音编码格式选项(Higher Voice,用于 SCO 连接下语音数据的编码,不同编码格式在音质、数据传输速率等方面各有特点),表明在请求建立连接时,Host A 就考虑到了后续语音数据传输可能采用的编码方式,提前进行了相关设定;EV3、EV4、EV5 可能代表着其他与同步连接相关的扩展参数(比如可能涉及链路配置、传输时隙等方面的设置),它们共同构成了此次 SCO 连接请求的详细配置信息,就好像向系统提交了一份详细的连接建立 “计划书”,明确了连接的各项预期设置,以便后续能按照这些要求来构建合适的 SCO 连接。
  • HCI_Command_Status(主机控制器接口命令状态反馈):在 Host A 发出 HCI_Setup_Synchronous_Connection 命令后,系统会返回 HCI_Command_Status 信息给 Host A。这一反馈相当于一个回执,告知 Host A 其发出的用于设置同步连接的命令已被系统成功接收,并且正在按照既定的流程和规则进行后续处理。通过这个回执,Host A 能够确认自己的请求进入了正常的处理流程,确保整个连接请求过程可以有条不紊地继续推进,避免因命令未被正确处理而出现流程中断或混乱的情况。
  • LMP_SCO_LINK_REQ(链路管理协议 SCO 链路请求):接着,在链路层面会依据链路管理协议发送 LMP_SCO_LINK_REQ 消息。这个消息承载着从 Host A 所在链路一侧向目标的 Device B 所在链路那一侧传达要建立 SCO 链路的具体请求内容,它标志着在链路底层正式启动了对建立 SCO 连接的实际请求操作,类似于在双方之间传递了一份具体的 “连接意向书”,表明了 Host A 希望与 Device B 建立 SCO 链路的明确意愿,推动了连接建立流程在链路层面的进展。
  • HCI_Connection_Request (SCO)(主机控制器接口 SCO 连接请求):随后,Device B向Host A通过 HCI 发送 HCI_Connection_Request (SCO) 消息,建立 SCO 连接的请求意图。
  • HCI_Accept_Connection_Request(主机控制器接口接受连接请求):当 Device B 接收到来自 Host A 的连接请求后,如果经过自身的相关判断和处理,确认可以接受这一连接请求,就会通过 HCI 回复 HCI_Accept_Connection_Request 消息,表示同意与 Host A 建立连接。这是双方在主机层面达成的关于建立连接的初步共识,为后续链路层面的进一步确认和连接的最终建立奠定了基础。
  • HCI_Command_Status(主机控制器接口命令状态反馈):同样,在 Device B 发出 HCI_Accept_Connection_Request 消息后,BTC会返回 HCI_Command_Status 信息给 Device B,告知它所发出的接受请求的命令已被系统正确接收并在按流程处理,确保整个交互过程的连贯性和准确性,使双方都能明确各自操作的执行情况。
  • LMP_ACCEPTED(链路管理协议接受请求):当 Host A 所在链路一侧接收到 Device B 回复的接受连接请求相关消息后,经过链路层面的确认,如果一切无误,链路层面就会达成最终的接受状态,回复 LMP_ACCEPTED 消息。这意味着双方在链路层面正式达成一致,同意建立 SCO 连接,为后续真正建立起可用的同步连接奠定了基础,就如同双方在链路这条 “信息通道” 上签订了一份建立连接的正式协议。

  • Synchronous connection started(同步连接已启动):在双方通过链路管理协议达成一致,即收到 LMP_ACCEPTED 消息后,实际的 SCO 同步连接就会正式启动。这意味着双方设备之间已经成功搭建起了一条可以按照固定时间间隔、有序地传输数据的链路通道,后续便可以依据相应的规则和配置开始进行实时数据传输了,比如开始进行语音通话或者其他需要 SCO 连接支持的实时数据交互活动。

  • HCI_Synchronous_Connection_Complete (SCO)(主机控制器接口同步连接完成通知)

    • 最后,系统会分别向 Host A 和 Device B 发送 HCI_Synchronous_Connection_Complete (SCO) 消息,告知两端的设备,SCO 连接的建立操作已经全部完成,整个连接已经处于可用状态。这个通知就像是告诉双方 “你们之间的连接已经成功建立好了,可以开始使用了”,让双方设备明确知晓此次连接建立流程顺利结束,后续可以放心地利用该连接进行相应的数据传输和应用操作。
  • HCI_Connection_Complete(主机控制器接口连接完成通知):最后,设备的蓝牙堆栈会更新内部状态,以反映新的SCO连接。

2.1.4. Step 1dHost device requests a SCO connection with a device

从机设备(Host device)发起与一个设备的 SCO 连接请求。

  • Initial Request by Legacy Host B(传统 Host B 的初始请求)

    • HCI_Add_SCO_Connection:整个流程起始于 Host B 想要与 Device A 建立 SCO 连接,于是它通过HCI向蓝牙系统发送 HCI_Add_SCO_Connection 命令。这相当于 Host B 在整个蓝牙通信的 “管理体系” 里填写了一张申请表,表明自己期望新增一个 SCO 连接的诉求,希望系统能够按照相应规则启动后续建立连接的流程。这个命令是后续一系列交互动作的开端,明确了连接的类型(SCO)以及大致的建立方向(指向 Central Device A)。
    • HCI_Command_Status:在 Host B 发出 HCI_Add_SCO_Connection 之后,系统会返回 HCI_Command_Status 信息给 Host B。这就好比系统给 Host B 的一个回执,告诉它 “你的申请已收到,我们正在按流程处理”。这个反馈信息对于 Host B 来说很关键,它能据此确认自己的请求已经被系统正确识别并且开始进入相应的处理环节,保障整个连接请求流程可以有条不紊地往下推进,避免出现因请求未被受理而导致的流程停滞情况。 
  • Link-Level Request Propagation(链路层面请求传递)
    • LMP_SCO_LINK_REQ:紧接着,在链路层面依据链路管理协议(LMP),会从 Host B 所在链路一侧向Device A 所在链路那一侧发送 LMP_SCO_LINK_REQ 消息。这个消息的作用是在链路底层将建立 SCO 链路的请求正式传达给目标设备,它像是在两个设备之间搭建起了一座信息的 “桥梁”,让 Central Device A 知晓 Host B 希望在链路层面与其建立 SCO 连接,开启了链路两端关于建立连接的实际沟通流程,是链路建立协商的重要一步。
  • HCI_Connection_Request (SCO):HCI_Connection_Request命令用于请求建立ACL连接,而不是SCO连接。SCO连接通常是通过在已存在的ACL连接上添加SCO连接来建立的,这通常是通过HCI_Add_SCO_Connection命令完成的(如前所述)。
  • HCI_Accept_Synchronous_Connection_Request (HV1 | HV2 | HV3):当Device A 接收到来自 Host B 的连接请求后,会进行相应的判断和处理。如果确定可以接受这个同步连接请求,它就会通过 HCI 回复 HCI_Accept_Synchronous_Connection_Request (HV1 | HV2 | HV3) 消息。这里的 HV1、HV2、HV3 代表着不同的语音编码格式选项,在 SCO 连接常用于语音传输场景下,这意味着 Device A 在同意建立连接的同时,向 Host B 表明了自己支持的语音编码方式,为后续双方按照匹配的编码格式进行高质量的语音数据传输奠定基础,双方就此在连接建立的关键细节上达成了初步的一致意见。
  • Confirmation and Acceptance at Link Level(链路层面的确认与接受)

    • LMP_SCO_LINK_REQ(再次发送):Device A 这边会再次通过链路管理协议发送 LMP_SCO_LINK_REQ 消息。这一次的发送主要是为了在链路层面进一步巩固和确认建立 SCO 连接的请求,让链路两端都再次明确要建立这一连接的意向,强化双方在链路层面对于建立连接这件事的共识,避免可能出现的误解或者因链路状态变化等原因导致连接建立失败的问题,确保链路层面对连接建立的一致性和稳定性。
    • LMP_ACCEPTED:当 Host B 所在链路一侧接收到 Device A 再次发来的 LMP_SCO_LINK_REQ 消息后,如果经过检查确认无误,就会回复 LMP_ACCEPTED 消息,表示接受来自 Central Device A 的链路请求。至此,双方在链路层面正式达成一致,同意建立 SCO 连接,这就如同双方在链路这条 “信息通道” 上签订了一份建立连接的正式协议,为后续真正构建起可用的同步连接提供了坚实的链路层面的保障。
  • Initiation of Synchronous Connection(同步连接的启动):在双方通过链路管理协议达成一致,也就是收到 LMP_ACCEPTED 消息后,实际的 SCO 同步连接就会正式启动。此时,就好比在 Host B 和 Central Device A 之间成功打通了一条专门用于按照固定时间间隔、有序且实时地传输数据的 “高速公路”,后续它们便可以依据预先设定好的规则和配置,开始进行诸如语音通话之类的实时数据传输活动了,标志着连接已经从协商阶段进入到实际可用的阶段。

  • Completion Notifications(完成通知)

    • HCI_Synchronous_Connection_Complete:最后,Device A 向Host A发送 HCI_Synchronous_Connection_Complete 消息,告知SCO 连接的建立操作已经全部完成,整个连接已经处于稳定可用的状态了。这个通知就像是给双方发送了一封 “竣工通知书”,让它们明确知晓此次连接建立的任务圆满结束,双方可以放心地利用该连接开展后续的各种数据传输和应用相关的操作了。
    • HCI_Connection_Complete:同时,Device B 向Host B发送还会发送 HCI_Connection_Complete 消息,再次从主机控制的角度强调连接已经成功建立完成,进一步确保两端设备都能准确无误地知晓连接的最终状态,为它们后续基于该连接进行各种活动提供了清晰、可靠的状态依据,保障整个蓝牙通信在建立好 SCO 连接后能够顺畅、稳定地运行。

通过这样一系列严谨且有序的步骤以及对应的信令交互过程,完整地展现了在蓝牙通信中,一个仅支持 SCO 连接的设备(这里的 Legacy Host B)向中心设备(Central Device A)请求建立同步连接并最终成功建立的全过程,这对于深入理解蓝牙链路层面的连接建立机制以及各设备间的交互协作有着极为重要的意义。 

2.2. eSCO连接重新协商

在蓝牙通信的复杂链路环境中,eSCO连接可能需要随着设备使用过程中诸多因素的变化而进行重新协商。重新协商的目的是通过调整连接相关参数来优化连接性能,保障数据传输的质量和效率。

2.2.1. Step 2a:Central renegotiates eSCO connection 

在实际的蓝牙通信使用过程中,由于环境变化(如无线信号干扰增强)、设备状态改变(比如设备电量波动影响传输功率)等诸多因素,已建立的 eSCO 连接可能无法再满足当前的通信质量需求。中心设备可能会对 eSCO连接进行重新协商。

  • 同步连接存在:在此步骤之前,Host A(中心设备)和Host B(外围设备)之间已经存在一个eSCO连接。这个连接具有特定的错误率(EV3),eSCO传输间隔(TeSCO设置为6个时隙),和eSCO数据包大小(WeSCO设置为4个时隙)。这些参数定义了eSCO连接的性能和特性。
  • Host A改变同步连接:由于某种原因(如改善音质、降低延迟或适应网络条件的变化),Host A决定重新协商与Host B之间的eSCO连接参数。为此,Host A通过HCI发送一个HCI_Setup_Synchronous_Connection命令。然而,需要注意的是,虽然命令名称包含“Setup”,但在这里它实际上被用于重新协商或修改现有的eSCO连接参数,而不是建立一个新的连接。此外,命令中可能包含了新的eSCO连接参数。
  • HCI命令状态:在发送HCI_Setup_Synchronous_Connection命令后,Host A会收到一个HCI_Command_Status事件。这个事件是一个简单的确认,表明BTC层已经接收到了设置(或重新协商)同步连接的命令。
  • LMP eSCO链路请求:随后,蓝牙链路管理器协议(LMP)层会处理这个设置(或重新协商)命令,并向Host B发送一个或多个LMP_eSCO_LINK_REQ请求。这些请求中包含了Host A希望重新协商的eSCO连接参数。
  • LMP接受扩展响应:Host B在接收到LMP_eSCO_LINK_REQ请求后,会评估请求中的参数,并决定是否接受这些参数。如果接受,Host B会回复一个LMP_ACCEPTED_EXT响应。这个响应表明Host B同意按照请求中的参数重新建立eSCO连接。
  • 同步连接改变:在Host B发送LMP_ACCEPTED_EXT响应后,eSCO连接开始按照新的参数重新建立。意味着同步连接的状态已经改变,新的eSCO连接参数现在生效。
  • HCI同步连接改变:最后,Host A和Host B都会收到一个HCI_Synchronous_Connection_Changed事件。这个事件是HCI层的一个通知,表明eSCO连接已经按照新的参数重新建立,并且相关的连接状态已经更新。

整个过程允许中心设备(Host A)与外围设备(Host B)之间动态地重新协商eSCO连接参数,以适应不断变化的需求和网络条件。这种重新协商机制是蓝牙技术灵活性和适应性的一个重要体现。在实际应用中,重新协商eSCO连接参数可能需要考虑多种因素,如音质要求、延迟敏感性、可用带宽和电池寿命等。

2.2.2. Step 2b:Peripheral renegotiates eSCO connection

同样地,外围设备也可能主动重新协商eSCO连接。这与中心设备的操作目的类似,都是为了优化连接性能,只不过发起者是外围设备。

  • 同步连接存在:在此步骤之前,Host A和Host B之间已经存在一个eSCO连接,该连接具有特定的错误率(EV3),eSCO传输间隔(TeSCO),和eSCO数据包大小(WeSCO)。这些参数定义了eSCO连接的性能和特性。
  • Host B改变同步连接:由于某种原因(如改善音质、降低延迟或适应网络条件的变化),Host B决定重新协商与Host A之间的eSCO连接参数。为此,Host B通过HCI发送一个HCI_Setup_Synchronous_Connection命令。这个命令包含了新的eSCO连接参数,如EV3(错误率)和可能的重传参数(Retransmission_effort,这里设置为0x00可能表示默认的重传策略)。
  • HCI命令状态:在发送HCI_Setup_Synchronous_Connection命令后,Host B会收到一个HCI_Command_Status事件。这个事件是一个简单的确认,表明BTC层已经接收到了设置同步连接的命令。
  • LMP eSCO链路请求:随后,蓝牙链路管理器协议(LMP)层会处理这个设置命令,并向Host A发送一个LMP_eSCO_LINK_REQ请求。这个请求包含了Host B希望重新协商的eSCO连接参数。
  • LMP接受扩展响应:Host A在接收到LMP_eSCO_LINK_REQ请求后,会评估请求中的参数,并决定是否接受这些参数。如果接受,Host A会回复一个LMP_ACCEPTED_EXT响应。这个响应表明Host A同意按照请求中的参数重新建立eSCO连接。
  • 同步连接改变:在Host A发送LMP_ACCEPTED_EXT响应后,eSCO连接开始按照新的参数重新建立。这意味着同步连接的状态已经改变,新的eSCO连接参数现在生效。
  • HCI同步连接改变:最后,Host A和Host B都会收到一个HCI_Synchronous_Connection_Changed事件。这个事件是HCI层的一个通知,表明eSCO连接已经按照新的参数重新建立,并且相关的连接状态已经更新。

整个过程允许外围设备(Host B)与中心设备(Host A)之间动态地重新协商eSCO连接参数,以适应不断变化的需求和网络条件。这种重新协商机制是蓝牙技术灵活性和适应性的一个重要体现。 

2.3. 同步连接断开

2.3.1. Step 3a:eSCO disconnection

当不再需要eSCO连接时或者出现了某些异常情况使得连接无法继续维持的时候,中央设备或外围设备可以发起eSCO连接的断开请求。通常涉及发送一个断开命令(HCI_Disconnect),并等待对方的确认。

  • Host A请求eSCO断开:当Host A决定断开与Device B之间的eSCO连接时,它会通过HCI发送一个HCI_Disconnect命令。这个命令包含了要断开的eSCO连接的标识符或相关参数,以指示蓝牙控制器开始断开指定的eSCO连接。
  • HCI命令状态:在发送HCI_Disconnect命令后,Host A会立即收到一个HCI_Command_Status事件。这个事件是一个简单的确认,表明BTC层已经接收到了断开连接的命令,但并不意味着eSCO连接已经实际断开。
  • LMP移除eSCO链路请求:随后,蓝牙链路管理器协议(LMP)层会处理这个断开请求,并向对端设备(Device B)发送一个LMP_REMOVE_eSCO_LINK_REQ请求。这个请求包含了足够的信息,以便对端设备能够识别并移除相应的eSCO链路。
  • LMP接受扩展响应:Device B在接收到LMP_REMOVE_eSCO_LINK_REQ请求后,如果同意断开连接,会回复一个LMP_ACCEPTED_EXT响应。与普通的LMP_ACCEPTED响应相比,LMP_ACCEPTED_EXT可能包含额外的信息,以支持eSCO连接的特殊特性或参数。
  • 同步连接退出:在Device B发送LMP_ACCEPTED_EXT响应后,eSCO连接开始实际断开过程。此时,同步连接状态退出,即eSCO链路被成功移除。这意味着Host A和Device B之间的eSCO连接不再存在。
  • HCI断开完成:最后,Host A和Device B都会收到一个HCI_Disconnection_Complete事件。这个事件是HCI层的一个通知,表明eSCO连接已经完全断开,相关的资源已经被释放。对于Host A来说,这是断开eSCO连接过程的最终确认。

整个过程确保了eSCO连接在蓝牙设备之间能够安全、有序地断开,避免了可能的连接冲突或资源占用问题。

2.3.2. Step 3b:SCO disconnection

在eSCO连接断开后,如果SCO连接仍然存在(在某些情况下,eSCO连接可能是在SCO连接的基础上建立的),则还需要单独断开SCO连接。SCO 连接断开与 eSCO 连接断开类似,也是在相应的通信任务完成或者出现异常情况后进行的操作。

  • Host A请求SCO断开:Host A通过发送一个HCI_Disconnect命令来请求断开与Device B之间的SCO连接。
  • HCI命令状态:在发送HCI_Disconnect命令后,Host A会收到一个HCI_Command_Status事件,该事件用于确认命令是否已被蓝牙控制器接收。这只是一个确认接收的命令状态,并不表示SCO连接已经成功断开。
  • LMP移除SCO链路请求:蓝牙链路管理器协议(LMP)随后会发送一个LMP_REMOVE_SCO_LINK_REQ请求给对端设备(Device B),以请求移除现有的SCO链路。这一步是在底层链路管理层面进行的,用于实际执行断开SCO连接的操作。
  • LMP接受:Device B在接收到LMP_REMOVE_SCO_LINK_REQ请求后,如果同意断开连接,会回复一个LMP_ACCEPTED响应。这表示Device B已经接受了断开SCO连接的请求。
  • 同步连接退出:在收到LMP_ACCEPTED响应后,SCO连接开始实际断开过程,同步连接状态退出,即SCO链路被成功移除。
  • HCI断开完成:最后,Host A会收到一个HCI_Disconnection_Complete事件,表明SCO连接已经完全断开。同时,Device B也会收到一个相应的HCI_Disconnection_Complete事件,确认连接已经断开。

这个过程确保了在蓝牙设备之间安全、有序地断开SCO连接,避免可能的连接冲突或资源占用问题。

三、使用增强型同步命令建立同步连接

在蓝牙通信链路构建过程中,HCI_Enhanced_Setup_Synchronous_Connection 命令扮演着重要角色。主机利用这一命令,可以有效地向链路中添加一个同步逻辑通道,这是构建同步逻辑链路的关键起始步骤。通过添加这个同步逻辑通道,为后续同步数据能够按照特定的规则、有序地在蓝牙设备之间传输创造了基础条件,就如同搭建起了一座桥梁的主体框架,后续只需进一步完善细节(选择合适的逻辑传输方式等),就能让这座 “桥梁”(同步逻辑链路)承载数据顺利通行。

3.1. eSCO/SCO连接建立

在尝试建立同步连接之前,中央设备和外围设备之间必须已经建立了ACL连接。

3.1.1. Step 1a: 中心设备请求与外围设备建立eSCO连接

在蓝牙网络架构中,中心设备通常处于核心协调的地位,它与多个外围设备进行交互通信。

  • Host A 发送请求:Host A(作为中央设备)通过HCI发送一个HCI_Enhanced_Setup_Synchronous_Connection命令给其蓝牙控制器,以请求与Device B(由Host B托管)建立同步连接。此命令可能包含多个参数,如连接类型(EV3、EV4、EV5等,这些代表不同的蓝牙核心规范版本和特性集)、数据包大小、重传参数等。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该命令。
  • LMP eSCO 链路请求:如果命令成功接收,蓝牙控制器会通过链路层协议(LMP)发送一个LMP_eSCO_LINK_REQ消息给Device B的蓝牙控制器,以请求建立eSCO链路。
  • Device B 响应:Device B的蓝牙控制器接收到LMP_eSCO_LINK_REQ后,会通过Device B的链路管理器(LM-B)发送一个HCI_Connection_Request(eSCO)给其Host,以确认接受同步连接请求。如果经过自身的相关判断和处理,确认可以接受这一同步连接请求,就会通过 HCI 回复 HCI_Accept_Synchronous_Connection_Request (EV3|EV4|EV5|2EV3|2EV5|3EV3|3EV5) 消息,并且回复中同样携带了 (EV3|EV4|EV5|2EV3|2EV5|3EV3|3EV5) 参数。这意味着 Device B 在同意建立连接的同时,也认可了 Host A 提出的关于连接的那些特定设置要求,双方在连接建立的关键细节(也就是由 EV3、EV4、EV5、2EV3、2EV5、3EV3、3EV5 所代表的相关参数方面)达成了初步的一致意见,为后续链路层面的进一步确认和连接的最终建立奠定了良好的基础,就好像双方在连接的具体技术规格上达成了初步共识,接下来可以继续推进在链路层面的具体协商与确认工作。
  • 命令状态反馈:同样,在 Device B 发出 HCI_Accept_Synchronous_Connection_Request 消息后,Device B会返回 HCI_Command_Status 信息给 HostB,告知它所发出的接受请求的命令已被系统正确接收并在按流程处理,确保整个交互过程的连贯性和准确性,使双方都能明确各自操作的执行情况。
  • LMP_eSCO_LINK_REQ(链路管理协议 eSCO 链路请求,再次发送):然后,Device B 这边会再次通过链路管理协议发送 LMP_eSCO_LINK_REQ 消息,强化链路层面的沟通效果,保障连接建立流程能顺利进行下去。
  • 同步连接建立:一旦双方蓝牙控制器都确认了连接请求,它们将开始建立eSCO链路。完成后,Host A和Host B的蓝牙控制器都会发送一个HCI_Synchronous_Connection_Complete事件,以通知各自的主机同步连接已成功建立。

3.1.2. 步骤 1b:外围设备请求eSCO连接

同样,外围设备也可以向中央设备发起建立同步连接的请求。

  • Host B 发送请求:Host B(作为外围设备)通过HCI发送一个HCI_Enhanced_Setup_Synchronous_Connection命令给其蓝牙控制器,以请求与Device A(由Host A托管)建立同步连接。与中央设备发起连接时类似,此命令也可能包含多个参数,如连接类型(EV3、EV4、EV5等)、数据包大小、重传参数等。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该命令。
  • LMP eSCO 链路请求:如果命令成功接收,蓝牙控制器会通过链路层协议(LMP)发送一个LMP_eSCO_LINK_REQ消息给Device A的蓝牙控制器,以请求建立eSCO链路。
  • Device A 响应:Device A的蓝牙控制器接收到LMP_eSCO_LINK_REQ后,给Host A上报HCI_Connection_Request (eSCO)事件,经过自身的相关判断和处理,确认可以接受这一同步连接请求,就会通过 HCI 回复 HCI_Enhanced_Accept_Synchronous_Connection_Request (EV3|EV4|EV5|2EV3|2EV5|3EV3|3EV5) 消息给其蓝牙控制器,以确认接受同步连接请求。
  • HCI 命令状态:蓝牙控制器(在Device A端)会再次返回一个HCI_Command_Status事件,以确认是否成功接收到接受连接请求的命令。
  • LMP_eSCO_LINK_REQ(链路管理协议 eSCO 链路请求,多次发送):然后,Device A 这边会多次通过链路管理协议发送 LMP_eSCO_LINK_REQ 消息,为了在链路层面进一步巩固和强调建立 eSCO 连接的请求,确保链路两端都清晰知晓并确认要建立这一连接。
  • LMP 接受消息:最终,Device B的蓝牙控制器会通过LMP发送一个LMP_ACCEPTED_EXT消息给Host A的蓝牙控制器,以确认接受eSCO链路请求。
  • 同步连接建立:一旦双方蓝牙控制器都确认了连接请求,它们将开始建立eSCO链路。完成后,Host B和Host A的蓝牙控制器都会发送一个HCI_Synchronous_Connection_Complete事件,以通知各自的主机同步连接已成功建立。

3.1.3. 步骤 1c:中央设备请求SCO连接

  • Host A 发送请求:Host A 通过 HCI发送 HCI_Enhanced_Setup_Synchronous_Connection 命令,并携带了 (HV1|HV2|HV3|EV3|EV4|EV5|2EV3|2EV5|3EV3|3EV5) 这些参数。用于启动同步连接设置流程。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该命令。
  • LMP SCO 链路请求:如果命令成功接收,蓝牙控制器会通过链路层协议(LMP)发送一个LMP_SCO_LINK_REQ消息给Device B的蓝牙控制器,以请求建立SCO链路。
  • Device B 响应:Device B的蓝牙控制器接收到LMP_SCO_LINK_REQ后,会通过Device B的链路管理器(LM-B)发送一个HCI_Connection_Request (SCO)事件给其Host,经过自身的相关判断和处理,确认可以接受这一连接请求,就会通过 HCI 回复 HCI_Accept_Connection_Request 消息,表示同意与 Host A 建立连接。这是双方在主机层面达成的关于建立连接的初步共识,为后续链路层面的进一步确认和连接的最终建立奠定了基础。
  • HCI 命令状态:蓝牙控制器(在Device B端)会返回一个HCI_Command_Status事件,以确认是否成功接收到接受连接请求的命令。
  • LMP 接受消息:最终,Device B的蓝牙控制器会通过LMP发送一个LMP_ACCEPTED消息给Host A的蓝牙控制器,以确认接受SCO链路请求。
  • 同步连接建立:一旦双方蓝牙控制器都确认了连接请求,它们将开始建立SCO链路。完成后,Host A和Host B的蓝牙控制器都会发送一个HCI_Synchronous_Connection_Complete事件(在图中,Host A端的事件被标记为HCI_Synchronous_Connection_Complete (SCO),而Host B端的事件被标记为HCI_Connection_Complete (SCO)),以通知各自的主机同步连接已成功建立。

3.1.4. 步骤 1d:外围设备请求SCO连接

  • Host B 发送请求:Host B(作为外围设备)通过HCI发送一个HCI_Add_SCO_Connection命令给其蓝牙控制器。这个命令的目的是请求在已经存在的ACL连接基础上添加一个SCO连接,以与Device A(由Host A托管)进行同步通信。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该HCI_Add_SCO_Connection命令。
  • LMP SCO 链路请求:如果命令成功接收,并且ACL连接已经存在(通常这是建立SCO连接的前提),蓝牙控制器会通过链路层协议(LMP)发送一个LMP_SCO_LINK_REQ消息给Device A的蓝牙控制器,以请求建立SCO链路。
  • Device A 响应:Device A的蓝牙控制器接收到LMP_SCO_LINK_REQ后,会给HOST A上报HCI_Connection_Request (SCO)事件,如果经过自身的相关判断和处理,确认可以接受这一同步连接请求,就会通过 HCI 回复 HCI_Enhanced_Accept_Synchronous_Connection_Request (HV1|HV2|HV3) 消息,并且回复中同样携带了 (HV1|HV2|HV3) 参数。这意味着 Device A 在同意建立连接的同时,也认可了 Host B 提出的关于连接的那些特定设置要求,双方在连接建立的关键细节(也就是由 HV1、HV2、HV3 所代表的语音编码格式等相关参数方面)达成了初步的一致意见,为后续链路层面的进一步确认和连接的最终建立奠定了良好的基础,就好像双方在连接的具体技术规格上达成了初步共识,接下来可以继续推进在链路层面的具体协商与确认工作。
  • HCI 命令状态:蓝牙控制器(在Device A端)会返回一个HCI_Command_Status事件,以确认是否成功接收到接受连接请求的命令。
  • LMP_SCO_LINK_REQ:然后,Device A 这边会通过链路管理协议发送 LMP_SCO_LINK_REQ 消息,保障连接建立流程能顺利进行下去。
  • Device B LMP 接受消息:最终,Device A的蓝牙控制器会通过LMP发送一个LMP_ACCEPTED消息给Host B的蓝牙控制器,以确认接受SCO链路请求。
  • 同步连接建立:一旦双方蓝牙控制器都确认了连接请求,并且已经成功建立了ACL连接(如果尚未建立),它们将开始建立SCO链路。完成后,Host B和Host A的蓝牙控制器都会发送一个表示同步连接已完成的事件。

3.2. 重新协商eSCO连接

在蓝牙通信的复杂链路环境中,eSCO连接扮演着重要角色,常用于实时性要求较高的数据传输场景,比如音频传输、实时传感器数据反馈等。然而,随着设备使用过程中诸多因素的变化,例如周边电磁环境的改变、设备自身电量情况变化、应用对数据传输要求的更新(像传输数据量增大、实时性精度要求提高等),已有的 eSCO 连接可能不再能满足最佳的数据传输需求。所以,就需要对其进行重新协商,通过调整连接相关参数来优化连接性能,保障数据传输的质量和效率。这一过程分别涉及中央设备(Central)和外围设备(Peripheral)发起的操作。

3.2.1. 步骤 2a:中央设备重新协商eSCO连接

当中央中央设备评估当前的网络环境、设备能力和用户需求等需要重新协商eSCO,中央设备会进行eSCO连接参数的重新协商。

  • Host A 发送重新协商请求:当中央设备(Host A)需要更改现有eSCO连接的参数时(例如,改变数据包大小、重传次数、时隙间隔等),会通过HCI发送一个HCI_Enhanced_Setup_Synchronous_Connection命令给其蓝牙控制器。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该重新协商请求的命令。
  • LMP eSCO 链路请求:如果命令成功接收,蓝牙控制器会通过链路层协议(LMP)发送一个或多个LMP_eSCO_LINK_REQ消息给外围设备(Device B)的蓝牙控制器。这里出现了多次LMP_eSCO_LINK_REQ的发送,这可能是由于网络延迟、重传机制或协议栈实现的特定行为导致的。在实际应用中,通常只需要发送一个请求即可。
  • Device B 响应:外围设备(Device B)的蓝牙控制器接收到LMP_eSCO_LINK_REQ后,会评估新的连接参数,并决定是否接受这些更改。如果接受,Device B就会回复 LMP_ACCEPTED_EXT 消息,表示接受来自中心设备的链路重新协商请求。这意味着双方在链路层面正式达成一致,同意对已有的 eSCO 连接进行参数调整,就如同双方在链路这条 “信息通道” 上签订了一份重新协商连接的正式协议,为后续真正实施连接参数的改变提供了坚实的链路层面的保障,标志着在链路层次上双方已经就连接重新协商达成了最终的一致意见,接下来就可以着手启动实际的连接参数调整操作了。
  • 同步连接更改:一旦双方蓝牙控制器都确认了新的连接参数,它们将开始应用这些更改,并更新现有的eSCO连接。完成后,中央设备(Host A)和外围设备(Host B)的蓝牙控制器都会发送一个HCI_Synchronous_Connection_Changed事件,以通知各自的主机同步连接参数已成功更改。

3.2.2. 步骤 2b:外围设备重新协商eSCO连接

与步骤2a类似,但在这个步骤中,是外围设备发起重新协商eSCO连接的过程。

  • Host B 发送重新协商请求:当外围设备(Host B)需要更改与中央设备(Device A)之间现有eSCO连接的参数时,会通过其HCI发送一个HCI_Enhanced_Setup_Synchronous_Connection命令给其蓝牙控制器。这个命令包含了新的eSCO连接参数,这些参数指定了连接的新特性,如EV3、EV4、EV5等。
  • HCI 命令状态:蓝牙控制器会返回一个HCI_Command_Status事件,以确认是否成功接收到该重新协商请求的命令。
  • LMP eSCO 链路请求:在图示中,出现了多次LMP_eSCO_LINK_REQ消息的发送。这可能是由于网络延迟、消息重传、协议栈实现的特定行为或图示的简化表示导致的。在实际应用中,通常只需要发送一个请求即可。然而,如果由于某种原因(如连接不稳定或参数不匹配)导致初始请求未被成功接收或处理,则可能需要发送额外的请求。
  • LMP 接受扩展消息:中央设备(Device A)的蓝牙控制器在接收到LMP_eSCO_LINK_REQ后,会评估新的连接参数,并决定是否接受这些更改。如果接受,它会通过其链路管理器(LM-A)和相关蓝牙协议栈功能,发送一个LMP_ACCEPTED_EXT消息给外围设备(Host B)的蓝牙控制器,以确认接受新的eSCO连接参数。
  • 同步连接更改:一旦双方蓝牙控制器都确认了新的连接参数,并成功应用了这些更改,现有的eSCO连接将被更新。完成后,外围设备(Host B)和中央设备(Host A)的蓝牙控制器都会发送一个HCI_Synchronous_Connection_Changed事件,以通知各自的主机同步连接参数已成功更改。

在重新协商eSCO连接参数的过程中,双方设备需要确保新的参数是互相兼容的,以避免连接失败或不稳定。此外,重新协商过程可能会涉及多次消息交换,以确保双方设备都能够正确理解和应用新的连接参数。

四、总结

通过使用 HCI_Enhanced_Setup_Synchronous_Connection 命令,并依据实际情况合理选择 SCO 或 eSCO 逻辑传输方式来建立同步连接,蓝牙设备能够更加灵活且精准地构建起满足不同实时性要求和数据传输特性的通信链路,进一步拓展了蓝牙技术在多样化应用场景中的适用性,无论是简单的语音交互,还是复杂的实时数据监测与反馈等领域,都能凭借稳定可靠的同步连接实现高效的数据传输,提升用户体验,推动蓝牙技术不断发展和广泛应用。

综上所述,蓝牙技术中同步连接的相关机制,从命令使用、不同类型连接的特点与选择,到连接建立、重新协商以及断开等各个环节,都有着严谨且细致的规则和流程,它们相互配合、协同工作,共同保障了蓝牙通信在满足实时性数据传输需求方面的高效性和可靠性,使其成为众多无线通信应用场景中的重要支撑技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byte轻骑兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值