Android蓝牙协议栈fluoride(七) - 设备管理(bt stack)

前面几篇文章介绍了设备管理对上层的接口和bt profile层的实现,其中涉及到蓝牙开关(初始化)、设备扫描、服务发现、安全管理、功耗管理等等模块,本文将挑选几个模块介绍bt stack层的实现,其他模块(如安全管理)将在后续专门讲述。

使能蓝牙

协议栈中使能蓝牙的入口是BTM_DeviceReset,即打开蓝牙时会复位controller,复位之后会获取controller中的信息,然后将状态上报到上层。
在这里插入图片描述
其中,controller模块和HCI的内容在HCI相关的文章中介绍。

从上至下完整梳理使能蓝牙的流程如下:
在这里插入图片描述

设备扫描

在上层介绍设备管理时包含了设备扫描和服务发现,本文介绍设备扫描,服务发现使用的SDP,在后续介绍。
在stack层中对上提供设备扫描相关的API如下:

// inquiry/inquiry scan/page/page scan设置
tBTM_STATUS BTM_SetInquiryMode(uint8_t mode);
tBTM_STATUS BTM_SetInquiryScanType(uint16_t scan_type);
tBTM_STATUS BTM_SetPageScanType(uint16_t scan_type);
extern void BTM_WritePageTimeout(uint16_t timeout);// 设置/获取本机可被发现及参数(inquiry scan)
tBTM_STATUS BTM_SetDiscoverability(uint16_t inq_mode, uint16_t window, uint16_t interval);
uint16_t BTM_ReadDiscoverability(uint16_t* p_window, uint16_t* p_interval);
// 设置/获取本机可被连接及参数(page scan)
tBTM_STATUS BTM_SetConnectability(uint16_t page_mode, uint16_t window, uint16_t interval);
uint16_t BTM_ReadConnectability(uint16_t* p_window, uint16_t* p_interval);// 扫描周围设备相关(inquiry)
tBTM_STATUS BTM_StartInquiry(tBTM_INQ_PARMS* p_inqparms, tBTM_INQ_RESULTS_CB* p_results_cb, tBTM_CMPL_CB* p_cmpl_cb);
uint16_t BTM_IsInquiryActive(void);
tBTM_STATUS BTM_CancelInquiry(void);
tBTM_STATUS BTM_CancelPeriodicInquiry(void);// EIR相关
tBTM_STATUS BTM_WriteEIR(BT_HDR* p_buff);
bool BTM_HasEirService(const uint32_t* p_eir_uuid, uint16_t uuid16);
void BTM_AddEirService(uint32_t* p_eir_uuid, uint16_t uuid16);
void BTM_RemoveEirService(uint32_t* p_eir_uuid, uint16_t uuid16);
uint8_t BTM_GetEirSupportedServices(uint32_t* p_eir_uuid, uint8_t** p, uint8_t max_num_uuid16, uint8_t* p_num_uuid16);
uint8_t BTM_GetEirUuidList(uint8_t* p_eir, size_t eir_len, uint8_t uuid_size, uint8_t* p_num_uuid, uint8_t* p_uuid_list, uint8_t max_num_uuid);

inquiry和inquiry scan

蓝牙通过inquiry发现周围的设备,进入可[被]发现的设备会一直inquiry scan,它们在特殊的物理信道发起请求和回复响应。
以手机和蓝牙耳机为例:手机扫描周围设备时会一直特定信道发送inquiry,耳机进入配对模式时会一直在特定信道扫描(监听)inquiry,当扫描到inquiry之后会回复inquiry response,手机收到response后就知道扫描到了这台设备。inquiry类型和方式如下:

// 类型
#define BTM_INQ_RESULT_STANDARD 0  // 标准inquiry格式返回结果
#define BTM_INQ_RESULT_WITH_RSSI 1 // 带RSSI的格式
#define BTM_INQ_RESULT_EXTENDED 2 // 带RSSI的结果或扩展查询格式// 方式
#define BTM_GENERAL_INQUIRY 0x01  //通用inquiry,即发现所有可发现的设备
#define BTM_LIMITED_INQUIRY 0x02  // 有限inquiry,即发现一定范围内设置了有限inquiry代码的设备

通用inquiry的交互如下:

有限inquiry的交互如下:
在这里插入图片描述

EIR

EIR是Extended Inquiry Response的缩写,EIR是基本inquiry response外还可以携带更多的信息,即可以在不需要更多通信的情况下获得更多信息,如设备名称、支持的服务等。EIR数据格式如下:
在这里插入图片描述

page和page scan

当获取到另一台蓝牙设备的蓝牙地址后可以发起连接,此时发起连接的设备将在特殊通道发生连接请求包(page),另一台设备处于可连接状态即可监听(page scan)到连接请求,进行后续的通信。

inquiry scan和page scan的类型如下:

#define BTM_SCAN_TYPE_STANDARD 0  //标准扫描,一直扫描窗口内一直处于扫描状态
#define BTM_SCAN_TYPE_INTERLACED 1 //隔行扫描,在扫描窗口内进行两次背靠背扫描,要求扫描间隔必须大于等于扫描窗口的两倍

在标准扫描的情况下,如果相关器在页面扫描期间超过触发阈值,设备应进入第 8.3.3.1 节所述的外设响应子状态。扫描设备也可使用通用隔行扫描。在这种情况下,如果相关器在第一次扫描时未超过触发阈值,则应使用 [CLKN 16-12 + interlace_offset] mod 32 所确定的序列中的相位进行第二次扫描。如果在第二次扫描中相关器超过触发阈值,则设备应进入外设响应子状态,在 Xprp 的计算中使用 [CLKN 16-12 + interlace_offset] mod 32 作为冻结 CLKN*(详见第 2.6.4.3 节)。如果相关器在正常模式下的一次扫描或隔行扫描模式下的第二次扫描中未超过触发阈值,则应返回待机或连接状态。
隔行扫描偏移值范围为 0 至 31。除非不可扫描的插槽模式意味着应使用不同的值,否则应使用 16 值。

状态转化如下:
在这里插入图片描述

从上至下完整梳理使能蓝牙的流程如下:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】构建表达式二叉树和表达式二叉树求值

问题背景 1. 实现一个简单的计算器。通过键盘输入一个包含圆括号、加减乘除等符号组成的算术表达式字符串,输出该算术表达式的值。要求: (1)系统至少能实现加、减、乘、除等运算; (2)利用二叉…

Windows更改远程桌面端口并添加防火墙入站规则

1.运行 快捷键winR组合键,win就是键盘上的windows系统图标键。 2.打开注册表 Regedit,在对话框中输入regedit命令,然后回车 3.打开注册表,输入命令后,会打开系统的注册表,左边是目录栏,右边是…

windows安装sqlserver2008后连接失败问题

刚安装好的sqlserver在安装服务器上,直接使用Windows身份认证登录就报错 未找到或无法访问服务器。请验证实例名称是否正确并且SQL Server已配置为允许远程连接。(provider:命名管道提供程序,error:40 -无法打开到SQLS…

GroupMixFormer:基于Group-Mix注意力的视觉Transformer

文章目录 摘要1、简介2、相关工作2.1、视觉转换器2.2、全面的自注意力建模 3、组混合注意力和GroupMixFormer3.1. 动机:从个体到群体3.2. GMA: 混合组以获得更好的注意力3.3. 架构配置 4、实验4.1、实现细节4.2. 与最先进模型的比较4.3. 消融实验 5、结论 摘要 htt…

使用opencv的Sobel算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题,也是经典的技术难题之一。如何快速、精确地提取图像边缘信息,一直是国内外的研究热点,同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【教程】源代码加密、防泄密软件

​ 什么是代码混淆? 代码混淆 是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。 …

VBA_MF系列技术资料1-242

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于定…

C#科学绘图之scottPlot绘制多个图像

文章目录 示例移除图像图例信号图 scott系列:绘图初步 示例 从名字就能看出,ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点,换言之,每调用一次AddScatter,就可以在图窗中添加一组图像。下面添加两个按钮&a…

CS5565设计资料|CS5565规格书|typec转HDMI 8k60Hz方案

CS556x是一款高性能的Type-C/DisplayPort1.4到HDMI2.1协议转换器,可通过Type-C/ DisplayPort链路接收视频和音频流,并转换为支持TMDS或FRL输出信令的HDMI。DP接收器在4个通道上支持高达8.1Gbps的链路速率。HDMI输出端口可用作TMDS或FRL发射器。FRL发射器…

天猫数据分析(天猫数据查询平台):11月天猫啤酒市场销售数据分析报告

在酒类市场中,被视作“气氛担当”的啤酒,是派对聚会或者自饮场景中的常客,消费人群广泛,如今,啤酒市场已进入存量时代,市场中啤酒的销售也在稳步增长。 鲸参谋数据显示,今年11月份,天…

技术分享 | app测试中常用的Android模拟器

Emulator Emualor 是 Android Studio 自带的模拟器,是官方提供的工具,Android 开发最常使用的就是这一款。 它功能非常齐全,电话本、通话等功能都可正常使用。用户可以使用键盘输入,鼠标点击模拟器按键输入,甚至还可以…

十四、YARN核心架构

1、目标 (1)掌握YARN的运行角色和角色之间的关系 (2)理解使用容器做资源分配和隔离 2、核心架构 (1)和HDFS架构的对比 HDFS架构: YARN架构:(主从模式) &…

医学检验系统LIS源码,C# +.Net+Oracle

LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。  体系结构:Client/Server架构 客户端:WPFWindows Forms 服务端:C…

escapeshellarg参数绕过和注入的问题

escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。 …

pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈

前言 当我们自动化用例写完后,接下来就是如何运行用例,生成报告以及反馈通知了。 如果你们公司已经有jenkins了,那么直接集成到jenkins上构建你的自动化任务是非常方便的。 用例上传git仓库 第一步,将写好的自动化用例&#xf…

保障线程安全性:构建可靠的多线程应用

目录 引言 为什么线程安全性如此重要? 1. 竞态条件(Race Conditions) 2. 死锁(Deadlocks) 3. 数据竞争(Data Races) 4. 内存可见性(Memory Visibility) 面临的挑战…

一张图系列 - “leetcode快速复习“

什么是leetcode? LeetCode是一个在线评测平台,提供大量算法题目,可帮助程序员提高编程和算法能力。它主要提供算法和数据结构相关的练习题,包括各种难度级别的编程题,从简单的算法题到复杂的系统设计问题都有。用户可…

【玩转TableAgent数据智能分析】TableAgent全功能详解及多领域数据分析实践(中)不同领域数据分析实践

3 电影点评数据分析实践 利用本身自带的电影点评数据,来具体看一下TableAgent的分析能力,选择电影点评数据,智能体会自动导入该数据DMSC20000.csv,大小为3.3 MB。在数据信息展示区,就会显示出该数据,并提供…

知识付费平台选择指南:如何找到最适合你的学习平台?

在当今的知识付费市场中,用户面临的选择越来越多,如何从众多知识付费平台中正确选择属于自己的平台呢?下面,我们将为您介绍我有才知识付费平台相比同行的优势,帮助您做出明智的选择。 一、创新的技术架构,…

Java研学-MyBatis框架

一 MyBatis框架 1 框架介绍 框架:对基础代码进行封装并提供相应的API,调用API可省去一些代码的编写,从而提高效率。一个好的框架一定是经过测试,自身的功能已经实现,可以完成特定的功能。 2 MyBatis 框架 MyBatis 框…