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

2023-11-15

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

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

首先上一个链接: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,被其他的手机进行搜索连接呢?这里我们提供两种思路:

思路1osDelay(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();
   	}


思路2if(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升级和主从切换等等;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • bugku where is flag 4杂项

    1 base64解码 下载压缩包下来解压打开 发现里面是base64加密 在kali中解码 去掉所有换行符 用winhex打开 发现十六进制的奇数位正好可以构成zip的文件头 504b 2 脚本编写 写个python脚本提取奇数位 str1
  • RHEL7 中配置 IPv6 练习

    试验环境 RHCE Server 虚拟机 以配置好 视频中配套的所有环境 包含View Server View Desktop 等 视频中的示例一般是在 server0 主机上做 登陆命令为 ssh X root server0 重置 se
  • Java教程:Javadoc(文档注释)详解

    本篇文章由 泉州SEO www 234yp com 整理发布 Java教程 www 234yp com Article 198092 html 谢谢合作 Java教程Java 支持 3 种注释 分别是单行注释 多行注释和文档注释 文档注释以
  • js基础语句

    一 if else 条件判断语句 var num 1 if num 1 console log 壹 else if num 2 console log 贰 else num 3 console log 参 输出 壹 二 switch cas
  • Dockerfile自定义镜像 - 基于 java:8-alpine 镜像,将一个Java项目构建为镜像

    目录 一 前置知识 1 镜像结构 2 Dockerfile是什么 二 自定义一个 java 项目镜像 1 创建一个空目录 在这个空目录中创建一个文件 命名为 DockerFile 最后将 java 项目打包成 jar 包 放到这个目录中 2

随机推荐

  • Python 绘画excel分组柱状图(懒人学习)

    1 excel案例如截图 很简单大家自己照着做一个就可以了 2 完整代码如下 import pandas as pd import matplotlib pyplot as plt students pd read excel H Pyth
  • Python视觉摄像头检测有趣项目(一)(重点)

    转载自就是这个七 https blog csdn net qq 42633819 article details 81191308 利用python tensorflow opencv实现人脸识别 对于环境安装就是在Win10上对于Tens
  • C# 实现预览dwg文件完整源代码(无需autocad环境)

    using System using System Drawing using System Collections using System ComponentModel using System Windows Forms using
  • C++ 多态与虚函数

    多态性与虚函数 多态性 虚函数 多态性 多态性是面向对象程序设计的关键技术之一 若程序设计语言不支持多态性 不能称为面向对象的语言 利用多态性技术 可以调用同一个函数名的函数 实现完全不同的功能 在C 中有两种多态性 编译时的多态 通过函数
  • Qt 5中文乱码问题完美解决方案

    乱码问题概述 使用Qt的时候 时常会遇到中文乱码问题 qDebug打印日志乱码 或者Widget界面乱码等等 原因呢 大多是因为使用MSVC编译器问题导致 而Qt 自带的MinGW一般不会出现乱码问题 核心原因呢 是因为编码问题 即UTF
  • 入职字节外包一个月,我还是选择了离职!

    有一种打工人的羡慕 叫做 大厂 真是年少不知大厂香 错把青春插稻秧 但是 在深圳有一群比大厂员工更庞大的群体 他们顶着大厂的 名 做着大厂的工作 还可以享受大厂的伙食 却没有大厂的 命 他们就是大厂的 外包员工 什么都做了 和什么都没做其实
  • Tomcat闪退的解决方法

    Tomcat闪退 在Tomcat的bin目录中的startup bat中 添加 set JAVA HOME E Program Files Java jdk 8 set CATALINA HOME E Users a eclipse Tom
  • 威胁快报

    一 背景 近日阿里云安全团队发现了一起利用多个流行漏洞传播的蠕虫事件 黑客首先利用ThinkPHP远程命令执行等多个热门漏洞控制大量主机 并将其中一台 肉鸡 作为蠕虫脚本的下载源 其余受控主机下载并运行此蠕虫脚本后 继续进行大规模漏洞扫描和
  • Vue2.0创建一个新项目

    Vue2 0创建一个新项目 一 安装脚手架 一切的一切都是需要提前安装好node哦 不会安装和配置的可以看 Node初次安装配置 个人博客 Node初次安装配置 CSDN win R输入cmd 打开终端 在终端输入 npm install
  • 判断一个整数是否是回文数

    问题 输入一个整数 10位以内 也可自己改用更多位 需要修改类型 判断是否是回文数 include
  • 关于计算机的小故事案例,小故事分镜头脚本范例两分钟4399奶块电脑

    PublicSubFocusMe ctlNameAsControl WithctlName SelStart 0 SelLength Len ctlName EndWith EndSub Nowaddacalltothissubroutin
  • zigzag扫描的matlab实现

    zigzag扫描的matlab实现 zigzag的扫描方式如下图所示 以 4 4 为例 下图是matlab中数组各位置的索引值 用横纵坐标来分析 2 3 4 5 6 7 8 1 1 1 2 3 1 4 1 4 2 3 4 4 4 2 1 2
  • 局域网、以太网、无线局域网学习笔记

    还有一年选择院校 加油 文章目录 局域网基本概念和体系结构 局域网 局域网拓扑结构 局域网的传输介质 局域网介质访问控制方法 局域网的分类 IEEE 802 MAC子层和LC子层 小结思维导图 以太网 以太网概述 以太网提供无连接 不可靠的
  • 通过按钮动态改变 el-dialog 的宽度

    1 按钮
  • Ubuntu不能进入NTFS分区(error mounting)

    Ubuntu不能进入NTFS分区 error mounting 装了Windows10与Ubuntu双系统后 在Ubuntu系统下想进入Windows的某个NTFS分区 点击时却出现下面错误 也可能在挂载移动硬盘时出现如下错误 Error
  • 金蝶KIS专业版二次开发探索

    1 前言 作为软件服务 有时候我们接受的任务是一个全新的 开发团队内没有人有相关经验的这么一个任务 这时候无论对于我们本身还是对于团队来说 都面临着一个新的挑战 如何在没有做过此类任务情况下凭借一些基本经验完成任务 顺利实现给客户的交付 我
  • 智能合约漏洞——短地址攻击

    基础知识 严格意义来说 短地址 参数攻击并不算智能合约的漏洞 这是一个应用上的接口数据处理问题 在介绍过得ERC20模板智能合约 其中有个transfer函数 其定义如下 function transfer address to uint2
  • WinForm 编程中控件的使用小技巧(splitter实现窗口分区域,改变Button的形状)

    一 Splitter 控件的主要作用就是将窗口分区并可以调节区域大小 比如 我想将窗口分为左右两个区域 并可以调节两个区域所占的比例 操作流程如下 1 新建一个窗口 Form1 2 在Form1中添加一个Panel控件Panel1 并将其D
  • IPv6的基本配置

    p拓扑图 AR1 interface GigabitEthernet0 0 0 ipv6 enable ipv6 address 2000 1 64 ipv6 route static 3000 64 2000 2 静态路由 AR2 int
  • BES2300x笔记(4) -- TWS组对与蓝牙配对(Peer or Pair傻傻分不清)

    哈喽大家好 这是该系列博文的第四篇 篇 lt lt 系列博文索引 快速通道 gt gt 首先上一个链接 TWS耳机火遍华强北 为何干不过苹果AirPods 一 前言 看到有 道友 在评论区留言 对TWS组对 BT配对以及回连流程部分很迷糊