BT A2DP Sharing 示例

源码路径:example/bt/a2dp_sharing

支持的平台

  • eh-lb525,只支持连接一个耳机做音频转发,不支持通话转发

  • eh-lb563,只支持连接一个耳机做音频转发,不支持通话转发

  • eh-lb567,只支持连接一个耳机做音频转发,不支持通话转发

  • eh-lb58x

  • eh-lb57x

  • sf32lb52-lcd系列

  • sf32lb56-lcd系列,只支持连接一个耳机做音频转发,不支持通话转发

  • sf32lb58-lcd系列

概述

本例程演示 A2DP 音乐分享(sharing)和 HFP 通话中继(relay)功能:设备作为中继在同时连接手机和耳机的情况下,将手机播放的音乐分享到耳机播放,同时也能将耳机端的音乐控制命令转发给手机实现音乐控制。对于支持 AVRCP 绝对音量的耳机,例程还会将手机设置的媒体音量同步到耳机。

同时,本例程支持 HFP HF 和 HFP AG 双角色:设备连接手机时作为 HFP HF,连接蓝牙耳机时作为 HFP AG。当手机和耳机均连接到中继设备后,可以将手机侧的通话状态、来电号码、信号/电量等信息同步给耳机,并将耳机侧发起的拨号、接听、挂断、DTMF、通话音量调节等 HFP 控制请求转发给手机。

例程的使用

例程启动后会默认使能蓝牙,蓝牙名称为‘sifli_a2dp_transfor’,可以接受手机连接或主动发起对耳机的连接。手机侧用于 A2DP sink/HFP HF 连接,耳机侧用于 A2DP source/HFP AG 连接。

  1. 搜索蓝牙设备 通过命令 a2dp_trans inquiry start 来搜索耳机类蓝牙设备,该命令只会上报搜到的 COD 的 Major Class 为 0x000400 的设备(Audio device)。 搜索到的设备会以 log “device [%s] searched” 和 “device COD is [%d], addr is xx:xx:xx:xx:xx:xx” 的形式打印。

  2. 连接蓝牙设备 通过命令 a2dp_trans conn [addr] 来进行连接,addr 将上面搜到设备的地址(xx:xx:xx:xx:xx:xx)打印值复制即可。 如果已知晓耳机类蓝牙设备地址,可以不用进行搜索蓝牙设备,直接连接即可。

  3. 音乐分享

    1. 单独连上手机的情况下播放音乐,中继设备不会出声音。

    2. 单独连上耳机的情况下播放音乐,耳机设备不会出声音。

    3. 同时连上手机和耳机的情况下播放音乐,耳机设备会出声音,中继设备不会出声音。

    4. 已经在分享音乐的情况下,断开耳机,中继设备不会出声音。

    5. 已经在分享音乐的情况下,断开手机,耳机设备不会出声音。

    6. 已经在分享音乐的情况下,断开耳机后再重新连接上耳机,耳机设备会出声音。

    7. 中继设备默认不会回连耳机和手机设备。

    8. 音量同步:同时连接支持绝对音量的手机和支持 AVRCP 绝对音量的耳机时,手机调节媒体音量后,中继设备会将音量值同步到耳机。

  4. HFP 通话中继

    1. 手机和耳机均连接到中继设备后,手机侧来电、拨号、通话状态变化会同步到耳机侧。

    2. 耳机侧执行接听、挂断、拨号、发送 DTMF 按键、调节通话音量等操作时,中继设备会将对应 HFP 控制请求转发给手机。

    3. 手机侧的运营商服务状态、信号强度、电池电量、漫游状态、来电号码、本机号码和当前通话信息等 HFP 指示信息会缓存并回复给耳机。

    4. 当手机侧 SCO 通话音频建立后,中继设备会尝试建立耳机侧 SCO 音频链路,并通过 CONFIG_CFG_BT_VOICE_RELAY 进行通话语音中继;任一侧 SCO 断开后会同步关闭对应语音中继链路。

    5. 典型连接成功 log 为 “HFP HF connected” 和 “HFP AG connected”;断开时分别打印 “HFP HF disconnected” 和 “HFP AG disconnected”。

硬件需求

运行该例程前,需要准备:

  • 一块本例程支持的开发板(支持的平台)。

  • 一个支持 HFP 和 A2DP 的手机。

  • 一个蓝牙耳机。

编译和烧录

切换到例程project目录,运行scons命令执行编译:

> scons --board=eh-lb525 -j32

切换到例程project/build_xx目录,运行uart_download.bat,按提示选择端口即可进行下载:

$ ./uart_download.bat

     Uart Download

please input the serial port num:5

关于编译、下载的详细步骤,请参考快速入门的相关介绍。

例程的预期结果

例程启动后:

  1. 在不连接蓝牙的情况播放内置音乐。

  2. 可以搜索耳机类蓝牙设备,并在连接后播放内置音乐。

  3. 同时连接手机和耳机后,手机播放的音乐可以通过中继设备分享到耳机播放。

  4. 手机和耳机均建立HFP连接后,手机侧通话状态和号码信息可以同步到耳机,耳机侧接听、挂断、拨号、DTMF和通话音量调节等控制可以转发到手机。

  5. HFP连接成功时串口打印 “HFP HF connected” 和 “HFP AG connected”;通话状态变化时会打印 “the remote phone call_status”、“callsetup_status”、“callheld_status”等log。

技术说明

AVRCP角色配置

在A2DP音乐共享场景中,中继设备需要根据连接的对端设备类型动态设置AVRCP角色:

AVRCP角色定义

  • AVRCP TG (Target):音源设备,播放音乐的一方,被控制方

  • AVRCP CT (Controller):控制设备,发送控制命令的一方

角色动态设置的必要性

BT_NOTIFY_AVRCP_PROFILE_CONNECTED 事件处理中,代码根据A2DP角色动态设置AVRCP角色:

avrcp_role = (inst->con[con_idx].cfg == AV_AUDIO_SRC) ? AVRCP_TG : AVRCP_CT;
  • 当设备作为 A2DP Source(连接耳机)时,设置为 AVRCP TG

  • 当设备作为 A2DP Sink(连接手机)时,设置为 AVRCP CT

如果错误地将所有连接固定为CT角色,会导致以下问题:

  1. 与耳机的AVRCP连接无法正确协商绝对音量功能

  2. 耳机的音量变化注册请求得不到响应

  3. 音量同步失败,返回 BT_ERROR_UNSUPPORTED 错误

  4. 手机调节音量后,无法转发到耳机

异常诊断

参考文档

更新记录

版本

日期

发布说明

0.0.1

05/2026

初始版本