5. Bluetooth HFP Source Sample

5.1. 功能说明

本示例演示了如何使用 ARCS SDK 的经典蓝牙 HFP 能力建立语音链路,并通过 BT Audio Framework 在本地与远端设备之间传输语音数据。

示例实现了以下功能:

  • 初始化 Lisa Shell、Lisa Bluetooth 和 BT Audio Framework

  • 注册经典蓝牙发现回调,支持扫描并按名称连接远端设备

  • 通过 bt_audio_start 打开 HFP SCO 全双工音频链路

  • 将本地预置 PCM 数据编码后发送到远端设备

  • 将远端回传的语音数据写入本地 lisa_audio 播放设备

  • 支持 AT 透传命令直接调试底层蓝牙 AT 指令

5.2. 硬件连接

  • ARCS 开发板(支持蓝牙经典功能)

  • 支持 HFP 的手机或耳机设备

  • 本地音频播放设备(用于播放接收到的语音数据)

5.3. 软件依赖

  • FreeRTOS

  • Lisa Bluetooth 组件

  • Lisa Bluetooth Audio Framework

  • Lisa Shell

  • Lisa Audio Device

5.4. 示例内容

  1. 初始化 Shell 与文件系统

  2. 初始化蓝牙协议栈并注册发现回调

  3. 获取本地音频播放设备 audio0

  4. 通过 bt_inquiry 扫描目标设备

  5. 通过 bt_connect <device_name> 发起经典蓝牙连接

  6. 通过 bt_audio_start 建立 HFP 音频链路并启动音频任务

5.5. 编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在 SDK 根目录执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

5.6. 烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

5.7. 预期输出

5.7.1. 1. 启动日志

设备启动后可以看到类似如下日志:

DBG:hci_aud_access_init,0
DBG:a2dp_init, init_type:0
DBG:bt_stack_init,state:0
DBG:a2dp_init, init_type:1
DBG:bt_stack_init,state:1
DBG:bt reset cmp: 20:23:03:64:74:57
DBG:ble enable cmp, sta:0
DBG:bt classic enable cmp, status:0
DBG:a2dp en, role:0
DBG:hfp en, role:1,feats:0x22
INF:a2dp enable cmp!
DBG:hfp enable cmp,status:0x0
I/BT_AUDIO_SESSION Audio session manager initialized
I/app-bt          Virtual BT interface initialized successfully

5.7.2. 2. 扫描设备

串口执行:

bt_inquiry

命令会立即返回,扫描结果异步打印:

letter:/$ bt_inquiry
Return: 1, 0x00000001
DBG:bt disc cre cmp,sta:0x00,0
DBG:gap start cmp,sta:0x00,type:4, actv:0,actv:0
I/app-bt Discovered device: E0:5D:3B:CC:EE:E8, RSSI=-46, Name=soundcore Liberty 4
I/app-bt Discovered device: 48:C5:24:BE:C7:60, RSSI=-69, Name=真我GT Neo5 SE

5.7.3. 3. 连接设备

如果设备名包含空格,命令里需要加引号,例如:

bt_connect "soundcore Liberty 4"

连接日志示例:

I/app-bt  Connecting to device: soundcore Liberty 4
I/LISA_BT Trying to connect to device: soundcore Liberty 4
I/LISA_BT Device list count: 5
I/LISA_BT Device[0]: soundcore Liberty 4
I/LISA_BT addr: E0:5D:3B:CC:EE:E8
I/LISA_BT Device found! Connecting...
DBG:BT classic connected
DBG:hfp connect cmp,conidx:6, type:0, status:0x0
INF:a2dp connect cmp! conidx=6, status=0x0
INF:avrcp connect cmp!,conidx:0x6, status:0x0

5.7.4. 4. 启动 HFP 音频

连接成功后,执行:

bt_audio_start

日志示例:

I/BT_VINTF        Profile opening: type=1, state=OPENING
I/BT_AUDIO_ADAPTER Starting audio stream for profile: 2 (conidx=6)
I/BT_AUDIO_ADAPTER HFP SCO connection requested
I/app-bt          Virtual interface opened successfully
DBG:hfp start! conidx:0x6,codec:0,status:0x0
I/BT_AUDIO_ADAPTER AUD_OS_START_EVT: type=17, ch=1, sample=16000
I/BT_AUDIO_SESSION Session created: direction=1, codec=4, passthrough=0
I/BT_AUDIO_SESSION Session created: direction=0, codec=4, passthrough=0
I/BT_AUDIO_SESSION Playback decode mode: created decode task
I/BT_VINTF        Downlink session created for HFP full-duplex
I/lisa_audio_play Play configured: rate=16000, gain=-10/-10 dB, buffers=3×256
I/lisa_audio_play Play started
I/app-bt          BT audio source started successfully
I/app-bt          Audio source task started

5.8. 使用方法

5.8.1. 1. 启动设备

设备上电后会自动初始化 Shell、蓝牙协议栈、虚拟音频接口和本地音频设备句柄。

5.8.2. 2. 扫描设备

在串口控制台输入:

bt_inquiry

说明:

  • bt_inquiry 的 shell 返回值不表示扫描结束,它只表示扫描命令已经成功下发。

  • 设备发现结果会在后续异步打印。

5.8.3. 3. 连接设备

可以按名称连接:

bt_connect My_Phone

如果设备名中包含空格,请使用引号:

bt_connect "soundcore Liberty 4"

5.8.4. 4. 启动 HFP 音频

连接成功后,执行:

bt_audio_start

当前实现会:

  • 打开 VINTF_PROFILE_CAPTURE

  • 请求建立 HFP SCO 链路

  • 创建上行编码会话和下行解码会话

  • 根据协商到的音频格式配置本地播放设备

  • 创建音频发送任务,将本地 PCM 数据送入虚拟接口

  • 通过 capture_callback_handler() 播放远端回传的语音数据

5.8.5. 5. 停止 HFP 音频

bt_audio_stop

5.9. Shell 命令

  • bt_inquiry:扫描周围经典蓝牙设备。

  • bt_connect <device_name>:按设备名连接远端设备。

  • bt_audio_start:打开 HFP 音频链路并启动本地音频任务。

  • bt_audio_stop:停止本地音频任务并关闭虚拟接口。

  • AT:进入 AT 透传模式,或直接执行单行 AT 命令。

5.10. 配置选项

5.10.1. 关键配置

配置项

说明

默认值

CONFIG_BT_CLASSIC_ROLE_SOURCE

启用 Source 模式

y

CONFIG_LISA_BLUETOOTH_CLASSIC_HFP_AG

启用 HFP AG

y

CONFIG_BT_AUDIO_CODEC_MSBC

启用 mSBC 相关链路

依配置而定

CONFIG_LISA_AUDIO_DEVICE

启用本地音频播放设备

y

5.10.2. 当前实现特点

  • FRAME_TIME_MS 固定为 7.5 ms

  • HFP 起流后当前协商日志显示为单声道 16000 Hz

  • 上下行都使用 mSBC 编解码链路

  • 本地播放设备按 16000 Hz-10/-10 dB 增益启动

5.11. 代码架构

5.11.1. 数据流程

bt_inquiry / bt_connect
    ↓
建立经典蓝牙连接
    ↓
bt_audio_start
    ↓
打开 VINTF_PROFILE_CAPTURE
    ↓
请求 HFP SCO 音频链路
    ↓
创建上行编码会话和下行解码会话
    ↓
open_complete_handler 配置本地 lisa_audio 播放设备
    ↓
audio_source_task 持续写入本地 PCM 数据到虚拟接口
    ↓
远端 HFP 语音数据通过 capture_callback_handler 回放到本地音频设备

5.11.2. 关键点

  • cmd_bt_inquiry():调用 lisa_bluetooth_inquiry_start() 扫描目标设备。

  • cmd_bt_connect():按设备名连接远端设备。

  • cmd_bt_audio_start():打开 HFP 音频链路。

  • open_complete_handler():按协商结果配置本地播放设备并启动发送任务。

  • capture_callback_handler():播放接收到的远端语音数据。

5.12. 故障排除

5.12.1. 1. 扫描不到设备

  • 确认对端设备蓝牙已打开并处于可发现状态

  • 重新执行 bt_inquiry

  • 检查发现回调日志是否有输出

5.12.2. 2. 已连接但没有语音

  • 确认已经执行 bt_audio_start

  • 检查日志中是否出现 HFP SCO connection requestedBT audio source started successfully

  • 检查本地 audio0 设备是否正常初始化

5.12.3. 3. 本地没有播放声音

  • 检查 capture_callback_handler() 是否被触发

  • 检查 lisa_audio_play_write failed 日志

  • 确认本地音频硬件连接正常