基于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
  • 通过iptables 封QQ 各种bt软件的方法

    1楼 发表于 2008 7 1 17 49 最近老大要求封qq 而且是封部分人使用 本来打算封腾讯登陆服务器的 但是无法封bt工具 找了一下资料 以下部分为转载 流程 打上layer 7补丁 升级内核至2 6 19 7 升级iptables
  • 低功耗蓝牙(BLE)

    https my oschina net tingzi blog 215008 低功耗蓝牙包括的术语及概念 如上图所示 使用低功耗蓝牙可以包括多个Profile 一个Profile中有多个Service 一个Service中有多个Chara
  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • 微信小程序之蓝牙 BLE 踩坑记录

    前言 前段时间接手了一个微信小程序的开发 主要使用了小程序在今年 3 月开放的蓝牙 API 此过程踩坑无数 特此记录一下跳坑过程 顺便开了另一个相关的小项目 欢迎 start 和 fork BLE MiniProgram API简介 微信小
  • ESP32 LVGL8.1 实现太空人显示(29)

    文章目录 一 ESP32 LVGL工程配置 1 1从库中下载LVGL代码 1 2配置适合ESP32 液晶屏 1 3编译下载测试 二 GIF图片处理 2 1下载gif图片 2 2将gif图片按照帧率导出成图片 2 3导出的图片背景处理 2 4
  • 零基础开发蓝牙设备

    前言 现在几乎每个人的手机都具备蓝牙功能 所以如果你的硬件设备也具备蓝牙通信功能 那么便可以很容易和手机建立通信 从而具备IOT物联网属性 但我们也知道蓝牙Ble 目前已发展到5 2版本 协议极其复杂 并不是所有人都需要去详细了解它 我们更
  • Ble Mesh的Generic Model ID&Opcode

    MODEL ID 标准的为16为 自定义的Vendor Model ID为32位 Model Group Model Name SIG Model ID Generic Generic OnOff Server 0x1000 Generic
  • STM32 BlueNRG-1低功耗介绍,包含CPU堆栈恢复和外设恢复

    概述 在消费类电子产品形态中 通常用锂电池 纽扣电池 干电池等设备供电 需要现有供电情况下能连续使用几个月或者1年 而这些供电电源通常只有20 40mAh左右的电 要达到要求的运行时间 通常要求平均功耗在uA级别 芯片正常工作下的工作级别基
  • 蓝牙简单配对(Simple Pairing)协议及代码流程简述

    DESCRIPTION 在BT2 1及之后版本 蓝牙协议有在传统的密码配对 PIN Code Pairing 之外 新增一种简单配对 Simple Pairing 的方式 这种新的配对方式操作更为简单 安全性也更强 目前市面上大部分蓝牙设备
  • 蓝牙设备上电提示Failed to set power on: org.bluez.Error.Blocked

    NEW Controller 74 2F 68 6A 37 44 moon 0 default NEW Device 00 07 61 76 8E 78 Logitech diNovo Edge Agent registered bluet
  • macbook bluetooth is not available (蓝牙不可用)

    新的MacBookPro Retina 一直没用过蓝牙 今天碰巧带了蓝牙耳机 连接的时候发现蓝牙的图标上面多了一个波浪线 显示 is not available google了几种方法 1 删除 Library Preferences 并重
  • 基于snooplog分析蓝牙连接过程,进一步学习蓝牙协议栈

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

    蓝牙之十八 bluetooth pair 在蓝牙核心规范2 1之后 蓝牙配对除了传统的PIN Code Pairing方式外 新增了Secure Simple Pairing配对方式 根据核心规范4 2 简单配对主要有两种目的 蓝牙配对过程
  • 蓝牙之十七-bluedroid scan流程

    蓝牙扫描过程是指扫描蓝牙设备 app层 这里有两张截图 第一张图显示的是安卓设置setting菜单栏中有Bluetooth这一项 点进去以后 点击右上角显示如下的截图 其中Refresh就是刷新设备列表 也就会扫描设备信息 上图显示的三个菜
  • 蓝牙(二)蓝牙搜索、配对、连接

    1 搜索 从上一节我们可以知道 蓝牙状态发生了改变 并发生了回调 咱们就从回调开始 DevicePickerFragment java 用于蓝牙设置界面的蓝牙配置和管理 Override public void onBluetoothSta
  • 红米ac2100 刷openwrt以及刷回记录

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

    通话专题HFP协议学习总结 一 配置和角色 二 HFP的连接 2 1服务级连接建立 2 1 1 服务发现和RFCOMM的连接 2 1 2 支持的特性交换 2 1 3 codec协商 2 1 4 HF指示器 2 1 5 AG指示器 2 1 6
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被

随机推荐

  • 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 总之 研发过程中会遇到很多奇奇怪怪的问题 我们无法通过现象去分析原因 也不可能再过一遍代码吧 这时候需要再某些代码