从今天起,会开一个新的专栏。面向初学者试着讲讲蓝牙,网上好像有很多讲解移植蓝牙协议栈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)——从抓包数据开始相关推荐

  1. 蓝牙开发那些事儿(3)——看看空中包

    在initial阶段我们看到了大量的hci command和hci event的交互,controller在init结束后完成了初始化,状态也变成了HCI_INIT_DONE. 接下来就要进入一个叫做 ...

  2. 蓝牙开发那些事儿(10)——初识BLE

    其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进, 应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑: 功耗低,数据量少, ...

  3. 低功耗蓝牙开发入门概念科普

    一.概述 1.缘起 低功耗蓝牙起源于Bluetooth4.0版本,至今已发展到5.3 4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型,后面版本主要退出新特 ...

  4. 带你一起用 ElasticStack 搞定 Wireshark 抓包数据可视化

    1.Wireshark 介绍 Wireshark 是一个功能十分强大的开源的网络数据包分析器,可实时从网络接口捕获数据包中的数据.它尽可能详细地显示捕获的数据以供用户检查它们的内容,并支持多协议的网络 ...

  5. STM32WU55蓝牙开发学习笔记(1)

    STM32WU55蓝牙开发学习笔记(1) 前言 我在本科的时候主要是做机械结构的,参加过RM和RC,现在研究生在一个做传感器的课题组,直接转行做电控了,G.研究生阶段的第一个项目是,多通道采集肌电信号 ...

  6. Android蓝牙开发系列文章-扫不到蓝牙设备,你的姿势对了吗?

    在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出两篇文章,分别是: 关于蓝牙设备类型分类的,这个已经完成了,阅读请点击<Android蓝牙开发系列文章-蓝牙设备类型 ...

  7. iOS蓝牙开发---CoreBluetooth[BLE 4.0] 初级篇[内附Demo地址]

    一.蓝牙基础知识 (一)常见简称 1.MFI  make for ipad ,iphone, itouch 专们为苹果设备制作的设备,开发使用ExternalAccessory 框架(认证流程貌似挺复 ...

  8. [转]Android蓝牙开发浅谈

    转自:http://www.eoeandroid.com/thread-18993-7-1.html 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少    ...

  9. 《低功耗蓝牙开发权威指南》——第2章基本概念

    本节书摘来自华章社区<低功耗蓝牙开发权威指南>一书中的第2章基本概念,作者 (英)Robin Heydon,更多章节内容可以访问云栖社区"华章社区"公众号查看 第2章 ...

  10. STM32开发 -- 蓝牙开发详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...

最新文章

  1. 偏前端 - vue-cli(axios请求数据==》token+按接口参数顺序(参数值拼接base64)- MD5)...
  2. Linux复制文件scp
  3. python导入csv文件-Python读写文件(csv、txt、excel)
  4. 当前几个主要的Lucene中文分词器的比较
  5. 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
  6. 夜间模式html,Web前端-夜间模式
  7. 万圣节头像小程序源码
  8. inline元素的间距问题
  9. Java虚拟机------垃圾收集器
  10. tensorflow分类的loss函数_tensorflow中loss函数
  11. 转码器ffmpeg安装
  12. TrustedInstaller.exe in Windows Vista consumes 100% CPU
  13. utilities(C++)——枚举
  14. UINavigationItem 设置UIBarButtonItem
  15. 阿里云天池赛题解析——深度学习篇重磅发布!
  16. 交叉火力dsp手机调音软件_DSP680AM调音软件下载
  17. 服务器重装系统需要按什么,安装服务器系统前我们该做些什么
  18. 屏幕放大缩小及标注神器【Zommit】
  19. 混淆矩阵 confusion matrices
  20. 竞价推广和信息流推广是什么?区别在哪里?

热门文章

  1. ajax怎样上传多张图片,多图片Ajax上传
  2. spring5、springboot和springcloud的区别
  3. CUDA库之NPP(二):NPP实现YUV转BGR
  4. 手机型号修改 修改手机型号,在QQ空间想朋友展示个性化的手机型号
  5. unity Curvy Splines基础操作:创建可视赛道
  6. P1563 [NOIP2016 提高组] 玩具谜题
  7. 解决CAS 4.2.7 版本集群部署的各种问题
  8. XGBoost算法案例实战—— 金融反欺诈模型
  9. 未来软件是什么样子?-SIF期货
  10. Matlab绘图方法整理(超完整版)