概要

本文的目的是帮助读者对蓝牙架构,有个宏观的认识!
没有具体深入理解,先构建一个“宏观系统”,后面,再对这个系统“微观”地认识;

BLE蓝牙

其实蓝牙分好几种,这里我针对BLE进行描述,该描述摘自百度百科,我觉得挺不错的。
蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。
总之,一句话BLE最明显的特定就是低功耗!

蓝牙协议架构

我在网上找了一些图片

android 低功耗蓝牙回连方案 低功耗蓝牙功耗_android 低功耗蓝牙回连方案


由上图可以看到,分为三个部分,Application(profiles)、Protocol stack(host)、 Radio(controller);

刚开始我对于这三个部分也是挺懵的,其实这三个部分,是一个大的框架,具体蓝牙怎么通过协议层层封装后,进行数据收发,本章节暂时不涉及。这个大的框架,我们先从host开始看起,我们可以看到host由GATT、GAP、ATT、SMP、L2CAP组成的;我刚开始学习的时候,一直挺好奇host到底是个什么东西?后面,通过理解蓝牙的一些代码和刚好手中有个蓝牙项目;原来host是mcu,那问题来了,mcu与蓝牙有什么关联呢?其实大白话,就是mcu和蓝牙通信,控制蓝牙无线收发数据出去。数据的发送内容,我们开发者人为而定,比如你想发送“hello world”,嘿嘿!然后,mcu通过串口或者其他方式给蓝牙,蓝牙就会将mcu,也就是你刚刚的“hello world”发送出去。那我怎么知道是mcu通过串口数据给蓝牙呢?我参考了蓝牙官方给的手册。

android 低功耗蓝牙回连方案 低功耗蓝牙功耗_智能硬件_02


可以看到HCI传输,有UART、USB、SD、Three-wire UART等传输方式;那什么是HCI呢?HCI就是host与controller层间,数据交流的通道;这里我们疑问来了,什么是controller?controller层其实是蓝牙,我们之前说的mcu将数据发送给蓝牙,就是发送给controller层!

那么,我们回头看起那面的那图,不是还有个Application(profiles)吗?其实,Application(profiles)就是服务端,那服务端是哪里来的呢?有人就会好奇提出疑问,打个比喻,如果我用两块蓝牙数据进行数据无线通信,那么是不是一个作为发送端,另一个作为接受端呢?就是如此的,发送端作为客户端,接受端我们作为服务端,而Application(profiles)就是在服务端那边(另一块蓝牙)构建的哈!那么,他们之间(客户端和服务端)是怎么数据收发和服务端怎么搭建的,这里不展开详谈,后面有机会会,再给大家补充哈!因为,这一块内容还是相对比较复杂的。讲多怕大家混乱,本章的主要目的是给大家构建一个蓝牙怎么运作的系统框架,具体细节不展开哈。

蓝牙连接

接下来讲述蓝牙建立连接步骤,我在网上找了一张图片:

android 低功耗蓝牙回连方案 低功耗蓝牙功耗_android 低功耗蓝牙回连方案_03


其实,我们前面的蓝牙协议架构的时候,就已经提到了,客户端和服务端的相对概念,在这张图里分别对应master和slave。

那么它连接是怎么样的一个步骤呢?

1、slave,经过层层协议包装自己数据报文后,对外广播数据,这个数据里面,就有一部分会包含自己的地址;

2、master会对slave的数据进行接受,层层协议解剖和处理,进行判别该地址是否是我要指定连接的地址;

3、如果是的话,那么,master就会主动“出击”,对目标发出扫描;

4、slave接收到扫描之后,会做出响应,表示跟你连接成功;

以上就是对蓝牙连接的一个总结了,嘻嘻,有点大白话~

数据传输

数据传输,这里先讲涉及一点,前面说到蓝牙连接成功了,其实连接成功后,还有一个步骤,要打通服务通道!就是彼此构建一个服务通讯通道,服务通道其实挺复杂的这里先不展开,因为将这一块,要结合代码来讲容易懂一些;服务通道搭建好之后,就是数据交互了,前面我们说了,mcu向蓝牙发送数据可以通过uart或者其他等方式,那么uart是如何将mcu的数据发送到蓝牙?而且蓝牙为什么能对发送过来的数据进行使用,然后对外发送出去?
这里大概讲一下,uart是如何将mcu的数据发送到蓝牙,其实比较简单,学过单片机应该都用过串口发送数据,如初始化时钟、管脚波特率…等一系列,还用到uart_SendData,函数接口发送数据串,但是,值得注意的是,串口发送的字符串类型,要根据蓝牙接收字符串类型,进行定义,不然可能会出错!然后,就是hci了,它是构建host(mcu)和controller(蓝牙)的一个通道,我们一般用的是他一些相关接口函数,对数据进行传入到蓝牙!所以,讲起来比较麻烦,要结合代码分析。。。。。
那最后一个问题,蓝牙为什么能对发送过来的数据进行使用,然后对外发送出去?
其实,想让数据能到蓝牙,然后,无线发送出去,其实,对数据是有要求的!那就是蓝牙协议了,对数据进行层层打包和封装,达到数据能够满足蓝牙发送的要求!比如,一个字符串的发送,数据会经过ATT->L2CAP->HCI->LL经过这几层的数据打包,让数据满足蓝牙发送要求后,无线发送出去。

好啦!本文介绍到此结束啦,大家有疑问欢迎留言评论哈!有些地方可能讲的不是很清晰或者帮不到你,非常不好意思哈。如果对大家有些帮助,那我非常开心了哈~~