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属于定…

单片机Freertos入门(二)任务调度的介绍

简介: FreeRTOS支持的任务调度方法有抢占式、协作式、时间片轮转,下面分别来讲解。 1.抢占式调度 抢占式调度,是最高优先级的任务一旦就绪,总能得到CPU的执行权。 高优先级运行时候,低优先级不运行,等待…

【Oracle】PL/SQL语法、存储过程,触发器

一、Oracle数据类型 Orcle数据类型说明类比MySQL数据类型字符型CHAR固定长度的字符类型CHAR字符型VARCHAR2可变长度的字符类型VARCHAR字符型LONG大文本类型,最大2G数值型NUMBER数值类型,整数小数都可以,number(5)表示长度5的整数&#xff0c…

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

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

excel在扩展屏幕中显示有时候显示黑屏,这种怎么处理?

在使用Excel时,如果在扩展屏幕中出现黑屏或其他显示问题,可以尝试以下方法来解决: 1. 更新显卡驱动程序: 确保你的计算机的显卡驱动程序是最新版本。过时的或不兼容的显卡驱动可能导致显示问题。 2. 调整分辨率和屏幕比例&#…

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 开发最常使用的就是这一款。 它功能非常齐全,电话本、通话等功能都可正常使用。用户可以使用键盘输入,鼠标点击模拟器按键输入,甚至还可以…

MySql数据库的初步认识(数据库学习—— 一)

什么是数据库 数据库(Database) 是按照数据结构来组织、存储和管理数据的仓库。它是数据管理的有效技术, 是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映客 观事物间的本质联…

物联网网关

物联网网关是连接物联网设备和互联网的重要桥梁。 它负责将物联网设备采集到的数据进行处理、存储和转发,使其能够与云端或其它设备进行通信。 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互。 物联网网关功能 数据采集:物联网网关可以从…

十四、YARN核心架构

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

一个简单的cmake模板(C++)

链接:小黑屋1024 / Python GitCode #对cmake版本的要求,此处不低于3.16 cmake_minimum_required(VERSION 3.16)#项目名称:此处为test project(test)#设置编译生成产物输出路径 ##可执行文件exe SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURC…

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

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

escapeshellarg参数绕过和注入的问题

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