基于snooplog分析蓝牙连接过程,进一步学习蓝牙协议栈

2023-11-12

一:什么是BT snoop log

首先问题:
1.为什么远端发来的消息没有收到?
2.为什么搜索不到设备
3.为什么连不上?
4.。。。。。。
总之,研发过程中会遇到很多奇奇怪怪的问题,我们无法通过现象去分析原因,也不可能再过一遍代码吧,这时候需要再某些代码节点设置信息打印(万能的printf),当程序代码走到这一步,要打印个信息出来告知:老子执行到这里了;到我这里执行不下去,出错了。。。

这些就是log,回到正题,除了开发自定义的打印信息,Android蓝牙中有一个很重要的debug方式就是btsnoop.log,这个log是蓝牙协议栈自己生成的,只列出了协议栈收发的消息,如果是其他的原因如丢包,涉及空口,则需要sniff log来分析,具体大家自行看下Ellisys的抓包分析

这个log记录的是host和controller的通信内容,也就是HCI层面(下面再讲)的东西,不涉及到其他层
Host:就相当与上层的应用层,协议栈
Controller:就相当于底层的芯片部分了
所以这部分的log就是类似:上面的APP要做什么事情比如相机要打开摄像头,他要跟底层的通信,告诉下面的硬件,然后硬件答复OK,这时候摄像头就打开了
–Are you OK?
–I’m fine thanks!and you

**

二:怎么抓取snoop log

**
Android手机进入开发者选项,打开蓝牙HCI日志,就会生成log,操作下蓝牙配对连接、放歌通话,log会持续打印,生成一份snooplog,一般mtk芯片的手机都放在根目录下的mtklog文件夹里面,高通的就不太好找,如果都找不到,可以用以下命令
adb shell cat /etc/bluetooth/bt_stack.conf
就能找到btsnoop_hci.log/btsnoop_hci.caf的保存路径
在这里插入图片描述

三:分析log

1.工具
(1)Wireshark
下载:https://www.wireshark.org/download.html
(2)Frontline 的Capture File Viewer
下载:https://www.fte.com/products/default.aspx
偏好Frontline

2.导入文件
在这里插入图片描述
等待一下加载完成,点击第二给放大镜图标
然后就进入了如图:
在这里插入图片描述
左边这部分就是封包的内容信息,右边就是各种包,准确讲应该叫协议帧
工具还区分了各种协议
在这里插入图片描述
3.蓝牙协议栈(先看一下图)
在这里插入图片描述
4.连接过程
这是大致的连接过程图
在这里插入图片描述
(0)初始化信息
Host和Controller两者是相互沟通,一来一回的通信
在这里插入图片描述
Host——>Controller:Command,指令,
Controller——>Host:Event,事件,

可以理解为上面领导下达命令,底层打工人响应命令做事情

当我们开启蓝牙,HCI会重置,然后做一些初始化操作,如:
HCI_Read_Buffer_Size读取ACL和SCO链路可传输数据包的大小
Read_Local_Version_Information 读取HCI的版本,制造商
HCI_Read_BD_ADDR 读取mac地址
HCI_Read_Local_Supported_Commands 读取本地设备支持的指令

在这里插入图片描述
(1)扫描
两个扫描模式:
Inquiry Scan:让蓝牙芯片进入发现周围蓝牙设备的模式,它的返回值是周围蓝牙设备的信号
Page Scan:让设备进入可被连接的状态,能够响应其他设备的连接请求(这个没有对应的HCI指令,有个page_timeout连接超时)
在这里插入图片描述
在这里插入图片描述
(2)创建连接
HCI_Connection_Request:创建连接,由Host发给controller,让它连接指定的设备
然后,Controller响应状态:成功/失败;
在这里插入图片描述

(3)交换Feature
然后双方的Host要知道对方都支持什么功能,这时候就要交换双方feature信息,获取对方的feature,比如Role switch、Power control、RSSI with Inquiry Results等:
在这里插入图片描述
在这里插入图片描述
(4)链路创建
交换完成,上层Host的L2CAP已经指定了具体的链路类型,Controller让LMP创建一个链路且后面要维护这个链路,默认初始初始状态是ACL链路,通常用来放音乐的(媒体音频);SCO是用来通话的
在这里插入图片描述
然后Baseband基带主要做数模转换(学过数模的大家应该知道这一科很容易挂科)

然后就是RF发射信号了

然后就到远端设备的Controller的RF接收到信号,也是一步步上传,最后同意/拒接/不理睬。。。

回到我方阵容:
当对面同意了,我方收到一个LMP_accepted的包,然后LMP就给到HCI层,发给Host端,Host端决定同意,则连接链路建立
在这里插入图片描述
(5)角色转换
如果这个时候对方要从slaver成为master,这个时候双方就要有个角色转换的过程,我方就会收到一个Role_Change,切换主从设备

(6)授权
接下来,就是要不要授权,比如我们看到的有些设备要输入pin码,要双方确认。那么这时候,Controller就会各自的Host请求link key,如果Host回复的是,没有公共的link key,那Controller就只能请求生成私有linkkey,接着就是交换link key,双方保存共有link key,这就是配对过程;
—如果双方已经保存了对方的link key,那么下次连接就不用再配对了,当Controller第一次请求link key,Host就会直接答复共有link key来授权(这里如果出现linkey丢失,就会出现断连,重连时需要重新配对)

授权成功,Master就会发一个加密请求,Slaver同意,那么这个点对点的连接加密成功
在这里插入图片描述
最后,双发互发Steup_complete,各自Controller将完成状态发送回上层Host,至此,连接完成,可以开始传输数据

(7)SDP请求支持服务信息
然后,把Profile也加入进来,上面的物理链路建立后,SDP这个东西,他要知道对方有什么服务,SDP就请求L2CAP指定一个针对SDP的Connection,对面回应,她说她可以播放立体音频(a2dp v1.0.0)、可以接听挂断电话(hfp v1.3.0)、可以暂停播放上下曲(avrcp v2.3.0)。。。当然,对方的SDP也会跟我方请求交换服务信息
在这里插入图片描述

五、回顾

在这里插入图片描述
事实上,两个设备间的通信其实是建立再LMP层面上的通信,因为的双方的通信链路就是通过LMP来建立并管理的(sniff log显示更全面):
在这里插入图片描述

六、建立SCO链路

基带规范定义了两种链路类型:面向连接的同步链路(SCO)和面向无连接异步链路(ACL)。SCO链路主要是用来做语音通话用的

1.SCO和上面的默认的ACL有什么区别?
SCO (Synchronous Connection Oriented):
首先解释一下什么是同步面向连接:蓝牙网络中在主站和次站之间建立的一种物理链路,举个栗子,比如A给打B电话,需要进行三次握手:
1.请求(A要向B发送请求)
2.应答(B向A回应例如没问题,你现在可以与我通话)
3.连接(现在正式建立A与B的连接就可以通话了)
面向连接保证了信道的独占,保证了通信的安全与效率,但是也降低了信道的利用率,适合避免时延比数据完整性更为重要的应用,这种类型的通道在每个方向上都以均匀的间隔时间分配固定的时槽
所以,这种链路一般用于实时语音通话

ACL(Asynchronous Connection Less):
同样解释一下什么是异步无连接,就是传输的每个分组数据的处理都独立于其他的分组,大家不会相互阻塞,举个栗子,比如A给B发微信,A不会管B会不会收到,也不会管B会不会应答他,A只管发送
面向无连接可以增强信道的利用效率但是不可靠,一般用于分组数据传输

2.分组数据传输
分组数据传输:蓝牙支持电路和分组交换,数据是以分组的形式在信道中传输,并使用流控制来避免分组丢失和拥塞,以确保分组包数据正确传输,简单的说就是数据是一组一组的传输过去的
电路交换:主要是时分交换,它是将通信的时间划分为许多独立的时间间隙(时隙),每个时隙都对应一个子信道,通过时隙的交换,实现时隙所承载的数据的传输
分组交换:也叫包交换,它将数据划分成多个更小的等长数据段,在每个数据段的前面加上必要的控制信息作为数据段的首部,每个带有首部的数据段就构成了一个分组。首部指明了该分组发送的地址,当交换机收到分组之后,将根据首部中的地址信息将分组转发到目的地
SCO属于电路交换,数据包主要是语音信息,,而ACL属于分组交换,数据包主要是媒体音频数据
ACL的分组包支持重传,而SCO不支持重传,SCO包没有CRC校验码,ACL的方式可以根据丢包信息(分组交换方式)做到数据重传

3.SCO链路建立
回到正题:SCO的建立
在这里插入图片描述
跟ACL的差不多,一来一回的沟通形式,只是要注意的是,两者的通信的差异,上面两个栗子,SCO需要应答,而ACL不需要,并且只能在ACL连接建立后才能建立SCO,想一下为什么?
–SCO是的建立是基于HFP的建立而建立的,而HFP本身是ACL链路,SCO依赖与HFP协议中的编解码协商,协商完成双方确认后才能建立SCO通信
–建立sco链路需要的交互的指令是通过acl来完成的,sco链路的参数需要通过acl去跟对方确认
–SCO要对方应答,没应答之前发过去的参数等数据,需要经过acl链路传过去确认

另外,L2CAP规范仅定义ACL链路而不支持 SCO链路。SCO不会经过L2CAP,所以,我们看到的蓝牙协议栈会发现这个:他会直接从基带支持出来,当然,会经过LMP(这个经典图不够完善啊)
在这里插入图片描述

七、Profile服务执行过程

最后,顺便将Profile通信也串起来
当我们使用了一个profile的服务,蓝牙是怎么一步一步下发下去,从host的每一个协议,一直到controller,然后再到对端的controller、host

这里,我们就要划分一下Profile,比如HFP、OPP、PBAP这些跟手机语音、network相关的是RFCOMM(串口仿真协议)上的,通信时要经过RFCOMM,而A2DP、AVRCP这些不会走RFCOMM,会直接跟L2CAP通信
所以RFCOMM又是什么鬼?
RFCOMM是为兼容传统的串口应用(服务),同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议
在这里插入图片描述
例如HFP(Hands-Free Profile),字面意思就是电话免提,设备支持这样的一个服务,HFP是属于RFCOMM上面的一个AT指令协议(实际上他是一个指令类型),通过下发指令来操作。假如我定义三个指令,提示通话AT+CALLCOMING=State,1为有来电,0为没有来电;控制接听挂断AT+CALLCTR=Control,1为接听,0为挂断;确认OK
当手机端来电时,向远端发送:AT+CALLCOMING=1
当远端收到该指示之后,如果接听电话,则发送:AT+CALLCTR=1
当手机端接收控制指令,并回复:OK

HFP定义了两个角色:
音频网关AG (Audio Gate)
免提组件HF (Hands Free)
从字面意思都很好理解,音频网关,就是管语音输入端的,免提就是远端控制咯
从上面的图可以看到,指令下发后会先经过RFCOMM,然后到L2CAP,从log中我们也可以看到,另外,HFP是属于ACL数据包,并不是SCO

在这里插入图片描述

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

基于snooplog分析蓝牙连接过程,进一步学习蓝牙协议栈 的相关文章

  • 蓝牙之九-AT命令

    AT命令用于HF协议 该命令使参考3GPP 27 007协议 以下是HFP规范 每个命令行只有一个命令 AG侧默认不回显命令 AG使用冗长的格式返回结果 以下字符将被用于AT命令和返回结果格式中
  • 蓝牙AVRCP协议解析

    在这里讨论蓝牙的AVRCP协议 要理解AVRCP 需要先了解AVCTP 我们分两个部分来进行 1 AVCTP协议 2 AVRCP协议 下面先来看AVRCp协议 一 概述 1 定义 AVCTP Audio Video Control Tran
  • JDY-19蓝牙模块介绍及主、从机调试演示

    1 关于JDY 19蓝牙模块 1 产品简介 JDY 19透传模块是基于蓝牙4 2协议标准 工作频段为2 4GHZ范围 调制方式为GFSK 最大发射功率为4db 最大发射距离40米 采用进口原装芯片设计 支持用户通过AT命令修改设备名 波特率
  • 使用蓝牙耳机听群晖ds218play中的音乐(audio station)

    缘起 有时需要欣赏nas中的音乐而又不影响家人 有什么方法呢 思路 研究了一下 发现新版的群晖dms支持蓝牙usb蓝牙适配器 可以使用audio station播放 蓝牙耳机收听 步骤 1 购买CSR USB蓝牙适配器 2 插入ds218p
  • Android 蓝牙开发(六)hfp连接

    转载请注明出处 http blog csdn net vnanyesheshou article details 71106622 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛
  • 【低功耗蓝牙】① 蓝牙广播数据格式分析

    摘要 本文章主要讲解了蓝牙的发展史 蓝牙信号 蓝牙广播数据的格式 最后使用ESP32芯片MicroPython固件给出了蓝牙广播的具体代码 是蓝牙初学者很好的参考资料 也可以参考下我在B站的蓝牙视频教程 ESP32教程 第二章 低功耗蓝牙B
  • C/C++实现协程及原理(详细完整版)-架构师篇

    一 协程 Coroutine 简介 协程 又称微线程 纤程 英文名Coroutine 协程的概念很早就提出来了 但直到最近几年才在某些语言 如Lua 中得到广泛应用 子程序 或者称为函数 在所有语言中都是层级调用 比如A调用B B在执行过程
  • sctp 编程接口指南

    SCTP 套接字接口 当 socket 调用为 IPPROTO SCTP 创建套接字时 它会调用特定于 SCTP 的套接字创建例程 针对 SCTP 套接字执行的套接字调用会自动调用相应的 SCTP 套接字例程 在一对一套接字中 每个套接字都
  • STM32+HC-05蓝牙模块学习与使用

    HC 05蓝牙串口通信 HC05模块是一款高性能主从一体蓝牙串口模块 是一种集成蓝牙功能的PCBA板 用于短距离无线通信 十分方便 从某宝商家那里可以看到 蓝牙可以使用多种方法使用 这里我使用的是蓝牙主机连接 所以我们这里需要准备的器件 两
  • BLE MESH组网(五)配置BLE MESH

    BLE MESH 五 配置BLE MESH 前言 概述 配置协议 供应程序 信标 邀请 交换公钥 前言 2017 年 5 月 全球最臭名昭著的勒索软件 WannaCry 在全球范围内积极攻击计算机 劫持用户数据索要赎金 这次攻击影响了 15
  • BES2300x笔记----TWS组对与蓝牙配对

    https me csdn net zhanghuaishu0 一 前言 看到有 道友 在评论区留言 对TWS组对 BT配对以及回连流程部分很迷糊 那这第二篇我们就来说说BES平台的相关流程和接口 PS 蓝牙基础部分就不再赘述了 网上有很多
  • 【平衡小车制作】(一)硬件原理图讲解(超详解)

    大家好 我是小政 之后的一系列文章我将介绍我玩平衡小车的过程以及遇到的一些问题 将这些内容记录下来分享给大家 也让大家少走一些弯路 接下来我将从硬件框架选择 软件编程 PID算法 PID调参 蓝牙遥控这五个部分向大家讲解平衡小车的制作过程
  • 蓝牙解析(part7):BLE的连接

    转自Wowo大神的http www wowotech net bluetooth ble connection html 1 前言 了解蓝牙的人都知道 在经典蓝牙中 保持连接 Connection 是一个相当消耗资源 power和带宽 的过
  • Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备 如果你还没阅读过 建议先看看上一篇文章Android蓝牙开发教程 二 连接蓝牙设备 在上一篇文章中 无论是自动连接还是被动连接 连接成功后 都是将获取到的BluetoothSocket交由连接
  • 红米ac2100 刷openwrt以及刷回记录

    redmiac2100 刷机 参考 手动升级漏洞固件 https wwx lanzoux com i6iqxhqp98f 或者百度网盘链接 https pan baidu com s 1H355Ym9p TLrVOux2w2b7Q 提取码
  • 蓝牙协议规范--L2CAP

    L2CAP 分析 记住一点 软件和硬件分开理解 数据经由物理通道交互 上层通道由各层协议打通 L2CAP 全称为逻辑链路控制与适配协议 Logical Link Control and Adaptation Protocol 位于基带层之上
  • 蓝牙之十三-HFPclient JNI层

    JNI到app JAVA
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构

    什么是蓝牙 在开启基于蓝牙Spec v5 2的学习前 我们先了解下什么是蓝牙 蓝牙在我们日常生活中又存在哪些实际应用呢 蓝牙无线技术是一种短距离无线通信系统 其核心特性主要是以下三点 robustness 鲁棒性 抗干扰能力强 Low po
  • android bluetooth UUID蓝牙查询表

    UUID是 Universally Unique Identifier 的简称 通用唯一识别码的意思 对于蓝牙设备 每个服务都有通用 独立 唯一的UUID与之对应 也就是说 在同一时间 同一地点 不可能有两个相同的UUID标识的不同服务 以

随机推荐

  • CVPR2022 多目标跟踪(MOT)汇总-补充篇

    为该文章的后续补充https blog csdn net qq 34919792 article details 124343166 七 Multi Object Tracking Meets Moving UAV 作者 Shuai Liu
  • openwrt开启dnsmasq-full替换默认dnsmasq

    因为要用到dnsmasq的ipset功能 所以需要安装dnsmasq full 方法如下 1 进入openwrt目录 配置 make meconfig 在base system里面 2 取消原来的dnsmasq 选中dnsmasq full
  • 【STM32】详解RTC实时时钟的概念和配置&示例代码

    一 什么是RTC RTC Real time Clock 实时时钟 本质上是一个支持BCD编码的定时器 计数器 主电源断电后能够由电池供电 使其时钟跳转依然正常 二 STM32F4芯片内的RTC功能 日历时钟 时分秒 年月日 星期 两个闹钟
  • NBS-Predict:基于脑网络的机器学习预测

    文章来源于微信公众号 茗创科技 欢迎有兴趣的朋友搜索关注 导读 大脑的图模型作为研究跨尺度和跨物种的大脑功能和结构连接的框架具有巨大的潜力 基于网络的统计 NBS 是对大脑图进行统计推断的著名工具 它将基于团簇水平的置换检验和连通分量的图论
  • ST-LINK/V2驱动下载与安装

    1 下载 ST LINKV2仿真器 正点原子资料下载中心 1 0 0 文档 openedv com 点击上面链接到正点原子就可以下载 如下图所示 2 安装 1 将ST LINK连接到电脑 在设备管理器中可以看到是没有通用串行设备 说明电脑没
  • Arthas使用方法

    1 简介 Arthas 是Alibaba开源的Java诊断工具 安装在系统所在服务器 可以帮助开发人员或者运维人员查找问题 分析性能 bug追踪 下载路径 https arthas aliyun com arthas boot jar 2
  • 功能视图的组成

    功能视图是构建联邦学习系统所需功能的技术中立的视图 功能视图描述了支持联邦学习活动所必需功能的分布 定义了功能之间的依赖关系 功能视图涵盖的联邦学习内容如图 包括 功能组件 功能层 跨层功能 功能组件是参与某一活动所需的 能实现的功能构件
  • 与OpenAI的30 天

    30 天 我计划在 GitHub 上测试开源 Ai 项目 并学习如何自己构建一个项目 这些帖子会很短 重点是了解您可以使用 Ai 创造什么以及需要准备什么 图像是使用midjourney生成的 我一直在收集由像你我这样的开发人员创建的 30
  • react-从0到1新建react项目

    目录 1 脚手架创建项目 2 分析目录 3 动态写入值 编辑 4 引入组件 编辑 5 组件传值 6 控制组件传值的类型 类型校验 7 组件插槽 8 函数组件和类组件 9 添加事件 10 引入state 在页面上响应式改变值 编辑 11 子组
  • 【C语言】C语言的495个问题

    文章目录 1 声明和初始化 基本类型 1 1 各类型区别 1 2 为什么不精确定义标准类型的大小 1 3 因为C没有精确定义标准类型大小 那么用typedef定义int16和int32是否能解决问题呢 1 4 新64位机上64位类型是什么样
  • android下m、mm、mmm编译命令的使用

    通过查看android源码目录下的build envsetup sh文件 可知 m Makes from the top of the tree mm Builds all of the modules in the current dir
  • C#编程基础(万字详解,这一篇就够了)

    C 及其开发环境简介 C 概述 C 的编程功能 C 与 Net的关系 Net C C 的集成开发环境 Windows上编写C 程序 Linux Mac OS上编写C 程序 运行第一个HelloWorld程序 C 基本语法 程序实例 C 基本
  • java mail 添加附件以及邮件中穿插图片方法

    部分代码 创建邮件中的附件 param filepath 附件的路径 return 生成附件的对象 throws Exception 测试 filepath e 测试 tomcat png e盘下的tomcat图片 public stati
  • 基本的垃圾回收算法总结

    Java虚拟机中的垃圾回收机制的是虚拟机的灵魂所在 下面介绍下虚拟机中的主要回收算法 引用计数法 实现 对于实例化的一个对象O 只要有任何一个其他的对象引用O O的引用计数器就加一 当引用失效的情况下 引用计数器减一 优点 实现简单 缺点
  • 全国各大城市的经纬度表,留着以后做查询库用

    安徽省合肥的经纬度北纬31 52东经117 17 安徽省安庆的经纬度北纬30 31东经117 02 安徽省蚌埠的经纬度北纬32 56东经117 21 安徽省亳州的经纬度北纬33 52东经115 47 安徽省巢湖的经纬度北纬31 36东经11
  • css 卡片翻转效果实现

    直接贴代码
  • Vue 引入高德地图 vue-amap

    一 在高德开发平台 获取Key 已有可跳过 高德开发者平台 链接地址 1 控制台 我的应用 创建应用 添加key 创建应用 新建应用 选择web端 JS平台 last 到这里的 key 就有了 还得到了一个安全密钥 二 引入vue amap
  • 5G应用标志着移动互联网新时代真正到来

    5G网络普及后很可能实现已经多次被我们所畅想的万物互联 通过网络把家用电视 冰箱 洗衣机 空调等连接起来 再通过一个软件来进行控制 5G超高的网速 超低的延迟将会使无人驾驶 无人机作业 远程医疗技术等步入成熟阶段 因此 5G的应用标志着移动
  • TypeScript 在 vue 中的使用

    本文主要介绍 TypeScript 在 vue 中的使用 还有一些j注释起来的 js 代码做对照 参考链接 合成 API 的 TypeScript vue3中配合使用TS 还需要额外安装一个vscode插件 Typescript Vue P
  • 基于snooplog分析蓝牙连接过程,进一步学习蓝牙协议栈

    一 什么是BT snoop log 首先问题 1 为什么远端发来的消息没有收到 2 为什么搜索不到设备 3 为什么连不上 4 总之 研发过程中会遇到很多奇奇怪怪的问题 我们无法通过现象去分析原因 也不可能再过一遍代码吧 这时候需要再某些代码