蓝牙开发那些事儿(1)——从抓包数据开始
从今天起,会开一个新的专栏。面向初学者试着讲讲蓝牙,网上好像有很多讲解移植蓝牙协议栈btstack的,但是都表示移植好了,对蓝牙协议还是一知半解,网上的那些讲蓝牙协议的,大多都是粘贴来粘贴去,没有深入,对初学者很不友好。
我想找一个新的角度,试着去帮助初学者入门,尝试一下,如果效果好,能帮助到其他人,那么还是有动力坚持写下去的。
一般网上讲协议栈的,都是分层去讲,先来看一下网上找到的这张协议栈的图
这个是bluelet协议栈的框图,看上去很晕是不是,对初学者很不友好。
这里可以稍微解释一下,在transport layer以下,是controller的部分,controller可以是一个蓝牙模块,那么transport层就根据这个蓝牙模块有什么接口,串口还是usb口等等来具体实现,比如说插在电脑上的usb 蓝牙dongle,他的transport就是usb的,比如说以前市场上用得很多的,rda5876蓝牙芯片,他的transport层就是uart的。
controller也可以是一个内嵌在芯片里的基带,这样transport layer就是一个虚拟的连接层。所谓移植协议,大部分工作,就是在这个transport layer。
看下面的Chipset,各家的芯片包括csr、高通、博通、ti等等,接口都各不相同,即使同样是串口,也存在H2,H4,H5等差别,这个驱动是需要去写的。
然后,各家芯片在初始化的时候,需要配置寄存器,这个配置的文件叫做pskey,一般是通过各家蓝牙厂家自定义的hci命令写入蓝牙芯片的,这个也需要另外写驱动的。
比如说,串口的初始波特率是115200,这个波特率显然是不足以支撑EDR的2.1Mbps速率的,各家芯片一般也是有专用的命令去配置新的波特率,一般需要921600才能满足需求。
Transport层以上,看上去五花八门,其实蓝牙的核心只有两层,HCI和L2CAP。
HCI是HOST协议栈和controller沟通的桥梁。
L2CAP是蓝牙数据链路层协议,所以上层的应用都必须经过L2CAP,这个下文会展开。
再上层的协议一般我们称之为profile,profile用中文比较难翻译,一般我们认为是一种应用,比如说最常用的也是我们以后介绍的重点,a2dp协议,就是蓝牙音箱的主要应用。
比如说SPP,就是传输文件所需要的profile,这里插一句,苹果公司比较恶心,苹果手机的SPP是封闭的,想使用SPP服务是必须额外配置Mfi芯片的。
不过现在有了BLE,基本都用BLE传输数据了,SPP有点鸡肋。
HFP\HSP是免提电话协议。
这里面其实任意一个点拿出来都可以大讲特讲,比如说HCI,在蓝牙core spec里,一共就有1000来页:
大量的数据格式、标准,如果没玩过蓝牙的人,会看得云里雾里。
所以我希望换一个视角,我们从数据的角度出发,从代码的角度出发,去看一次经典蓝牙连接的全过程,可能结合实例去理解,对于初学者来说更容易一点。
这里的数据是指的hcilog,一般来说研究通信,空中包很重要,但是抓包设备贵啊,而且hcilog一般情况下也就够用了,为什么呢?看一下架构图就明白了:
蓝牙协议栈被hci分成了Host和Controller两部分,狭义上的协议栈是指的Host, 其实Controller也有一部分协议栈的,包括LC、LMP等等。
Controller就是蓝牙模块,最终会操作到射频的硬件寄存器等部分,还包括LMP、LC层等偏底层的协议,这个一般我们是不用管的,厂家提供的模块都封装好了的。
所以Host中上层profile所需要发送或者接收的包都是通过HCI接口和controller交互,你可以把hci理解为快递的自提点,Host需要发送的包放到自提点,剩下的controller什么时候发,controller会根据一个链路策略在合适的时机发送给peer端,同样的,controller收到peer端的包裹后也会通过hci接口发给Host。(HCI ACL data包)
所以空中包大多数通过hci接口都是能查看到的,除了少部分LMP包看不到,但是关系不大,后面会讲到。
HCILOG的取得还是比较容易的,Btstack是直接可以抓取hcilog的,运行BTStack程序时,会生成hci_dump.pklg文件,可以使用WireShark打开此文件。
具体的代码可以参考hci_dump_packetlogger_setup_header,其中是把数据格式做了一些转换的,同时printf_timestamp可以把时间戳附着在数据包里。
我们在电脑上插一个蓝牙dongle,然后跑一下btstack,生成的hci_dump.pklg打开后如图所示
代码方面我们选择的是Btstack。
Btstack是开源免费的协议栈,关键点是:免费!
当然,如果要商用的话,也是要收费的。
我前几年用btstack开发的时候,坑的确是蛮多的,不过这个坑的问题,就看你怎么去看了。
好多公司花几十万买的商用协议栈,坑倒是少一点,但是开发了半天,你也不懂蓝牙呀不是。
我还是比较赞成大唐双龙传的思想,要练级,以战养战的方法是最好的,你不填几个坑,经验值也不会增长不是。
话说回来,这么多年过去了,我们也必须用发展的眼光去看问题。人家btstack也是一直在发展的,看看人家现在也是支持了a2dp了,原先只实现了l2cap以下的核心层,外加一个rfcomm而已。
还有没有坑,我没有趟过,不好说了。
操作系统的话,如果在unix系统,需要git,make,python等工具。如果是windows,需要
Mingw64的gcc环境
啥也不说了,前方的路虽然太凄迷,请在笑容里为我祝福吧!
蓝牙开发那些事儿(1)——从抓包数据开始相关推荐
- 蓝牙开发那些事儿(3)——看看空中包
在initial阶段我们看到了大量的hci command和hci event的交互,controller在init结束后完成了初始化,状态也变成了HCI_INIT_DONE. 接下来就要进入一个叫做 ...
- 蓝牙开发那些事儿(10)——初识BLE
其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进, 应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑: 功耗低,数据量少, ...
- 低功耗蓝牙开发入门概念科普
一.概述 1.缘起 低功耗蓝牙起源于Bluetooth4.0版本,至今已发展到5.3 4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型,后面版本主要退出新特 ...
- 带你一起用 ElasticStack 搞定 Wireshark 抓包数据可视化
1.Wireshark 介绍 Wireshark 是一个功能十分强大的开源的网络数据包分析器,可实时从网络接口捕获数据包中的数据.它尽可能详细地显示捕获的数据以供用户检查它们的内容,并支持多协议的网络 ...
- STM32WU55蓝牙开发学习笔记(1)
STM32WU55蓝牙开发学习笔记(1) 前言 我在本科的时候主要是做机械结构的,参加过RM和RC,现在研究生在一个做传感器的课题组,直接转行做电控了,G.研究生阶段的第一个项目是,多通道采集肌电信号 ...
- Android蓝牙开发系列文章-扫不到蓝牙设备,你的姿势对了吗?
在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出两篇文章,分别是: 关于蓝牙设备类型分类的,这个已经完成了,阅读请点击<Android蓝牙开发系列文章-蓝牙设备类型 ...
- iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]
一.蓝牙基础知识 (一)常见简称 1.MFI make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...
- [转]Android蓝牙开发浅谈
转自:http://www.eoeandroid.com/thread-18993-7-1.html 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 ...
- 《低功耗蓝牙开发权威指南》——第2章基本概念
本节书摘来自华章社区<低功耗蓝牙开发权威指南>一书中的第2章基本概念,作者 (英)Robin Heydon,更多章节内容可以访问云栖社区"华章社区"公众号查看 第2章 ...
- STM32开发 -- 蓝牙开发详解(2)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...
最新文章
- 偏前端 - vue-cli(axios请求数据==》token+按接口参数顺序(参数值拼接base64)- MD5)...
- Linux复制文件scp
- python导入csv文件-Python读写文件(csv、txt、excel)
- 当前几个主要的Lucene中文分词器的比较
- 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
- 夜间模式html,Web前端-夜间模式
- 万圣节头像小程序源码
- inline元素的间距问题
- Java虚拟机------垃圾收集器
- tensorflow分类的loss函数_tensorflow中loss函数
- 转码器ffmpeg安装
- TrustedInstaller.exe in Windows Vista consumes 100% CPU
- utilities(C++)——枚举
- UINavigationItem 设置UIBarButtonItem
- 阿里云天池赛题解析——深度学习篇重磅发布!
- 交叉火力dsp手机调音软件_DSP680AM调音软件下载
- 服务器重装系统需要按什么,安装服务器系统前我们该做些什么
- 屏幕放大缩小及标注神器【Zommit】
- 混淆矩阵 confusion matrices
- 竞价推广和信息流推广是什么?区别在哪里?
热门文章
- ajax怎样上传多张图片,多图片Ajax上传
- spring5、springboot和springcloud的区别
- CUDA库之NPP(二):NPP实现YUV转BGR
- 手机型号修改 修改手机型号,在QQ空间想朋友展示个性化的手机型号
- unity Curvy Splines基础操作:创建可视赛道
- P1563 [NOIP2016 提高组] 玩具谜题
- 解决CAS 4.2.7 版本集群部署的各种问题
- XGBoost算法案例实战—— 金融反欺诈模型
- 未来软件是什么样子?-SIF期货
- Matlab绘图方法整理(超完整版)