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

最近一直被 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
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值