找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

BES2300x笔记(2) -- TWS组对与蓝牙配对(Peer or Pair傻傻分不清) ... ...

2021-5-6 18:35| 发布者: 后来| 查看: 13207| 评论: 7|原作者: 文化人|来自: CSDN

摘要: 一、前言 看到有“道友”在评论区留言:对TWS组对、BT配对以及回连流程部分很迷糊,那这第二篇我们就来说说BES平台的相关流程和接口。(PS:蓝牙基础部分就不再赘述了,网上有很多资料可以参考) ... ...
哈喽大家好,这是该系列博文的第二篇~ 篇~ 

<<【系列博文索引】快速通道 >>
首先上一个链接:TWS耳机火遍华强北!为何干不过苹果AirPods?
一、前言
看到有“道友”在评论区留言:对TWS组对、BT配对以及回连流程部分很迷糊,那这第二篇我们就来说说BES平台的相关流程和接口。(PS:蓝牙基础部分就不再赘述了,网上有很多资料可以参考)

二、Peer or Pair
1、组对(Peer)
根据以往高通平台上的经验,左右耳互为对方的peer device,因为相对手机而言,左右耳的level是一样的,这一点在relay模式下还不太确切,但是监听模式下就非常形象了;
(苹果的snoop、高通的mirror、恒玄的ibrt、络达的MCsync,其实都是类似监听的技术,另外还有高通的TWS+和华为的双通道是属于左右双声道传输技术,需要手机端同时支持,所以手机品牌厂商可基于此构建自家生态)
为了便于区分,我们暂且把左右耳之间建立连接的过程,简单地称为组对。

2、配对(Pair)
当耳机开启inquiry scan和page scan时,可以被手机搜索到并建立连接,我们暂且把耳机与手机之间建立连接的过程,简单地称为配对。

三、开机流程

上电开机后,程序根据pwron_case进入APP_POWERON_CASE_NORMAL模式,这里会使用nv_record_env_get(&nvrecord_env)接口读取flash,然后根据ibrt_mode.mode进行判断;

if(ibrt_mode.mode==IBRT_UNKNOW),会进入左右耳组对的流程;
否则,会通过接口app_ibrt_ui_event_entry(IBRT_FETCH_OUT_EVENT)传入出盒事件,触发如下状态机;
开盖、出盒、入盒、关盖,必须按照这个步骤去调用图中的接口,否则执行的动作可能不会生效,因为底层状态机会做保护。

三、TWS组对
1、首次使用时,第一次开机左右耳均需要调用app_ibrt_enter_limited_mode()接口进入BTIF_BAM_LIMITED_ACCESSIBLE模式,之后哪只耳机调用app_start_tws_serching_direactly()接口,哪只耳机便作为主耳去搜索从耳组对;
2、主耳搜索到从耳后,会判断蓝牙地址前三个字节和蓝牙名称是否一致,如果一致则会启动组对连接,并且主耳会使用从耳的蓝牙地址。这样对外展示的就是从耳的蓝牙地址,对于手机来说只有一个蓝牙设备;
3、主从耳组对成功后会将角色信息nv_role写入flash中,同时主耳进入Pairing mode
(BTIF_BAM_GENERAL_ACCESSIBLE),可以被手机搜索连接。
4、手机连接成功后,从耳创建IBRT连接;

四、与手机蓝牙配对
1、首次使用
基于第三点,我们知道,首次使用左右耳组对成功之后,主耳会进入Pairing mode,可以被手机搜索连接,这一点我们清楚了,接着往下看。

2、正常使用
耳机在正常使用过程中,有时可能需要更换连接的手机,那如何让耳机重新进入Pairing mode,被其他的手机进行搜索连接呢?这里我们提供两种思路:

思路1:
osDelay(100);
hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT);
hal_sw_bootmode_set(HAL_SW_BOOTMODE_REBOOT_ENTER_PAIRING);
hal_cmu_sys_reboot();
开机后:
if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_REBOOT_ENTER_PAIRING) 
{
    hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT_ENTER_PAIRING);
app_ibrt_if_enter_pairing_after_tws_connected();
}


思路2:
if(app_tws_is_freeman_mode())
{
        if (app_tws_ibrt_mobile_link_connected())
        {
            app_tws_ibrt_disconnect_mobile();
        }
        app_ibrt_ui_event_entry(IBRT_FREEMAN_PAIRING_EVENT);
}
else if(app_tws_is_master_mode())
{
        if (app_tws_ibrt_tws_link_connected() && app_tws_ibrt_mobile_link_connected())
        {
            app_tws_ibrt_disconnect_mobile();
        }
        app_ibrt_ui_event_entry(IBRT_TWS_PAIRING_EVENT);
}

五、重新组对
在生产环节或者在用户手中,可能会出现需要重新组对的情况,比如有一只耳机坏了或者丢了,那么如何让已经组过对的耳机重新进行组对呢?
我们的思路是:清除之前的组对信息,也就是mode,然后复位,进入首次使用的流程;

代码流程如下:
struct nvrecord_env_t *nvrecord_env;
    nv_record_env_get(&nvrecord_env);
    nvrecord_env->ibrt_mode.mode = IBRT_UNKNOW;

    nv_record_env_set(nvrecord_env);
    nv_record_flash_flush();

    osDelay(100);
    hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT);
    hal_cmu_sys_reboot();

六、常用接口
1、TWS连接
btif_besaud_is_connected()
app_tws_ibrt_tws_link_connected()

2、TWS主耳
app_tws_ibrt_mobile_link_connected() //与手机连接

3、TWS从耳
app_tws_ibrt_slave_ibrt_link_connected() //ibrt slave
app_ibrt_ui_ibrt_connected()

4、单耳模式
app_ibrt_ui_get_freeman_enable() //实际测试在单耳模式或者TWS单个使用时,角色都是master,这个值都为0??
app_ibrt_if_enter_freeman_pairing()

5、flash读写
nv_record_env_get() //读数据

nv_record_env_set() //写数据
nv_record_flash_flush()

6、手机类型
btif_dip_check_is_ios_device()
btif_dip_check_is_ios_by_vend_id()

7、其他
app_ibrt_nvrecord_delete_all_mobile_record() //清除配对记录
app_ibrt_remove_history_paired_device() //清除peer组队记录
app_ibrt_if_event_entry() //触发底层状态机
app_ibrt_if_enter_pairing_after_tws_connected()

七、预告
后续篇章会陆续介绍ANC通道配置、EQ功能、OTA升级和主从切换等等;
3

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (3 人)

发表评论

最新评论

引用 吉永良 2021-9-29 14:36
学习了,粗略了解了组对的过程!
引用 in0501 2021-7-12 15:29
顶,这些都是学习的好资料 ,希望 楼主继续分享学习 资料
引用 zlj613 2021-6-17 19:49
收费的,看不了
引用 后来 2021-5-13 18:38
排版上有些问题,但是又无法修改了。
请移步这里:https://blog.csdn.net/zhanghuaishu0/article/details/108684583,查看清晰版本及系列内容。

查看全部评论(7)

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-23 17:55 , Processed in 0.126268 second(s), 31 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部