【ESP32】HFP/A2DP 共存时,iOS的兼容性问题

博客讲述了在ESP32上实现HFP和A2DP共存时遇到的iOS兼容性问题,包括max_slot更新导致的断开连接和sniff_req问题。通过分析抓包结果,作者找到了问题的解决办法,即避免max_slot更新和在SCO链接期间禁用sniff mode,从而改善了连接稳定性。
摘要由CSDN通过智能技术生成

最近一直被 HFP 和 A2DP 的问题困扰着,不知道为什么和 Android 设备就完美链接,但是和 iOS 的测试就不那么顺畅。

当使用官方的 HFP/A2DP demo 时,使用 ESP32 初始化 HFP 服务并主动连接 iPhone 拨打电话,总是会显示对方设备断开连接的 log 。但是使用 IDF 并配合官方 单 HFP demo 就没有这个问题。

W (41925) BT_RFCOMM: port_rfc_closed RFCOMM connection in state 2 closed: Peer connection failed (res: 16)

版本使用:根据 https://github.com/espressif/esp-adf 的指示,全部使用 default 版本的 ADF 和 IDF 版本。

这个问题搞了我好久,其实并没有找到根本的问题,只是进行了一些配置项对问题进行了规避。从抓包的结果来看,是由于连接建立时,ESP32 发送 max_slot 更新,但是在 SCO 建立之前已经与 iPhone 协商了max_slot = 0x05。所以我认为,当 max_slot 为 最大数值时,并不需要去更新。因为,max_slot 代表的是最大可接受的包长,而非一定要使用的包长。 所以,我首先去掉了 max_slot 更新的操作。

 

更烦人的是,在解决了 max_slot 问题之后,sniff_req 的问题又付出了水面...当时的心情真的是,一波未平,一波又起!!!

 

那我还是从抓包进行分析,当 SCO 链接建立之后的 7s 之内,ESP32 会主动发送 sniff_req 要求进入 sniff mode,这时 iPhone 并不接受 ESP32 sniff_req 的参数,并且重新发送了 sniff_req 给 ESP32。在我的测试中,10 次 有 9 次会进入 LMP 的 Timeout,且在 timeout 情况的抓包来看,ESP32 并没有回复 iPhone 发来的 sniff_req。

从测试的现象来看,ESP32 大概率会丢掉 sniff_req 的回复动作。一方面,是我的测试环境比较复杂,RX 在刚开始建立 SCO 情况下比较忙碌,collision 的概率比较大。所以,我尝试在 SCO 链接有效期间不使能 sniff mode。因为我认为在 SCO 链接期间,电池的消耗并不是最主要矛盾,所以可以减少协议栈的行为。具体的配置方式是,在 

/esp-idf/componnets/bt/host/bluedroid/bta/bta_dm_pm_cfg.c

中 将 HS 的配置表 改成如下:

/* HS : 4 */

{

    (BTA_DM_PM_SNIFF | BTA_DM_PM_PARK), /* allow park & sniff */

    #if (BTM_SSR_INCLUDED == TRUE)

    (BTA_DM_PM_SSR2), /* the SSR entry */

    #endif
    {

    {
  {BTA_DM_PM_SNIFF, 7000 + BTA_DM_PM_SPEC_TO_OFFSET}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */

    {
  {BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */

    {
  {BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */

    {
  {BTA_DM_PM_NO_AC
hfp.pbap.map.a2dp 是一组通信协议的缩写,分别代表了Hands-Free Profile (HFP)、Phone Book Access Profile (PBAP)、Message Access Profile (MAP)和Advanced Audio Distribution Profile (A2DP)。 HFP是一种蓝牙协议,主要用于实现蓝牙设备之间的音频通信。它使得您可以通过蓝牙耳机、车载设备等外部设备无线接听和拨打电话。HFP还支持来电显示、通话控制以及语音识别功能,在驾车等情况下可以提供更加安全和便捷的通话体验。 PBAP用于访问和传输手机通讯录。当设备配对成功后,PBAP可以让您的蓝牙设备直接读取手机中存储的联系人信息,使得您可以通过蓝牙设备轻松查找、拨打通讯录中的号码。 MAP是用于消息的访问和传输的蓝牙协议。它使得您的蓝牙设备可以读取和管理手机中的短信、邮件等消息。通过MAP协议,您可以在蓝牙设备上进行消息通知、查看和回复等操作,方便管理和使用手机上的消息功能。 A2DP是一种蓝牙音频传输协议,使得您可以将手机、电脑等音频源无线连接到蓝牙耳机、车载音响等设备上。通过A2DP,音频数据可以以高质量的方式进行传输,让您可以无需使用有线耳机或扬声器,享受到更加自由和舒适的音乐和通话体验。 综上所述,hfp.pbap.map.a2dp是一组蓝牙通信协议,使得您的设备可以实现无线音频通话、访问和传输通讯录、消息管理以及高质量音频传输等功能。这些协议的使用可以提升您的设备的便捷性和功能性,让您可以更加方便地使用手机上的音频和通信功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值