哈喽大家好,这是该系列博文的第四篇~ 篇~

<<【系列博文索引】快速通道 >>

首先上一个链接: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()
void app_disconnect_all_bt_connections(void) //主动断开所有连接

七、预告

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

BES2300x笔记(4) -- TWS组对与蓝牙配对(Peer or Pair傻傻分不清)相关推荐

  1. BES2300x笔记----TWS组对与蓝牙配对

    https://me.csdn.net/zhanghuaishu0 一.前言 看到有"道友"在评论区留言:对TWS组对.BT配对以及回连流程部分很迷糊,那这第二篇我们就来说说BES ...

  2. BES2300x笔记(6) -- 如何修改蓝牙名称

    哈喽大家好,这是该系列博文的第六篇~ 篇~ <<[系列博文索引]快速通道 >> 一.前言 有时,销售对接的客户需要送样,就想拿仓库现有的产品改下蓝牙名称,然后寄给客户,但咨询过 ...

  3. 正则表达式学习笔记008--字符组简记法2

    正则表达式学习笔记008--字符组简记法2 交流群1:251572072 交流群2:170933152 \s [\t\n\r\f]     \t制表符     \n换行符     \r回车符     ...

  4. 正则表达式学习笔记007--字符组简记法1

    正则表达式学习笔记007--字符组简记法1 交流群1:251572072 交流群2:170933152 字符组简记法 1.对于常用的字符组,正则表达式提供了相应的简记法,能够方便的表示 它们,并让我们 ...

  5. (尚硅谷java零基础教程)学习笔记day7/8-数组

    1.数组的概述 1.1 定义 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 1.2 数组的相关概念 数组名 元素 数组的索引 ...

  6. 蓝牙配对不弹配对框_配对编程在工作场所的好处和陷阱

    蓝牙配对不弹配对框 Pair programming is two programmers working together at one workstation. 结对编程是指两个程序员在一个工作站 ...

  7. 取消蓝牙配对代码_配对代码审查

    取消蓝牙配对代码 I discussed the value of pair programming with friends recently. A lot has been written on ...

  8. 蓝牙配对模式 java_【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码...

    目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备  &  直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...

  9. 【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码

    目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备  &  直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...

  10. 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

最新文章

  1. Rabbit MQ安装配置及常见问题
  2. ubuntu怎么测tcp协议的服务器,Ubuntu利用TCP协议来获取server时间(示例代码)
  3. 会计电算化练习题目(模拟练习8)
  4. SQL语句添加删除修改字段
  5. mysql 查询条件优先级_mysql条件查询and or使用实例及优先级介绍
  6. vue项目中使用mock(一)
  7. 前端学习(3110):react-hello-函数式组件
  8. 作者:韩芳(1987-),女,中国科学院计算机网络信息中心工程师
  9. 从源码角度看Spark on yarn client cluster模式的本质区别
  10. 搜狗入选Fast Company最具创新力公司,智能翻译机表现抢眼
  11. python开发软件的实例-这可能是最好玩的python GUI入门实例!
  12. Hibernate 主键策略
  13. paip.gui控件form窗体的原理实现以及easyui的新建以及编辑实现
  14. HLS:硬件开发软件化
  15. 2022年iOS最新面试(底层基础)问题答案
  16. 使用wagtail搭建cms的安装流程
  17. 古人说的雅事,通常是做什么?
  18. 使用Arduino+L298N控制光驱两项四线步进电机
  19. Kubernetes 健康状态检查liveness和readiness
  20. 使用Bitbucket Cloud学习Git

热门文章

  1. CSAPP Lab2:Bomb Lab
  2. mysql数据库基础:存储过程和函数
  3. 用C语言写一个数字版的3阶魔方
  4. 一起学JAVA线程-JAVA Thread的基础
  5. FANUC机器人示教时遇到奇异点的解决办法
  6. 【原创】2019.10.24模拟赛 嘟嘟噜/天才绅士少女助手克里斯蒂娜/凤凰院凶真
  7. 数值分析(2):线性代数方程组的直接解法
  8. c/c++ 洛谷 P1428 小鱼比可爱
  9. 直播六脉神剑,练好这几招才能行走江湖
  10. 摸爬滚打DirectX11_day_11——三维天空