蓝牙开发那些事儿(1)——从抓包数据开始

 从今天起,会开一个新的专栏。面向初学者试着讲讲蓝牙,网上好像有很多讲解移植蓝牙协议栈btstack的,但是都表示移植好了,对蓝牙协议还是一知半解,网上的那些讲蓝牙协议的,大多都是粘贴来粘贴去,没有深入,对初学者很不友好。

我想找一个新的角度,试着去帮助初学者入门,尝试一下,如果效果好,能帮助到其他人,那么还是有动力坚持写下去的。

一般网上讲协议栈的,都是分层去讲,先来看一下网上找到的这张协议栈的图

蓝牙开发那些事儿(1)——从抓包数据开始_第1张图片

这个是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来页:

蓝牙开发那些事儿(1)——从抓包数据开始_第2张图片

大量的数据格式、标准,如果没玩过蓝牙的人,会看得云里雾里。

所以我希望换一个视角,我们从数据的角度出发,从代码的角度出发,去看一次经典蓝牙连接的全过程,可能结合实例去理解,对于初学者来说更容易一点。

这里的数据是指的hcilog,一般来说研究通信,空中包很重要,但是抓包设备贵啊,而且hcilog一般情况下也就够用了,为什么呢?看一下架构图就明白了:

蓝牙开发那些事儿(1)——从抓包数据开始_第3张图片

蓝牙协议栈被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打开后如图所示

蓝牙开发那些事儿(1)——从抓包数据开始_第4张图片

代码方面我们选择的是Btstack。

Btstack是开源免费的协议栈,关键点是:免费!

当然,如果要商用的话,也是要收费的。

我前几年用btstack开发的时候,坑的确是蛮多的,不过这个坑的问题,就看你怎么去看了。

好多公司花几十万买的商用协议栈,坑倒是少一点,但是开发了半天,你也不懂蓝牙呀不是。

我还是比较赞成大唐双龙传的思想,要练级,以战养战的方法是最好的,你不填几个坑,经验值也不会增长不是。

话说回来,这么多年过去了,我们也必须用发展的眼光去看问题。人家btstack也是一直在发展的,看看人家现在也是支持了a2dp了,原先只实现了l2cap以下的核心层,外加一个rfcomm而已。

还有没有坑,我没有趟过,不好说了。

操作系统的话,如果在unix系统,需要git,make,python等工具。如果是windows,需要

Mingw64的gcc环境

啥也不说了,前方的路虽然太凄迷,请在笑容里为我祝福吧!

你可能感兴趣的:(蓝牙开发那些事儿)