5. Bluetooth HFP Source Sample
源码位置: samples/bluetooth/classic/hfp_source 查看源码
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. 示例内容
初始化 Shell 与文件系统
初始化蓝牙协议栈并注册发现回调
获取本地音频播放设备
audio0通过
bt_inquiry扫描目标设备通过
bt_connect <device_name>发起经典蓝牙连接通过
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. 关键配置
配置项 |
说明 |
默认值 |
|---|---|---|
|
启用 Source 模式 |
|
|
启用 HFP AG |
|
|
启用 mSBC 相关链路 |
依配置而定 |
|
启用本地音频播放设备 |
|
5.10.2. 当前实现特点
FRAME_TIME_MS固定为7.5 msHFP 起流后当前协商日志显示为单声道
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 requested和BT audio source started successfully检查本地
audio0设备是否正常初始化
5.12.3. 3. 本地没有播放声音
检查
capture_callback_handler()是否被触发检查
lisa_audio_play_write failed日志确认本地音频硬件连接正常