什么是蓝牙?
蓝牙是一种短距离无线通信技术,可以实现固定设备和移动设备之间的数据交换。一般蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,蓝牙4.0下的乐蓝牙称为低功耗蓝牙。
许多人美国对蓝牙的了解还仅限于手机领域。其实蓝牙的应用远不止这些。在过去的几年里,蓝牙的增长达到了80%。当然,低功耗蓝牙的出现也起到了关键作用。我相信未来蓝牙会创造一个物物互动的世界。
标准分类
蓝牙4.0标准包括传统蓝牙模块和低功耗蓝牙模块,是双模标准。低功耗蓝牙也是在传统蓝牙的基础上发展起来的,与传统模块有所不同。它最大的特点是成本和功耗降低,应用在实时性上要求更高。
BLE(Bluetooth Low Energy)蓝牙低能耗技术是一种短距离、低成本、互操作的无线技术。它使用许多智能手段来最大限度地降低功耗。
BLE技术的工作模式非常适合从微型无线传感器(每半秒交换一次数据)或其他外设(如使用完全异步通信的遥控器)传输数据。这些设备发送的数据量非常小(通常只有几个字节),传输的次数也非常少(比如每秒几次到每分钟一次,甚至更少)。
BLE协议栈的结构和配置
1、协议有两部分:控制器和主机。
2、配置文件和应用程序始终基于GAP和GATT
3、在单芯片方案中,控制器、主机、配置文件和应用层都在同一个芯片中。
4、在网络控制器模式下,主机和控制器一起运行,但是应用程序和配置文件位于另一个设备上,例如PC或其他微控制器,它们可以通过UART和USB进行操作。
5、在双芯片模式下,控制器在一个控制器上运行,而应用层、配置文件和主机在另一个控制器上运行。
BLE设备连接状态流程图
BLE协议栈各层的功能机制
低功耗蓝牙架构
如上所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后需要提供一个与这个芯片相匹配的BLE协议栈,最后需要在协议栈上开发自己的应用。可见,BLE协议栈是芯片和应用之间的桥梁,是实现整个BLE应用的关键。BLE协议栈的具体功能是什么?简单来说,BLE协议栈主要是用来把你的应用数据一层一层的封装起来,生成一个符合BLE协议的空中数据包,也就是把应用数据包裹在一系列的头和尾中。具体来说,BLE协议栈主要由以下几部分组成:
物理层(PHY层)。PHY层用于指定BLE使用的无线电频带、调制和解调方法。PHY层做得好不好直接决定了整个BLE芯片的功耗、灵敏度和选择性。
LL层(链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic这样的BLE协议栈可以同时支持20条链路,这是LL层的功劳。LL层要做的事情很多,比如选择哪个射频信道进行通信,如何识别空中数据包,在哪个时间发送数据包,如何保证数据完整性,如何接收ACK,如何重传ACK,如何管理和控制链路等等。LL层只负责发送或检索数据,如何分析数据会交给上面的GAP或ATT。
主机控制器接口.HCI是可选的。HCI主要用于两个芯片实现BLE协议栈时,用来规范它们之间的通信协议和命令。
通用访问配置文件。GAP是解析LL层净荷的两种方式之一,也是最简单的一种。GAP简单定义了LL有效载荷,所以GAP能实现的功能极其有限。目前GAP主要用于广播、扫描和发起连接。
L2CAP层(逻辑链路控制和适配协议)。L2CAP只是封装了LL,LL只关心传输的数据本身。L2CAP必须区分它是加密信道还是正常信道,并且还要管理连接间隔。
安全管理协议.SMP用于管理BLE连接的加密和安全,如何在不影响用户的情况下保证连接的安全的经历。这些都是SMP要考虑的工作。
ATT(属性协议).简单来说,ATT层是用来定义用户命令和命令操作的数据,比如读或写一些数据。在BLE协议栈中,ATT是开发者接触最多的一个。引入了属性的概念,用来描述数据。属性不仅定义了数据,还定义了可以用于这些数据的ATT命令,所以这一层称为ATT层。
通用属性配置文件.GATT用于规范属性中的数据内容,并使用组的概念对属性进行分类和管理。没有关贸总协定,BLE协议栈可以运行,但互联互通会有问题。正是因为有了GATT和各种应用profile,BLE才摆脱了ZigBee等无线保真的兼容困境,成为最大的2.4G无线通信产品。
蓝牙模块的主要应用领域
1、移动扩展设备
2、汽车电子设备
3、健康医疗用品:心跳带、血压计等。
4、定位应用:室内定位、地下定位等。
5、近距离数据采集:无线抄表、无线遥测等。
6、数据传输:智能家居室内控制、蓝牙调光、打印机等。
BLE协议栈详解
协议概述
所谓协议,就是将指定的字节按照一定的顺序排列,以便他人在使用自己的设备时,可以通过协议与其他设备进行通信。该协议的一个特点是具有固定的帧格式,通过该格式发送,接收方可以通过解释帧格式得到新的信息内容;
BLE连接过程
通用通信协议,第一种通信是指数据的直接发生。当设备接收和传输数据时,它直接分析数据。当接收的数据合法时,它是有效数据。这类通信协议主要用于有线通信协议,如Can通常采用的Modbus。另一类通信协议需要新的连接,只有连接建立成功,双方才能通信,如TCP和BLE;当BLE协议需要通信时,它需要发送一个广播信号来告诉接收方它即将与之通信。在接收到广播内容后,接收器确认它正在与自己通信,因此它向广播者发送一个响应消息,以便当广播者和接收器都拥有彼此的身份信息,就说明双方连接成功。因此,在连接过程中必须有相应的广播帧格式。在BLE通信过程中,假设设备A需要连接其他设备,假设设备B需要连续发送广播信号(这个过程一般有一个时间间隔,在没有发送广播数据的时间内芯片处于低功耗状态)。每发送一个广播包,就称为一个广播事件。
广播帧格式
前同步码:8位交替序列访问地址的第一位是0: 01010101。访问地址的第一位是1: 101访问地址:广播帧是固定地址:0x8E89BED6(低位字节优先)。广播消息的报头包含4比特广播消息类型、2比特保留比特、1比特发送地址类型和1比特接收地址类型。广播消息类型:
发送地址类型:0:公共地址1:随机地址长度:广播报文长度字段包含8位,有效值范围为6~37数据:广播者地址(6字节)广播数据(31字节)校验:3字节,即CRC校验。广播数据:分为有效数据和无效数据。
有效数据部分:包含n个广告结构,每个广告结构由长度、广告类型和广告数据组成。其中:length:AD type和AD数据的长度。ADType:表示广告数据的含义。请参阅https://www . bluetooth . com/specifications/assigned-numbers/generic-access-profile/
BLE连接建立过程
1.BLE广播和扫描
设备B不断向观察者发送广播信号。如果手机不打开扫描窗口,手机不会接收设备B的广播,如下图所示,不仅手机要打开射频接收窗口,而且只有射频接收窗口与广播的发射窗口匹配成功,且广播射频通道与手机扫描射频通道为同一通道,手机才能接收到设备B的广播信号。也就是说,如果设备B在37信道上发送广播包,手机扫描38信道,那么即使他们的射频窗口匹配,两者也无法通信。由于这个匹配成功是概率事件,所以手机扫描到设备B也是概率事件,也就是说,手机有时候扫描到设备B很快,比如只需要一个广播事件,手机有时候扫描到设备B很慢,比如需要10个广播事件甚至更多。
2.建立连接建立。
根据bluetooth spec,150us(T_IFS)在广告客户发送广播数据包后,广告客户必须打开RF Rx窗口一段时间,以接收来自观察者的数据包。在此期间,观察者可以向广告商发送连接请求。如下图所示,第三次广播事件时,手机扫描设备B,发送连接请求Conn _ REQ(也称CONNECT_IND)。
注:图中M代表手机,S代表设备B,M-S表示手机向设备B发送数据包,即手机打开Tx窗口,设备B打开Rx窗口;S-M则是指设备B向手机发送数据包,即设备B打开Tx窗口,手机打开Rx窗口。
如图,手机收到A1广播包ADV_IND后,以此为初始锚点(此锚点不是连接的锚点),经过T_IFS时间后,向广告主发送连接请求命令,即A2包,告诉广告主我来了,连接你,请准备好。广告主根据connect_req命令信息准备接收,connect_req包含以下关键信息:
如上所示定义发射窗口偏移。
传输窗口大小如上图所示。
connect_req数据包的完整定义如下
Connect_req实际上是告诉广告客户,移动电话将在传输窗口期间向您发送第一个同步数据包(P1)。请在此期间打开您的射频接收窗口。设备B收到P1后,会在T_IFS时间后回复数据包P2(ACK包)给手机。一旦移动电话接收到数据包P2,就可以认为连接成功。当然,实际情况会比较复杂,手机可能收不到P2。此时手机会继续发送同步包,直到超时为止。在此期间,只要设备B返回一次ACK包,就认为连接成功。因此,一旦发送了P1包,无论是否收到来自设备的ACK包,主机(移动电话)都认为连接成功。这就是为什么在Android或iOS系统中,应用程序经常会收到一个连接成功的回调事件(这个回调事件是以是否发送了P1包为基础的,只要发送了P1包,手机就认为连接成功,不管是否收到来自设备的ack包),但实际上手机和设备并没有成功建立连接。后续手机会以P1为锚点(原点),以连接间隔为周期,周期性的向设备B发送数据包。除了数据传输之外,数据包还有以下两个非常重要的功能:
同步手机和设备的时钟,也就是说,设备每次收到手机发来的数据包,都会重置自己的定时原点与手机同步。
告诉设备你现在可以给我发送数据了。连接成功后,BLE通信将成为主从模式,因此连接发起方(手机)称为主机或中心,被连接方(原广告主)称为从机或外设。BLE通信采用主从模式的原因是从机可以 随便发信息去掌握。只有在主设备向其发送数据包后,它才能将自己的数据发送回主设备。
3.连接失败。
有以下几种典型的连接故障:
如步骤2所示,如果从机在发送窗口期间没有收到主机发送的P1,连接将失败。这时候就要排查主的那边的问题,看看主为什么没有不要在约定的时间派P1去。
如果主机在发送窗口期间发送P1,也就是说,主机根据connect_req约定的时序发送P1,但从机在超时内没有发回P2或P2,那么连接也会失败。这时,我们应该对slave 上的问题进行故障排除。表叔,看看为什么奴才没有不要让P2回到过去。
如果主设备发送P1,从设备发送回P2,主设备或从设备仍然报告连接失败。这种情况下,可能是软件有问题,需要仔细检查主机或从机的软件。
还有一个常见的连接故障:空中射频干扰太大。这时你要找一个干净的环境,比如屏蔽室,排除干扰后测试连接是否正常。
数据帧格式
连接成功后,双方将能够互相发送数据,因此这将涉及到他们的数据帧格式:
字段说明:LLID:指示该分组数据是LL日期PDU还是LL控制PDU 00b:保留01b:LL日期PDU:l2cap消息的延续片段,还是空PDU。10b:L1日期PDU:L2CAP消息或没有分段的完整L2CAP消息的开始。11b:L1控制PDU
MIC(消息完整性检查):信息完整性检查。说到加密操作,上图用虚线表示,没必要。MD:这个标志位用于通知另一个设备它有其它数据要发送。0表示没有更多的数据要发送,1表示有更多的数据要发送。这样,只要还有数据要发送,连接事件就会自动扩展。一旦不再发送数据,连接事件就会立即关闭。
注:如何辨别是确认包、新包还是重新包?SN:只有一位,所以值在0和1之间切换。如果序号与前一条相同,则为重传消息;如果序列号与前一个不同,则为新消息。NESN:预期序列号,是接收方希望接收的下一个数据包的序列号,即数据包的确认标记。当设备接收到sequence (SN)为0的报文时,在发送给对方的数据包中,应该将NESN设置为1,这样对方在接收到这个数据包后会发送一个新的数据包,否则会重新发送最后一个序列号为0的数据包。该标志可用于确定数据分组是否被正确接收或需要被重传。
标签:数据设备BLE