欢迎光临
我们一直在努力

le audio broadcast sink的周期/BIG广播流程

 在无线音频的世界里,一场静默却深刻的革命正在进行。

它,就是LE Audio。

这不仅仅是一次技术迭代,而是从底层重新定义声音如何被创造、传输和体验的范式转移。其复杂性令人敬畏——它并非单一技术,而是一套精密的生态系统:全新的LC3编解码器以超凡效率重塑音质与功耗的平衡,多重串流音频让真无线立体声达到前所未有的稳定与同步,而音频广播功能则打破了“一对一”连接的百年窠臼,让声音如电台般自由播撒。

然而,正是这种复杂性,构成了我们必须深入学习它的不可辩驳的理由。未来的声音图景将由它绘制:从下一代真无线耳机、无障碍助听设备到公共场所的沉浸式音频导览、多语言广播,乃至元宇宙中清晰无缝的语音交互。不了解LE Audio,将意味着在即将到来的音频浪潮中失去对话的基石。

这不仅仅关乎技术本身,更关乎我们如何连接彼此,如何感知世界。让我们共同开启这段探索之旅,揭开LE Audio的复杂面纱,看清它为何必将成为未来数年里,每一个科技从业者、音频爱好者乃至普通用户都无法忽视的关键命题。

接下来的系列文章,我们将逐步拆解这座精妙的技术大厦。

同时我也录制了一系列的Le audio视频,有兴趣的可以咨询,我会带领你们入门Le audio!翻过大山,眼下皆是风景!!!

——————————————————————————————————————————————

视频链接:https://item.taobao.com/item.htm?id=1001969040805&mi_id=000032T4qZX9WZoRwX6YbxlNUaZOfOI6XoxDx0jxsfnwlEc&spm=a21xtw.29178619.0.0

Le Audio文章目录:

还在为蓝牙BLE Audio的学习苦恼吗?安排下,让你一文彻底了解Le Audio蓝牙低功耗音频的技术-CSDN博客

———————————————————————————————————————————

一. 周期性扫描

1. HCI_LE_Set_Extended_Scan_Parameters

HCI_LE_Set_Extended_Scan_Parameters 命令 是蓝牙规范中用于配置设备在低功耗蓝牙(BLE)模式下进行 “扩展扫描” 所需各项参数的核心命令。

该命令让你的设备能够按照设定的方式去监听周围蓝牙设备的广播信息。通过灵活配置多个物理层(PHYs)上的扫描参数,它能在发现设备的效率和功耗之间找到一个最佳平衡点。

该命令使用一个结构体来包含所有设置,主要参数详解如下:

  • Own_Address_Type:决定了在扫描请求中,你的设备会使用哪种类型的蓝牙地址来标识自己。它可以是公开的(Public Address)或随机生成的(Random Address),后者常用于保护隐私。
  • Scanning_Filter_Policy:设置扫描时的过滤规则,以决定只处理哪些设备的广播:
    • 接受所有广播:处理所有扫描到的广播包。
    • 忽略非白名单设备:仅处理已加入“白名单”的指定设备广播。
  • Scanning_PHYs:指定在哪个或哪几个物理层上进行扫描。可以选择在 1M PHY、2M PHY 等通道上进行扫描。一个典型例子是,可以将此值设为 0x01 来表示仅在 LE 1M 物理层上扫描。
  • Scan_Type[i]:以数组形式,为每一个指定的物理层(Scanning_PHYs)配置扫描类型。扫描类型包括:
    • 被动扫描 (Passive Scanning):仅“聆听”广播包,不主动发送任何请求,是最省电的模式。
    • 主动扫描 (Active Scanning):在收到广播包后,会主动发送一个“扫描请求”以获取更多信息,如扫描响应数据。
  • Scan_Interval[i]:和 Scan_Type[i] 一样,这也是一个数组,为每个物理层定义扫描的时间间隔。其值以 0.625 毫秒为单位。例如,值 0x0012(即十进制的 18)经过计算 18 × 0.625ms = 11.25ms,代表扫描间隔为 11.25 毫秒。
  • Scan_Window[i]:同样以数组形式,为每个物理层定义单次扫描持续的时间窗口。该窗口时长不能大于扫描间隔。例如,与上述间隔相同的设置值 0x0012,代表扫描窗口也是 11.25 毫秒。

2. HCI_LE_Set_Extended_Scan_Enable

HCI_LE_Set_Extended_Scan_Enable 命令 用于启动或停止低功耗蓝牙(BLE)的扩展扫描流程。它与 HCI_LE_Set_Extended_Scan_Parameters 命令配合使用:后者配置扫描的详细参数(如物理层、扫描窗口等),前者则实际控制扫描的开关状态。

Enable (1 Octet)

  • 作用:控制扫描的启用或禁用。
  • 取值:
    • 0x00 – 禁用扫描:停止当前正在进行的扫描。
    • 0x01 – 启用扫描:开始按照先前设置的参数进行扫描。
  • 注意:若要在启用前修改扫描参数,必须先禁用扫描,然后调用 HCI_LE_Set_Extended_Scan_Parameters,最后再重新启用。

Filter_Duplicates (1 Octet)

  • 作用:控制是否过滤重复的广播报告,以减少主机处理冗余数据的负担。
  • 取值:
    • 0x00 – 不过滤:每个接收到的广播包都会生成一个 LE_Extended_Advertising_Report 事件上报给主机。
    • 0x01 – 过滤重复:对于同一设备在同一广播集上发送的相同广播数据(或扫描响应),只上报一次。重复报告会被控制器自动丢弃。
    • 0x02 – 重置过滤列表:仅当 Enable = 0x00(禁用扫描)时使用。它清空控制器内维护的重复地址列表,但不改变扫描的启用/禁用状态。
  • 实用提示:在需要连续追踪所有广播包的场景(如RSSI监控)选 0x00;在只需要发现设备存在的场景(如设备发现)选 0x01 可大幅减少事件数量。

Duration (2 Octets)

  • 作用:指定扫描应持续运行的时间长度(以 10ms 为单位)。仅当 Enable = 0x01 时有效。
  • 取值:0x0000 表示无限期扫描,直到主机显式发送禁用命令;非零值则设定扫描运行的毫秒数(实际时长 = Duration × 10ms)。
  • 行为:当扫描运行时间达到 Duration 后,控制器会自动停止扫描,并生成一个 HCI_LE_Scan_Timeout 事件(或类似的状态完成事件)。若同时设置了 Period 参数,二者的配合可以实现周期性扫描(见下)。

Period (2 Octets)

  • 作用:指定两个连续扫描窗口之间的间隔时间,用于实现周期性的扫描模式。仅当 Enable = 0x01 且 Duration 非零时有效。
  • 取值:以 10ms 为单位。Period 必须大于或等于 Duration。
  • 工作机制:
    • 控制器会在每个周期开始时执行一次时长为 Duration 的扫描。
    • 扫描结束后,控制器等待 (Period – Duration) 的时间,然后开始下一个周期的扫描。
    • 若 Period 设为 0x0000,则不会自动重复,扫描仅运行一次 Duration 指定的时长后停止。
  • 典型用例:低功耗应用需要定期扫描,但不希望扫描一直占用射频。例如 Duration = 0x0032(500ms)、Period = 0x00C8(2s)表示每2秒扫描500ms。

场景

Enable

Filter_Duplicates

Duration

Period

效果

持续扫描所有广播

0x01

0x00

0x0000

0x0000

无限扫描,每个包都上报

发现设备,过滤重复

0x01

0x01

0x0000

0x0000

无限扫描,每个设备只上报一次

扫描3秒后停止

0x01

0x00

0x012C

(3000ms)

0x0000

扫描3秒后自动停止

周期性扫描(每2秒扫0.5秒)

0x01

0x01

0x0032

(500ms)

0x00C8

(2000ms)

每2秒扫描0.5秒,重复过滤

3. HCI_LE_Extended_Advertising_Report

HCI_LE_Extended_Advertising_Report 事件 是蓝牙核心规范 5.0 及以上版本中,用于向主机(Host)报告扫描到的扩展广播数据的事件。当控制器(Controller)执行 HCI_LE_Set_Extended_Scan_Enable 命令启用扫描并收到广播报文后,会通过此事件将广播信息(包括传统广播和扩展广播)上报给主机。相比传统的 LE_Advertising_Report 事件,它能携带更多附加信息(如使用的物理层、发射功率、周期广播间隔等),以支持蓝牙 5.0 引入的扩展广播功能。

Subevent_Code (1 octet)

  • 作用:标识该 HCI_LE_Meta_Event 的具体子事件类型。
  • 取值:对于本事件,固定为 0x0D(即 HCI_LE_Extended_Advertising_Report 的子事件码)。
  • 说明:这个字段是 HCI_LE_Meta_Event 的第一个参数,用于区分不同的 LE 元事件。主机在处理时需检查此值以确定事件结构。

Num_Reports (1 octet)

  • 作用:本次事件中包含的广播报告的数量。
  • 取值范围:1 到 0xFF(通常受控制器缓冲大小限制,单次事件可上报多个报告)。
  • 说明:控制器可能会将短时间内收到的多个广播包聚合到一个事件中发送,以提高效率。每个报告描述一个独立的广播数据包。

以下参数以 [i] 索引,表示第 i 个报告(i 从 0 到 Num_Reports-1):

Event_Type[i] (1 octet)

  • 作用:指示该广播事件是何种类型(可连接、可扫描、定向等)以及是否包含扫描响应数据。
  • 取值:比特位组合,常见值如下

Address_Type[i] (1 octet)

  • 作用:广播设备使用的地址类型。
  • 取值:
    • 0x00:公共设备地址(Public Device Address)。
    • 0x01:随机设备地址(Random Device Address)。
    • 0x02:可解析的随机地址(RPA,Resolvable Random Address)。
    • 0x03:不可解析的随机地址(NRPA,Non-Resolvable Random Address)。
    • 0xFF:匿名地址(No address provided,用于某些匿名广播场景)。

Address[i] (6 octets)

  • 作用:广播设备的蓝牙地址(与 Address_Type[i] 对应)。
  • 格式:小端字节序(最低字节在前)。主机需要使用 Address_Type[i] 解释该地址。

Primary_PHY[i] (1 octet)

  • 作用:广播主信道所使用的物理层(Primary PHY)。
  • 取值:
    • 0x01:LE 1M PHY。
    • 0x02:LE 2M PHY。
    • 0x03:LE Coded PHY(Long range)。
  • 说明:主信道用于发送广播指示(AUX_ADV_IND)等。

Secondary_PHY[i] (1 octet)

  • 作用:广播辅助信道所使用的物理层(Secondary PHY,即扩展广播数据实际传输的 PHY)。
  • 取值:与 Primary_PHY[i] 相同(0x01/0x02/0x03),或 0x00 表示没有使用辅助信道。
  • 说明:如果广播仅使用主信道(传统广播),该字段可为 0x00。扩展广播通常会在辅助信道发送更多数据。

Advertising_SID[i] (1 octet)

  • 作用:广播 SID(Set ID),用于标识同一广播集内的不同广播句柄。
  • 取值范围:0x00 ~ 0x0F(有效值),0xFF 表示广播数据不包含 SID(例如传统广播)。
  • 说明:主机可以使用 Advertising_SID 和 Address 共同唯一标识一个广播数据集。

TX_Power[i] (1 octet)

  • 作用:广播数据的发射功率水平(以 dBm 为单位,有符号整数)。
  • 编码:使用 2 的补码表示,例如:0x14 = +20 dBm,0xFC = -4 dBm。
  • 特殊值:0x7F 表示发射功率信息不可用。
  • 用途:可用于路径损耗计算或距离估计。

RSSI[i] (1 octet)

  • 作用:接收到的广播信号的强度指示(Received Signal Strength Indicator)。
  • 编码:有符号整数,单位为 dBm。例如 0xE2 = -30 dBm。
  • 范围:典型值在 -127 dBm 到 +20 dBm 之间,0x7F 表示 RSSI 不可用。

Periodic_Advertising_Interval[i] (2 octets)

  • 作用:周期广播的发送间隔(如果广播集启用了周期广播)。
  • 单位:1.25 ms。
  • 取值:0x0000 表示没有周期广播。非零值表示间隔(例如 0x0640 = 1600 × 1.25 ms = 2 秒)。
  • 说明:仅在收到 AUX_SYNC_IND 或周期广播数据时有效。

Direct_Address_Type[i] (1 octet)

  • 作用:定向广播中目标设备的地址类型(如果广播是定向的)。
  • 取值:与 Address_Type[i] 相同(0x00/0x01/0x02/0x03)。如果广播不是定向的,此字段通常为 0x00 或无效。
  • 说明:定向广播用于快速连接特定的已知设备。

Direct_Address[i] (6 octets)

  • 作用:定向广播的目标设备地址(与 Direct_Address_Type[i] 对应)。
  • 格式:小端字节序。如果广播不是定向的,该地址通常全零。

Data_Length[i] (1 octet)

  • 作用:实际广播数据(Data[i] 字段)的字节数。
  • 取值范围:0 ~ 0xFF(通常受广播数据最大长度限制,扩展广播可达 1650 字节,但控制器会分片上报)。
  • 说明:如果报告的是扫描响应数据,该字段表示扫描响应的长度。

Data[i] (Data_Length[i] octets)

  • 作用:广播数据或扫描响应数据的具体内容。
  • 格式:按照蓝牙规范定义的结构(AD Type + AD Data)。
  • 说明:数据可能包含设备名称、服务 UUID、制造商特定数据等。对于扩展广播,可能是一个或多个广播链片段,主机需要重新组装(如果启用了碎片重组)。

4. HCI_LE_Periodic_Advertising_Create_Sync

HCI_LE_Periodic_Advertising_Create_Sync 命令是 BLE 协议栈中用于与广播设备(Advertiser)建立同步,以接收其周期性广播(Periodic Advertising)数据的关键命令。它从蓝牙 5.1 版本开始引入。执行该命令的典型流程如下:

Options (8 位)

决定同步时的行为策略,是一个包含 3 个独立标志位的位掩码-10。

Bit

置 0(默认)

置 1

0

目标选择:使用 Advertising_SID和 Advertiser_Address参数定位目标广播设备

使用控制器中预设的周期性广播列表(Periodic Advertiser List)来匹配设备。

1

报告使能:同步成功后,立即启用 HCI_LE_Periodic_Advertising_Report事件的上报

初始状态为禁用上报,需后续由 HCI_LE_Set_Periodic_Advertising_Receive_Enable开启。

2

重复过滤:默认不禁用重复过滤,即所有符合条件的报告都上报

禁用重复过滤,控制器将上报所有收到的周期性广播数据包。

Advertising_SID (8 位)

在Options Bit 0 为 0 时用于指定目标广播集 ID。它必须与在 LE_Extended_Advertising_Report 事件中获取的 Advertising_SID 值完全匹配,取值范围是 0x00 到 0x0F。

Advertiser_Address 与 Address_Type (48 + 8 位)

在Options Bit 0 为 0 时用于定位目标设备,这两个参数共同指定一个唯一的广播设备。Address_Type 常见取值为 0x00(公共地址)、0x01(随机地址)或 0x02(可解析随机地址)。

Skip (16 位)

指定成功接收一个周期性广播包后,最多可以连续跳过(忽略)多少个广播事件。这允许主机在数据变化不频繁时降低处理功耗。其取值范围是 0x0000 到 0x01F3;若设为 0x0000,控制器必须处理每一个接收到的广播包,不进行跳过。

Sync_Timeout (16 位)

定义同步超时时间,单位为 10ms。取值范围是 0x000A 到 0x4000,超过此范围会返回错误。如果在超时时间内未能成功接收到广播包,同步过程将失败。建议将此值设为至少 6 个广播间隔,以确保有足够的时间建立同步-。

Sync_CTE_Type (8 位)

用于筛选带有特定恒定音调扩展(Constant Tone Extension, CTE)的周期性广播。CTE 主要用于蓝牙 5.1 引入的到达角(AoA)和离开角(AoD)测向功能。该参数是一个位掩码,可以组合多种类型。

含义

0

同步带有 AoA 类型 CTE 的广播。

1

同步带有 AoD 类型 CTE 的广播,CTE 长度为 1 微秒。

2

同步带有 AoD 类型 CTE 的广播,CTE 长度为 2 微秒。

3

同步带有 AoD 类型 CTE 的广播,CTE 长度为 4 微秒。

其他

保留位。

5. HCI_LE_Periodic_Advertising_Sync_Established

HCI_LE_Periodic_Advertising_Sync_Established 是一个 HCI 事件,用于通知主机:控制器已尝试与一个周期性广播(Periodic Advertising)源建立同步,并报告同步的结果(成功或失败)。它是蓝牙 5.0 引入的周期性广播同步流程中的核心反馈事件。

参数

字节数

描述

Subevent_Code

1

固定为 0x0E,用于在 LE_Meta_Event中区分该事件。

Status

1

同步结果状态码。 • 0x00:同步成功。 • 非零(如 0x3F 超时,0x1A不支持远程特性等):同步失败。

Sync_Handle

2

同步句柄。仅当 Status == 0x00时有效。控制器为此同步分配的唯一标识符(范围 0x0000~ 0x0EFF)。主机后续接收周期性广播数据、终止同步等操作都需要使用该句柄。

Advertising_SID

1

广播集标识符(SID),与创建同步时指定的 Advertising_SID

一致(0x00 ~ 0x0F)。用于标识同一设备下的不同广播集。

Advertiser_Address_Type

1

广播设备的地址类型(例如 0x00公共地址,0x01随机地址,0x02

可解析随机地址等)。

Advertiser_Address

6

广播设备的蓝牙地址(小端序)。

Advertiser_PHY

1

广播方实际使用的物理层(PHY)来发送周期性广播。 • 0x01:LE 1M PHY • 0x02:LE 2M PHY • 0x03:LE Coded PHY

Periodic_Advertising_Interval

2

周期性广播的发送间隔。 • 单位:0.625 ms • 实际间隔 (ms) = 该值 × 0.625 • 例如 0x0640= 1600 × 0.625 ms = 1000 ms (1秒)

Advertiser_Clock_Accuracy

1

广播方设备时钟精度(Clock Accuracy)。这是一个枚举值,告知接收方其广播定时漂移的程度,以便接收方可以适当调整监听窗口来省电。 • 0x00:精度为 500 ppm (百万分之五百) • 0x01:精度为 250 ppm • 0x02:精度为 150 ppm • 0x03:精度为 100 ppm • 0x04:精度为 75 ppm • 0x05:精度为 50 ppm • 0x06:精度为 30 ppm • 0x07:精度为 20 ppm • 其他值保留

6. HCI_LE_Periodic_Advertising_Report

HCI_LE_Periodic_Advertising_Report 是一个 HCI 事件,用于向主机上报从已同步的周期性广播(Periodic Advertising)中接收到的数据包。当主机通过 HCI_LE_Periodic_Advertising_Create_Sync 成功与一个广播源建立同步后,控制器每收到一个周期性广播数据包(或数据链包)就会生成此事件

参数

字节数

描述

Subevent_Code

1

固定为 0x0F,用于在 LE_Meta_Event中区分该事件。

Sync_Handle

2

同步句柄。标识该报告属于哪一个周期性广播流。与 HCI_LE_Periodic_Advertising_Sync_Established事件中返回的句柄值相同。

TX_Power

1

广播设备发送该周期性广播包时使用的发射功率(单位 dBm,有符号整数) • 例如 0x14 = +20 dBm,0xFC= -4 dBm。 • 特殊值 0x7F

表示功率信息不可用。

RSSI

1

控制器接收该广播包时测得的信号强度(单位 dBm,有符号整数)。 • 例如 0xE2 = -30 dBm。 • 可用于距离估算或链路质量监测。

CTE_Type

1

该广播包中包含的恒定音调扩展(Constant Tone Extension)类型。仅在蓝牙 5.1 及以上版本且广播方启用了 CTE 时有效。 • 0x00:无 CTE。 • 0x01:AoA(到达角)CTE。 • 0x02:AoD(离开角)CTE,1 µs 时隙。 • 0x03:AoD CTE,2 µs 时隙。 • 0x04:AoD CTE,4 µs 时隙。 • 其他值保留。注意:本事件为 [v1] 版本,实际上该字段在 v1 中可能未定义或为保留字段,但在后续版本中明确存在,通常为了兼容性仍保留此字段

Data_Status

1

指示该报告中的数据的完整性状态。用于处理可能分片发送的较长的周期性广播数据。 • 0x00:数据完整(Complete)。本次报告包含了整个广播数据单元。 • 0x01:数据不完整,后续还有更多数据(Incomplete, more data to come)。主机需要继续接收后续同 Sync_Handle的事件以拼装完整数据。 • 0x02:数据不完整,且数据被截断(Incomplete, data truncated)。表示接收的数据因长度超过控制器缓冲而被截断,不完整的数据已丢弃。 • 其他值保留。

Data_Length

1

紧随其后的 Data字段的字节数(0 ~ 0xFF)。

Data

Data_Length

周期性广播的实际数据内容。按照蓝牙规范中 AD 结构(Type + Data)组织。可能包含服务数据、厂商数据等。对于长数据,可能需根据 Data_Status 拼装。

二. BIG同步

1. HCI_LE_BIGInfo_Advertising_Report

HCI_LE_BIGInfo_Advertising_Report 事件是BLE广播接收流程中,用来宣布一个广播等时组(BIG, Broadcast Isochronous Group)关键信息的事件。 当接收到周期性广播(PA)时,控制器解析出包含BIG参数的特定广播链数据后,会生成此事件。

简单来说,它就像在你对焦到“频道”(PA)后,给你完整列出“节目清单”(BIG)所有详细规格的事件。

参数名

字节数

描述与作用

Subevent_Code

1 Octet

子事件码,固定为 0x22 (对应于 HCI_LE_BIGInfo_Advertising_Report),用于区分此事件与其它 LE 元事件。

Sync_Handle

2 Octets

同步句柄,关联到你之前同步的周期性广播流(PA)的句柄。

Num_BIS

1 Octet

BIS数量:此BIG中包含的广播等时流总数,决定了一个BIG的数据通道数。取值范围1到31,能承载多种服务数据。

NSE

1 Octet

子事件数量:每个BIS事件中包含的子事件个数,用于实现数据重传。取值范围1到31,且必须是BN值的整数倍。

ISO_Interval

2 Octets

等时间隔:相邻BIG锚点的时间间隔,定义了数据发送的帧周期。计算公式为 ISO_Interval × 1.25 ms,例如值为 0x0640 (1600) 时,间隔为 1600 × 1.25 ms = 2000 ms

BN

1 Octet

突发包数量:每个BIS事件中发送的新净荷的个数。值在1到7之间,决定了在单个子事件中能发送多少新数据

PTO

1 Octet

预传输偏移:为BIG事件中数据预传输预留的时间偏移量。值在0到15之间,可提高同步可靠性

IRC

1 Octet

重传次数:每个净荷在BIS事件内被重传的次数。值在1到15之间,用于权衡实时性与可靠性

Max_PDU

2 Octets

最大PDU长度:每个BIS数据PDU能承载的最大字节数,指包含或不含消息完整性校验(MIC)的有效载荷,不是整个BIS包大小

SDU_Interval

3 Octets

SDU间隔:服务数据单元(SDU)的发送间隔,单位为微秒(μs)。高层应用(如音频编解码器)的数据包到达时间间隔,该参数值为0表示未知

Max_SDU

2 Octets

最大SDU长度:单一SDU能承载的最大字节数,直接决定了高层数据包的最大尺寸

PHY

1 Octet

物理层类型:BIG数据包的传输物理层(PHY)

• 0x01:LE 1M PHY • 0x02:LE 2M PHY • 0x03:LE Coded PHY(长距离)

Framing

1 Octet

组帧格式:数据帧的组织形式。0x00

表示未组帧(Unframed),0x01

表示已组帧(Framed)模式,后者在音频传输中常见

Encryption

1 Octet

加密标志:指示BIG是否已加密。0x00为未加密,0x01表示加密-。

2. HCI_LE_BIG_Create_Sync

HCI_LE_BIG_Create_Sync 命令是蓝牙核心规范 (v5.2 及以上) 的一部分。它的核心作用是让接收端设备(广播同步端,Broadcast Sink)根据之前已同步的广播信息(即周期广播,Periodic Advertising),去同步并接收一个特定的广播等时组(Broadcast Isochronous Group,BIG)。BIG 包含一个或多个广播等时流(Broadcast Isochronous Stream,BIS)。

参数

描述

代码实现与细节

BIG_Handle

Host 为主机端为新同步的 BIG 分配的本地标识符。

后续管理该 BIG 时,会用这个句柄来指代它-

Sync_Handle

指向一个已在 Host 端同步的周期广播广告集。

这个句柄是通过 HCI_LE_Periodic_Advertising_Create_Sync

命令成功同步后获得的。它告诉控制器应该去监听哪个广播“频道”下的 BIG 信息

Encryption

一个标志位,指示传入的 Broadcast_Code是否有效

0x00表示 未加密(需配合 Broadcast_Code

使用);0x01表示 已加密。如果匹配错误,控制器会返回 Encryption Mode Not Acceptable (0x25)

Broadcast_Code

当 Encryption设为 0x00

时,这是一个 16 字节的字段。

它用于配合 BIG 信息中的 GIV(GIST Value)和 GSKD(Group Session Key Diversifier)来生成解密 BIS 数据的会话密钥

MSE (Maximum Subevents)

在每个 BIS 间隔内,控制器监听数据有效载荷的最大子事件数。

这可以用于节省功耗。控制器可以监听所有子事件(常用值 0x00

BIG_Sync_Timeout

两次成功接收 BIS PDU(协议数据单元)之间允许的最大间隔时间。

如果超过此时间未接收到,同步将丢失。控制器可能会将这个值调整为 6 × ISO_Interval

Num_BIS

BIS[i] 数组中包含的 BIS 索引的数量。

允许设备只同步 BIG 中的一个或几个 BIS,而不是全部,从而节省功耗和计算资源

BIS[i]

一个数组,列出了你想要同步的 BIS 的索引。

这个列表必须是升序且不重复的

3. HCI_LE_BIG_Sync_Established

这个事件是 HCI_LE_BIG_Sync_Established,它是蓝牙控制器在成功同步到一个广播等时组(BIG)后,通过 LE Meta Event (0x3E) 向上层 Host 发送的通知。

注:Event Code = 0x3E 表示它是一个 LE 元事件。元事件的第一个参数 Subevent_Code 用于区分具体是哪种 LE 子事件,而 LE BIG Sync Established 的子事件代码为 0x1E(规范 v5.3+,具体值需参考核心版本)。

参数

大小

描述

Subevent_Code

1 octet

标识该事件是 LE BIG Sync Established,固定为 0x1E

Status

1 octet

同步操作的结果。 0x00= 成功;非 0x00表示失败(例如 0x41= 同步超时,0x42= BIG 不存在等)。

BIG_Handle

1 octet

由 Host 之前通过 HCI_LE_BIG_Create_Sync

提供的本地标识符,用于指代这个同步的 BIG。

Transport_Latency_BIG

3 octets

BIG 数据的最大传输延迟,单位是微秒 (µs)。 表示从广播源发出数据到接收端解码器准备好数据之间的时间差。

NSE (Number of Subevents)

1 octet

每个 BIS 间隔内的子事件数量。广播者会在每个等时间隔中重复发送相同的数据包多次(子事件),以提高可靠性。

BN (Burst Number)

1 octet

突发数量。每个等时间隔中,广播者实际发送的新数据包个数。通常 BN ≤ NSE,多余子事件用于重传。

PTO (Pre-Transmission Offset)

1 octet

预传输偏移。在 BIG 事件中,从事件开始到第一个子事件开始的偏移量(以 125 µs 为单位)。

IRC (Isochronous Retransmission Count)

2 octets

等时重传次数。用于帮助接收端估算链路质量。

Max_PDU

2 octets

每个 BIS 数据包中 SDU (服务数据单元) 的最大字节数。

ISO_Interval

2 octets

等时间隔。连续两个 BIS 事件开始点之间的时间,单位是 1.25 ms。 例如值 = 4 表示间隔 5 ms。

Num_BIS

1 octet

该 BIG 中包含的 BIS 流总数。

Connection_Handle[i]

2 octets × N

为每个成功同步的 BIS 分配的 连接句柄(每个 BIS 对应一个 ISO 数据通道)。 后续 Host 可以用这些句柄接收音频数据或进行流量控制。

4. HCI_LE_Setup_ISO_Data_Path

是蓝牙核心规范(Bluetooth Core Specification)中用于 LE Audio(低功耗音频) 场景的关键 HCI 命令。

它的作用是:在已经建立好的等时信道(ISO Channel,即 CIS 或 BIS)上,为主机(Host)和控制器(Controller)之间建立一条 等时数据路径,同时可以指定路径所用的 编解码器(Codec) 及详细配置。

可以理解为:先建好“管道”(等时连接),再用这个命令为管道铺设“数据线”并决定“怎么编码”。

Connection_Handle (2 字节)

  • 含义:指定目标等时信道(CIS 或 BIS)的连接句柄。
  • 取值范围:0x0000 – 0x0EFF(有效句柄范围)
  • 要求:该连接必须已经建立完成,否则命令会失败。

Data_Path_Direction (1 字节)

  • 含义:数据路径的方向(从控制器的角度定义)。
  • 取值:
    • 0x00:输入方向(Input) – 数据从 主机 → 控制器(通常用于发送 / TX)
    • 0x01:输出方向(Output) – 数据从 控制器 → 主机(通常用于接收 / RX)
  • 约束:同一个连接句柄的同一个方向,只能建立一条数据路径。重复执行会失败。

Data_Path_ID (1 字节)

  • 含义:指定数据在主机与控制器之间传输所使用的物理接口。
  • 取值:
    • 0x00:标准 HCI 传输层(最常用)
    • 0x01 – 0xFE:厂商自定义路径(如 PCM、I2S 等)
    • 0xFF:保留

Codec_ID (5 字节)

  • 含义:标识要使用的编解码器。
  • 结构:
    • 第 1 字节:编解码器类型
    • 第 2-3 字节:公司 ID(Company ID,小端序)
    • 第 4-5 字节:厂商自定义编解码器 ID

Controller_Delay (3 字节)

  • 含义:控制器端的固定处理延迟,单位是 微秒 (μs)。
  • 解释:数据从控制器接口到达空中(或反向)的固定延时。
  • 类型:24 位无符号整数。不确定时可填 0。

Codec_Configuration_Length (1 字节)

  • 含义:紧跟在后面的 Codec_Configuration 数据的字节长度。
  • 取值范围:0x00 – 0xFF
  • 注意:如果没有额外配置,填 0x00。

Codec_Configuration (可变长度,长度由上一字段决定)

  • 含义:编解码器的具体配置参数(OCTETS)。
  • 内容格式:由 Codec_ID 指定的编解码器决定。例如 LC3 编码可以配置采样率、帧时长等。
  • 长度要求:必须等于 Codec_Configuration_Length。

赞(0)
未经允许不得转载:171主机测评 » le audio broadcast sink的周期/BIG广播流程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址