说实话,真正把 Auracast 从规范文档搬到真实硬件上,跟想象中完全是两回事。我用了大半年的 BT2106C 模块做音频广播开发,一开始以为只是“开个广播、推个流”的事,真上手之后才发现,从广播参数到天线布局,从加密策略到音频同步,每一步都有看不见的坑。这篇文章不打算复述协议栈文档,就把我实际调这块模块、跑测试、做产品原型的过程和效果分享出来,给正在做 LE Audio、蓝牙音频模组集成或者公共广播方案的朋友一个参考。
1. 先弄明白 Auracast 到底改变了什么
1.1 传统蓝牙音频的两个隐性限制
做蓝牙音频的应该都有体感:经典蓝牙 A2DP 是一对一的,一台手机只能连一台音箱或者一副耳机,要想传到第二台设备,要么断开重连,要么靠各自厂商私有协议去组“多音箱”,实现成本和兼容性都是问题。更深层的限制在于,经典蓝牙的音频分发依赖“连接”这个前提,接收端要能听到声音,必须先完成配对、鉴权、链路建立这一整套流程,这在公共场景里几乎不可行——你总不能要求每个走进博物馆的参观者先去跟导览设备配对。
另一个容易忽略的限制是功耗和复杂度的耦合。连接状态下的音频链路需要接收端长期维护一种面向连接的调度关系,为了保持这个小网,设备必须同步地处理锚点、重传、电源管理,在低功耗场景里这其实很重。Auracast 的思路就是把这条路反过来:不再为每个接收者单独建立连接,而是把音频源源不断地抛到空中,谁愿意听谁同步。
1.2 Auracast 的核心模型:不连接也能听
Auracast 的底层是 LE Audio 里那套广播同步机制,技术上有几个概念必须吃透:BIS(Broadcast Isochronous Stream)负责把音频数据包被动地广播出去;BIG(Broadcast Isochronous Group)把多个 BIS 打包成一组,比如一个主音频流加一个辅助解说流;Periodic Advertising(周期广播)则是接收端发现 BIG、建立同步的“引路人”;而用户能直接在手机或者耳机上看到的那串“广播名称”,就是靠周期广播里的辅助包透传出去的。
我用一个容易理解的方式来类比:传统蓝牙像是打电话,要先拨号、对方接听、然后双方保持通话状态,任何一方挂断就断了;Auracast 像是听广播电台,你只需要知道频率和频道,打开收音机就能听,不需要跟电台建立任何会话。在这个模型里,发射端的核心工作是“持续广播”,接收端的核心工作是“扫描发现 + 本地解密 + 解码播放”,两者互不牵制。
这个架构带来的实际变化很大。公共广播场景里,音频源可以把同一个信号同时抛给整个场馆里的无数副耳机,不需要知道它们存在;个人场景里,电视可以作为发射端广播伴音,家里每个人戴着自己的耳机同步收看,音量互不干扰。这些都是 A2DP 时代做不到或者做起来非常别扭的事。
1.3 BT2106C 在这个生态里的位置
BT2106C 是一个面向 Auracast 发射端应用的蓝牙音频广播模块,内部集成了支持 LE Audio 的协议栈、射频前端和音频处理链路,外部只需要配置音频输入和控制接口就能变成一个独立广播源。我手里这批模块主要用在两个方向:一个是做场馆级的音频广播网关,另一个是做小型化的音频转发设备(比如把有线麦克风或者模拟音频转成 Auracast 广播源)。
这里需要强调的是,Auracast 的开发链路比普通 BLE 要复杂一些,因为它同时涉及协议栈配置(周期广播、BIG 参数、广播通道选择)、音频编码(LC3 编码器配置)、射频调度(广播事件与音频帧节奏的配合)以及设备发现体验(广播名称、广播类型是否可见)这几个层面。BT2106C 这类模块的价值在于把前面三层封装好了,开发者能比较快地把精力集中在业务配置和应用体验上,但这也意味着一旦出现问题,你得具备往下层排查的能力,毕竟模块并不是万能的。
2. BT2106C 的硬件选型与最小系统搭建
2.1 为什么选模块而不是自研射频
说实话,做蓝牙音频广播,最忌讳的就是一上来就自己画射频。2.4G 频段的匹配、滤波、天线阻抗、走线寄生,每一项都能让信号质量天差地别。我自己之前在一款产品上试过用分立器件搭前端,结果灵敏度上不去,最后只能回炉。用 BT2106C 这类熟人验证过的模块,核心收益不是省那几毛钱物料,而是把射频风险和认证周期压到了最低,模块厂商已经做好了天线匹配和杂散处理,你做 PCB 的时候只要保证参考设计里天线区域的净空和地平面处理跟得上就行。
我们这个项目最早的验证板就是直接把模块贴在底板角落,音频输入用一颗驻极体麦克风加简单的前置放大电路,控制接口走 UART,总共一周就把第一版原型点亮了。如果从零开始做射频方案,光 choke、π 型匹配、天线调测就能耗上一个月,代价完全不成比例。
2.2 最小系统的关键点
搭建最小系统时有几个细节我建议特别注意。
第一是供电。Auracast 广播与经典蓝牙连接模式相比,射频发射是持续的周期事件,电流曲线更像“连续小脉冲”而不是“突发大电流”,但这不代表你可以忽视电源设计。模块规格上标称工作电压 3.3V,实际允许范围一般在 2.8V 到 3.6V,我们不建议直接把 LDO 输出怼到模块电源脚,至少要在靠近电源脚的位置放一颗 10uF 陶瓷电容加一颗 0.1uF 高频去耦电容。我实际量过,广播峰值电流可以到 100mA 级别,如果电源走线太长或者电容布局太远,会导致射频发射时电压跌落,轻则灵敏度下降,重则造成广播事件间断。
第二是音频输入。BT2106C 支持模拟麦克风输入和 I2S 数字音频输入两种方式。做场馆广播时我强烈建议走 I2S 接外部编解码器或者音频处理 DSP,模拟输入虽然省事,但底噪、增益匹配和抗干扰问题会占据大量调试时间。我们第一次直接怼模拟麦,结果碰上了 2.4G 射频泄漏串扰进音频前端的典型问题,后面换成差分输入和更靠近模块的滤波器结构才解决。
第三是控制接口。模块的 UART 波特率、固件升级引脚、复位时序都要在原理图阶段就明确,特别是复位时长要满足模块要求,否则会出现上电时序不稳、偶尔起不来的现象。我们当时踩过复位脚悬空的坑,模块第一次上电能广播,断电重启后有概率死机,追了半天发现是复位脚在电源上升过程中受到干扰,补了一个 10k 上拉电阻后问题消失。
2.3 天线和 PCB 布局
天线布局这块值得单独说,因为它是决定实际广播距离的隐藏变量。BT2106C 模块通常是板载天线或者支持外接天线座。如果板载天线,天线正下方和正上方区域内不要走地线、不要铺铜,周围 5mm 以内不要放金属件和高速信号线。
我们做了一组对照实验:同一块板子,天线区域周围 3mm 内走了一根 I2C 总线,空旷环境下手机接收距离从 35 米左右掉到了 22 米左右;把 I2C 挪走、天线区域净空以后,距离回到 33 米以上。这个数据虽然不是严谨的实验室结果,但趋势很明显——天线净空对广播覆盖的杀伤力远比想象中大。
如果使用外接天线,要注意 IPEX 座子和馈线的固定,天线延长线越长损耗越大,实测超过 10cm 的同轴线会让有效距离明显衰减。我们在产品外壳里用的是板载天线方案,只要外壳不是全金属包裹,效果都还能接受;但如果你必须把模块放进金属腔体里做网关,建议预留外接天线做软板延伸。
3. 从 SDK 到第一声广播:开发流程与关键配置
3.1 工程配置和广播参数的取舍
BT2106C 的开发基本是厂商 SDK 里的 BLE 协议栈加一层 LE Audio 应用封装。工程搭建本身不难,难在参数怎么选。先说我们最终采用的一套广播参数(不同需求可以自行调整):
- 广播物理层:2M PHY(数据吞吐更高,适合音频载荷)
- 广播事件间隔:20ms(对应 50Hz 广播事件)
- 子帧间隔:10ms(单个子帧承载一路音频)
- 音频编码:LC3,48kHz 采样率,160kbps 码率(双声道)
- 发射功率:+4dBm(覆盖优先)
- 广播类型:Discoverable(可发现,带广播名称)
- BIG 中 BIS 数量:1(单路音频流,稳定优先)
这套配置的核心逻辑是:在 20ms 广播间隔里,每个 BIS 事件只占用很短的射频窗口,剩下的时间留给接收端去扫描、同步和补包。如果把广播间隔缩短到 10ms,延迟确实会降低,但射频占用率升高,在密集蓝牙环境里反而更容易被干扰打断。广播间隔放到 40ms 可以省电,但接收端同步缓冲区要调大,延迟感受会明显增加。对大多数公共广播场景,20ms 是一个甜点值。
3.2 启动广播的那条调用链
SDK 的接口命名各家不同,但逻辑链基本是下面这样(我按通用语义写,真实接口以你用的 SDK 手册为准):
// 1. 初始化协议栈和音频子系统 bluetooth_init(); audio_subsys_init(); // 2. 配置周期广播参数 periodic_adv_config_t pa_cfg = { .interval_min_ms = 20, .interval_max_ms = 20, .phy = PHY_2M, }; periodic_adv_set_config(&pa_cfg); // 3. 创建 BIG,配置子帧参数 big_config_t big_cfg = { .num_bis = 1, .sdu_interval_us = 10000, .max_sdu_size = 400, .phy = PHY_2M, .packing = PACKING_SEQUENTIAL, }; big_create(&big_cfg); // 4. 启动 LC3 编码器 lc3_encoder_config_t lc3_cfg = { .sample_rate = 48000, .bitrate = 160000, .channel_mode = STEREO, }; lc3_encoder_start(&lc3_cfg); // 5. 在广播事件里持续推送编码帧 while (1) { pcm_frame_t pcm = mic_read_blocking(); lc3_frame_t enc = lc3_encode(&pcm); big_write_bis(0, enc.data, enc.size); }这串伪代码基本反映了 Auracast 发射端的数据流:音频采集 -> PCM → LC3 编码 → 按 BIS 子帧写入协议栈 -> 射频周期广播。实际项目里还会加音量控制、广播启动/停止状态机、以及音频输入断流的自动待机逻辑。大部分开发时间其实是花在围绕这条主链的边缘逻辑上,而不是主链本身。
3.3 用手机和耳机做验收
没有接收端,广播源就是“看不见摸不着”的状态。我的验收方式分三层。
第一层,用 nRF Connect 扫描。能搜到周期广播节点,展开能看到广播名称和 BIGInfo 相关信息,说明协议栈和广播参数基本正常。这一层主要验证“发射这件事本身没问题”。
第二层,用支持 Auracast 接收的手机扫描并收听。目前部分 Android 手机系统蓝牙菜单里已经有 Auracast 的入口,打开后可以扫到周围公开的广播源并直接试听。这一步能验证编码参数是否合理、手机作为接收端时延和音质表现。
第三层,用真无线耳机接收。我手头常用的接收端是手机加一副支持 Auracast 的 TWS,另外还有一支 Auracast 接收评估板。不同接收端的同步算法、缓冲区策略不一样,同样的发射参数在不同接收端上感受可能完全不同。我强烈建议在开发阶段就同时准备至少两类接收端:一类是手机(接收逻辑更标准),一类是耳机或独立接收棒(资源更受限,对广播参数更敏感)。
我走完第一层只用了一个下午,第二层调了两天(主要是在手机系统里找不到入口、更新系统、以及广播可见性配置的问题),第三层的音质和断流问题则是后续两周持续在改的。
4. 实际场景下的效果测试与数据
4.1 三种场景的覆盖与稳定性
从搭好原型到稳定运行,我把模块带到三个典型环境里做过实测。这里说明一下,测试用的接收端是同一部 Android 手机和同一副 Auracast 耳机,发射端用的是同一个 BT2106C 模块,发射功率固定为 +4dBm。
| 场景 | 环境特征 | 有效稳定距离 | 音频表现 | 备注 |
|---|---|---|---|---|
| 30 平会议室 | 少量桌椅、一台 AP、空调 | 满覆盖(约 8-10 米半径) | 无中断,音质稳定 | 隔一堵轻体墙仍可听,但距离缩短到 5 米左右 |
| 商场中庭 | 高挑空、人员密集、大量蓝牙设备 | 中庭半径约 15 米 | 前 10 米流畅,边缘偶发轻微断续 | 蓝牙干扰明显,广播名称刷新变慢 |
| 户外广场 | 空旷、无遮挡 | 稳定 30 米以上 | 远距离偶有卡顿 | 走到约 40 米后完全丢失同步 |
这个结果和经典蓝牙 A2DP 的感受完全不同。A2DP 在相同发射功率下,手机放口袋里人走到 10 米外可能就开始断续,而 Auracast 因为是单向广播,接收端不需要回 ACK,实际覆盖距离反而更接近 BLE 广播的理论边界。不过要注意,这个“远”是有代价的——A2DP 靠重传机制保证连续性,Auracast 靠时间分集和接收端缓冲去隐藏丢包,一旦超出临界距离,音频不是慢慢变差,而是直接“断崖式”丢失,这个体感要做好预期管理。
4.2 延迟、音质与并发能力
延迟方面,我用高速摄像和音频脉冲做了个不严谨的测试:从音频输入发出一个短促脉冲,到接收端出声,大概在 80ms 到 150ms 这个区间。这个延迟来自 LC3 编码缓冲、BIG 子帧填充、接收端去抖动缓冲和 DAC 输出的叠加。对语音广播、导览、电视伴音来说完全够用,但如果要做舞台监听或者需要唇音同步极严格的场景,这个延迟就需要用更激进的参数去压。
音质方面,LC3 在 48kHz / 160kbps 下,主观听感和经典 SBC 高码率差不多,高频毛刺明显更少,中频人声的厚度保持得很好。做语音广播、导览、电视伴音完全合格;做严肃音乐欣赏还是有点数码感,但这更多是编码码率和后续音频链路的问题,不是 Auracast 本身的天花板。
并发能力是这个架构最让人兴奋的点。从协议层来说,一个 BIG 广播源理论上可以被无限数量的接收端同时同步收听,因为接收端之间完全独立,不需要发射端去调度。我在商场中庭测试时同时开了十几副耳机听同一路广播,发射端侧没有任何额外负担,各接收端互不干扰。当然,接收端越多,周围频段的总干扰会越高,这是物理层面的问题,只能靠广播信道选择和频点规划解决,但至少不像连接模式那样有明确的连接数天花板。
5. 开发过程中被我踩烂的几个坑
5.1 广播名称搜索不到
项目刚开始最尴尬的一件事:明明是同一套广播参数,nRF Connect 里能看到周期广播事件,但无论手机还是耳机都搜不到广播名称和可发现的广播源。
后来用抓包器抓了空中的广播包才发现问题:BT2106C 的 SDK 里,广播名称要放在周期广播的 AUX 辅助包数据里,如果你只是启用了周期广播而没有正确填充 PA 数据里的广播名称字段,接收端虽然能收到广播事件,但没法把它作为一个“可用的 Auracast 源”展示出来。简单说,广播名称需要专门配置到周期广播数据的指定字段里,并且对应广播源类型要设成“Discoverable”才可见。
排查过程也提醒我一点:任何“能发射但发现不了”的问题,不要先怀疑模块坏了,先用空中抓包(nRF Sniffer 或 Ellisys)看包结构。你看到的协议栈 API 是一层帷幕,空中才是最终真相。
5.2 加密还是公开:一个产品决策坑
Auracast 广播源支持 Private(加密)和 Public(公开)两种模式,加密需要接收端输入 Broadcast Code 才能收听。一开始我图省事,觉得公开广播对用户体验最好,所有设备扫到就能直接听,但真正做产品的时候发现没那么简单。
公开广播的问题是“谁都拦不住”。在商场或者医院里做公共广播还好,但如果你做的是付费导览或者企业内部广播,公开就意味着任何带 Auracast 接收能力的设备都能白嫖音频,而且大概率在同一区域内和你的合法用户抢射频资源。加密广播能解决准入控制,但兼容性风险上升:部分接收设备对 Broadcast Code 的输入入口藏得很深,有些耳机甚至只支持 Public 广播源,最终导致用户连接率下降。
这个坑的教训是:加密/公开不能只从协议层考虑,必须在产品定义阶段就明确你的受众是谁。如果是消费级“扫到就听”的体验,必须公开,那就要接受一定程度的不可控;如果是服务型广播,务必同时做“公开试听频道 + 加密主频道”的双 BIS 方案,兼顾体验和卖点。
5.3 音频断裂与重同步
还有个绕不开的坑是移动接收时的音频断裂。A2DP 断了会立刻尝试重传,听众感受是“卡一下马上恢复”;Auracast 断了以后,接收端需要重新扫描周期广播、重新建立 BIG 同步,这个回连时间从几百毫秒到好几秒都有可能,体感上是非常明显的“断流后长时间无声”。
这个问题的根源在于接收端离开了广播覆盖区又回来以后,BIG 的定时关系已经丢失,同步需要从 PA 开始重新建立。我在测试中发现,发射端能做的就是两件事:一是把 PA 的广播间隔适当缩短,让接收端更容易回到同步状态;二是在设备端把 BIG 广播在时域上做得更规整,减少接收端时钟漂移的影响。但更实际的办法是接受“覆盖边缘必定断续”的现实,在测试阶段就把覆盖边缘测出来,产品说明书上不要吹嘘不切实际的覆盖范围。
另一个容易被忽略的点是接收端 IC 的同步策略各不相同。同样的参数下,手机接收端丢失后恢复只需要一两秒,而某款耳机的恢复时间长达五秒以上。不是你的发射端有问题,是接收端算法有差异。做产品验收时千万别只看一台设备,至少用三五台不同方案接收端做回归。
6. 这东西能做产品吗:落地场景与扩展方向
6.1 助听/辅听与公共广播
Auracast 第一个能落地的方向一定是辅助听力。教堂、剧院、博物馆、机场这些场景里,传统的 T 线圈或者红外导览系统装机成本高、设备老旧,而 Auracast 只要在音控室里放一个 BT2106C 模块,把调音台的辅助输出接进去,整个场馆里所有支持 Auracast 的助听器、耳机就都能收到清晰的声音。这比让人去领一台专用接收器自然得多。
做这类场景时,我建议把广播参数侧重稳定性和兼容性,码率用 96kbps 到 128kbps 就足够语音清晰,不需要顶到 160kbps,反而可以把广播间隔适当放宽,让出更多射频资源给其他信号。同时要提供“Public + Private”两个 BIS 的配置能力,试听频道放低码率解说,主频道放完整节目。
6.2 TV Speaker 与多房间音乐
另一个比较现实的应用是电视伴音转发。电视通过 HDMI ARC 拿到音频,交给 BT2106C 做 Auracast 广播,家里每个人戴一副耳机就能听到电视声音,互不干扰。这个场景本质上是对“半夜看球不吵家人”这种痛点的回应,Auracast 的延迟在这个场景下完全可接受,而且不需要配对、不需要抢连接。
多房间音乐也可以用同一套逻辑:一个模块放在客厅广播,卧室、厨房各放一个接收端设备,不需要复杂的多音箱同步协议,大家都在收听同一个广播源,天然同步。这里的关键是接收端设备要支持自动重新同步和断电恢复广播,否则每次断电都要手动开启,体验会大打折扣。
6.3 我不建议盲目上的场景
任何技术都有边界,Auracast 也不例外。如果你要做高保真、对延迟极敏感的双向音频(比如无线麦克风演唱、游戏语音、直播监听),Auracast 广播模式目前并不合适——单向、广播式、延迟受接收端缓冲影响,这些特质决定了它更适合“一对多的单向收听”场景,而不是“低延迟的双向通话”。
另外,如果目标用户手里的设备普遍不支持 Auracast 接收,你再好的广播源也是空中楼阁。上线前先做用户设备的兼容性普查,比盲目追新技术更务实。
最后再分享一个实际经验:产品化阶段一定要保持对空中包的敬畏,同时准备多个品牌、多种方案、不同上市时间的接收设备做回归。蓝牙音频的兼容性矩阵非常复杂,同一个广播源在不同手机和耳机上的表现差异可能比不同版本固件之间的差异还大。我用 BT2106C 这半年最深的体会是,Auracast 的发射端并不难做,难的是在各种不可控的接收端环境里保持稳定。如果你正在做类似的方向,建议从头就把“接收端兼容性回归”放进每个迭代的测试用例里,这个习惯能帮你省掉大量现场救火的精力。