Android HCI日志分析案例1

news2025/2/26 18:00:36

案例1--蓝牙扫描设备过程分析

应用层发起搜索蓝牙设备,Android 官方提供的蓝牙扫描方式有三种,分别如下:

  • BluetoothAdapter.startDiscovery(); //可以扫描经典蓝牙和BLE两种。
  • BluetoothAdapter.startLeScan();//扫描低功耗蓝牙,在api21中已弃用,不过还是可以使用
  • BluetoothLeScanner.startScan();//新的BLE扫描方法

当应用层调用startDiscovery()时,Host会通过HCI发送一个 Inquiry HCI Command给 Controller。接下来我们会通过分析HCI log,来学习Inquiry的流程。在分析HCI log前,我们先来学习下HCI Command数据包的结构。

1.1 HCI Command 数据包结构

HCI Command数据包结构定义在蓝牙核心协议规范Core_v5.3.pdf中。
HCI Command数据包格式如下,开头的Opcode是区分不同类型的命令的唯一标识,Opcode由OpCode Group Field (OGF) 和 OpCode Command Field (OCF)组成。根据OGF的值,可以将HCI commands进行分类。OpCode 的计算公式为:** OpCode = OGF << 6 + OCF 。有了OpCode计算的方式,我们就可以通过OpCode过滤**HCI log里面的指定类型的HCI Command。

HCI Command packet

OpCode 计算方法

1.2 过滤 Inquiry Command

Inquiry Command 是 Link Control command 类型的command,通过查询 Bluetooth Core Specification 中的 Vol4-> Part E-> 7.1Link Control Command小节,可知,Link Control Command的 OCF值为 0x0001.

Bluetooth Core Specification V5.3

Inquiry Command

因此,Inquiry Command 的Opcode 为 0x0001 << 6 + 0x01 = 0x0401,通过0x0401就确定某条command为 Inquiry Command,该命令的名称为 HCI_Inquiry。

ComProbe Protocol Analysis System 支持过滤功能,通过设置filter可以过滤出 Opcode为 0x0401的log,设置方法如图:

过滤HCI_Inquiry

1.3 扫描过程分析

1.发送Inquiry请求

  • Host发送 Command: HCI_Inquiry

应用层要进行蓝牙设备扫描,Host先发一条 HCI_Inquiry的Command 通知 Controller

HOST发送HCI_Inquiry

  • Controller回复HCI Event

Controller在收到HCI_Inquiry这条Command后,会回复一条Command Status的HCI Event,来表示Controller执行HCI_Inquiry后的状态,即Status: Success。并且这两条HCI log的Frame标号是挨着的,HCI_Inquiry的帧号是127,Command Status的帧号是128。

Controller:Command status

2.扫描结果

扫描完成后,Controller会发送Event: HCI Extended Inquiry Result。以列表中搜索到的Jabra Classic v0.5.3为例,它的HCI Extended Inquiry Result数据包中会包含它的设备名称、它所支持的Service的UUID,和设备类型:Wearable Headset device,因此,Jabra Classic v0.5.3的Icon是一个耳机的图标。

扫描结果

HCI日志详情

以上就是大致的蓝牙搜索到列表显示的流程分析。

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

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

相关文章

深入理解同源限制:网络安全的守护者(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

超简单的node脚本,将xlsx文件转化为json

开发场景&#xff0c;在一个官网中&#xff0c;官网的设计非常简单&#xff0c;就是一个纯静态的页面&#xff0c;全网站仅一个地方调一下接口&#xff0c;发一下用户填写的信息到运营同学的邮箱&#xff0c;这些数据不会记录在数据库&#xff0c;我需要做一个这样的下拉框。 但…

python使用记录

1、VSCode添加多个python解释器 只需要将对应的python.exe的目录&#xff0c;添加到系统环境变量的Path中即可&#xff0c;VSCode会自动识别及添加 2、pip 使用 pip常用命令和一些坑 查看已安装库的版本号 pip show 库名称 通过git 仓库安装第三方库 pip install git仓库地…

SQL Server 2016(分离和附加数据库)

1、实验环境。 基于上一个实验《SQL Server&#xff08;创建数据库&#xff09;》 2、需求描述。 class数据库的数据文件和事务日志文件都位于C:\db_class目录下。现在需要把class数据库的数据文件和事务日志文件分开存放&#xff0c;数据文件class.mdf存放于原位置&#xff0…

DQN原理及PyTorch实现【强化学习】

NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 欢迎来到我们的强化学习系列的第三部分。 在上两篇博客中&#xff0c;我们介绍了强化学习中…

【Linux】命令行参数

文章目录 前言一、C语言main函数的参数二、环境变量总结 前言 我们在Linux命令行输入命令的时候&#xff0c;一般都会跟上一些参数选项&#xff0c;比如l命令&#xff0c;ls -a -l。以前我总是觉得这是理所当然的&#xff0c;没深究其本质究竟是什么&#xff0c;今天才终于知道…

高压配电室智能运维

高压配电室智能运维是指通过运用先进的物联网、大数据、云计算等技术&#xff0c;对高压配电室进行智能化、远程化的运行维护&#xff0c;实现高压配电室的安全、高效、经济运行。以下是高压配电室智能运维的主要功能和优势&#xff1a; 实时监测&#xff1a;通过传感器和监测设…

分页助手入门以及小bug,报sql语法错误

导入坐标 5版本以上的分页助手 可以不用手动指定数据库语言&#xff0c;它会自动识别 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.2</version> </dependency&g…

vue中中的动画组件使用及如何在vue中使用animate.css

“< Transition >” 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-show 所触…

OpenCV技术应用(6)— 暖色滤镜和冷色滤镜

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成暖色滤镜和冷色滤镜&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.暖色滤镜 &#x1f680;3.冷色滤…

JVM运行时数据区域

文章目录 内存结构程序计数器&#xff08;寄存器&#xff09;虚拟机栈局部变量表两类异常状况 线程运行诊断 本地方法栈堆方法区运行时常量池串池&#xff08;StringTable&#xff09;字符串的拼接串池的位置StringTable垃圾回收StringTable性能调优 直接内存 内存结构 程序计…

关于标准库中的vector - (涉及迭代器失效,深浅拷贝,构造函数,内置类型构造函数,匿名对象)

目录 关于vector vector中的常见接口 vector常见接口的实现 迭代器失效 关于深浅拷贝 关于vector 关于vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元…

【ArcGIS Pro微课1000例】0040:ArcGIS Pro创建北极点、南极点

文章目录 一、创建北极点图层二、创建北极点三、不同投影系下北极点的位置一、创建北极点图层 选择一个数据库,在上面右键→新建→要素类。 输入名称:北极点。 空间参考:WGS 1984 点击创建。 二、创建北极点 在编辑选项卡下,点击【创建】。 在创建要素窗口中,点击北极点…

docker容器中创建非root用户

简介 用 docker 也有一段时间了&#xff0c;一直在 docker 容器中使用 root 用户肆意操作。直到部署 stable diffusion webui 我才发现无法使用 root 用户运行它&#xff0c;于是才幡然醒悟&#xff1a;是时候搞个非 root 用户了。 我使用的 docker 镜像文件是 centos:centos…

FL Studio Producer Edition21.0.3中文版安装详解(附下载链接)

fl studio 21中文版是Image-Line公司继20版本之后更新的水果音乐制作软件&#xff0c;很多用户不太理解&#xff0c;为什么新版本不叫fl studio 21或fl studio2024&#xff0c;非得直接跳到21.2版本&#xff0c;其实该版本是为了纪念该公司22周年&#xff0c;所以该版本也是推出…

(C++)盛水最多的容器--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

pgsql分别获取日期中的年、月、日,并处理前台展示有小数点的情况

使用extract()函数 select extract(YEAR from 需要处理的日期字段) from tablename; --获取年份 select extract(MONTH from 需要处理的日期字段) from tablename; --获取月份 select extract(DAY from 需要处理的日期字段) from tablename; --获取日 实际应用&#xff1a;…

05:2440----代码重定义

目录 一&#xff1a;引入 1&#xff1a;基本概念 2&#xff1a;NAND启动 3&#xff1a;NOR启动 4:变量 5&#xff1a;实验证明 A:代码makefile B:NOR启动 C:NAND启动 D:内存空间 二&#xff1a;链接脚本 1:NOR 2:NAND 3:解决方法 A:尝试解决 B:方法一解决 A:简…

clickhouse的向量化执行

背景 clickhouse快的很大一部分原因来源于数据的向量化执行&#xff0c;本文就来看一下向量化执行和正常标量执行的区别 SIMD的向量化执行 从上图可知&#xff0c;clickhouse通过SIMD指令可以做到一个cpu周期操作两个向量的运算操作&#xff0c;比起普通的cpu指令效率提高了N…

一些ab命令

1.ab简介 ab是apache自带的压力测试工具&#xff0c;是apachebench命令的缩写。ab非常实用&#xff0c;它不仅可以对apache服务器进行网站访问压力测试&#xff0c;也可以对或其它类型的服务器如nginx、tomcat、IIS等进行压力测试。 ab的原理&#xff1a;ab命令会创建多个并发…