蓝牙技术应用原理浅析

(整期优先)网络出版时间:2019-05-15
/ 2

蓝牙技术应用原理浅析

陈炳华

(广州市番禺奥莱照明电器有限公司广东广州511434)

摘要:蓝牙无线通讯技术作为一种无线数据与语音通信的开放性全球标准,其应用前景非常看好,本文透过技术实现细节,分析了蓝牙的技术应用原理。

关键词:跳频;主控制器;拓扑;传输加密;启动代码

一、概述

蓝牙是应用在2.4GHzISM频段上的一种无线通讯标准。至今为止,蓝牙技术已经应用在全球范围内数十亿台设备上,单单是2017年的出货量已经达到了30亿台以上。虽然现在蓝牙标准协议已经发布到5.0,但是应用范围最广的标准还是蓝牙4.0,已经基本占领了无线耳机、音箱,无线鼠标键盘的市场。

蓝牙4.0标准相对于旧版本拥有更低的成本,更低的功耗、更少的延时、更长的有效距离、更严格的加密协议。主要的技术细节如下:

速度:支持1Mbps数据传输下的超短数据包,最少8个字节,最多27个。所有连接都适用蓝牙2.1加入减速呼吸模式来达到超低工作循环。

跳频:适用所有蓝牙规范版本通用的自适应调频,最大限度减少和其他2.4GHzISM频段无线技术的串扰。

主控制器:更加智能,可以休眠更长时间,只在需要执行动作的时候才唤醒。

延时:最短可在3ms内完成所有连接并开始传输数据(快速连接模式)。

范围:提高调制指数,最大范围可以达到100米。

健壮性:所有数据包都适用24-bitCRC校验,确保最大程度抵御干扰。

安全:适用AES-128CCM加密算法进行数据包加密和认证。

拓扑:每个数据包的每次接受都适用32位寻址,针对一对一连接优化,并支持星型拓扑的一对多连接;适用快速连接和断开,数据可以在网络拓扑内转移而无需维持复杂的网状网络。

由于蓝牙4.0有上述优点,并且支持智能终端直接连接,不需要外加网关,我司无线调控感应器的核心技术就选用蓝牙4.0技术。

蓝牙连接与蓝牙低功耗

下图是电流表检测下的波形图,由该表我们可以看出,蓝牙4.0对于时钟的要求是非常高的,包括主晶振和低功耗晶振,大部分时间是处于睡眠模式,当链接间隔结束后,快速恢复到运行状态,并且发送数据,而后快速恢复休眠。

四种设备类型:

Central主机,一般是手机或者PC等可以给用户操作,主动建立连接的设备。

Peripheral从机,如心率计、血糖计等,需要蓝牙连接后读取或上传数据状态的设备。

Observer观察者,不需要创建连接,仅仅扫描外部的广播,从广播包中获取所需要的设备信息,如温度、湿度等。

Broadcaster广播者,与观察者配对,只能通过广播发送设备数据。

六种设备状态

待机状态(standby):设备没有传输和发送数据,并且没有连接到任何设备,一般是处于低功耗模式,用按键做外部中断唤醒。

广播状态(advertiser):周期性广播状态,发送广播的一般为蓝牙从机或者广播者。

扫描状态:主动寻找正在广播的设备,从广播中获取广播名或者数据。

发起链接状态(Initiator):主动向扫描设备发起链接。

主设备(Master):作为主设备连接到其他设备。

从设备(Slave):作为从设备连接到其他设备。

五种工作状态:

准备(Standby),广播(Advertising),监听扫描(Scanning),发起连接(Initiating),已连接(Connected)。

连接的过程:

1.Peripheral开始广播(advertising)

2.Central扫描从机广播(scanning)

3.Peripheral接收到Central的扫描请求,回应数据

4.Central向Peripheral发起连接(Initiating)

5.开始通讯(Connected)

二、技术实现细节

1、更改蓝牙广播名称

蓝牙的名称在包含在静态数组scanRspData[]当中,其中第一个数据为广播名称数据的长度,第二个数据是广播的类型,后面的数据就是蓝牙广播显示的名称。剩下的数据是广播的连接参数还有发射功率的数据。

2、控制数据的传输

在蓝牙低功耗的协议里面,所有数据的传输是基于特征值的。特征值是一个抽象的概念,而具体到代码里面,就是一个数组。数组会拥有三个属性,读、写、通知。

写是客户端给服务器端的更改服务器的数据,读是客户端读取服务器的数据,通知是服务器给客户端下发的数据。该项目使用的是自定义服务里面的特征值2。通过把静态变量simpleProfileChar2Props,设置为GATT_PROP_READ|GATT_PROP_WRITE|GATT_PROP_NOTIFY,可以让该特征值可读可写可通知的状态,APP可以通过写特征值,写入需要操作到的数据,而设备端可以通过通知,给APP回复数据。

3、数据传输加密

蓝牙4.0使用的是固定的通讯协议,在通讯的时候可以通过空中抓包的方法获取通讯的内容。而一旦他人破解了通讯的协议,就可以从空中协议包中获得蓝牙通讯的密码,使得用户的产品处于不安全的状态下。

所有我们需要在通讯中加入加密和解密的过程,使得通讯更加安全。蓝牙4.0的协议栈,在逻辑链路层里面,提供了AES-128的加密和解密方式。加密使用API函数LL_Encrypt,其中第一个参数为128位的密码,第二个参数是需要加密的数据,第三个数据为加密后的数据。解密使用API函数LL_EXT_Decrypt,其中第一个参数为128为的密码,第二个参数是需要解密的数据,第三个数据是解密后的数据。

不过,AES-128的加密方式是对等加密,即一直使用同一个秘钥进行通讯,所以在没办法防止他人直接使用密文进行通讯。为此,我司使用的方式是在连接创建的时候,使用特定算法,让APP与设备端进行握手,修改当次通讯的秘钥,如果握手不成功,设备端将在100毫秒内主动中断蓝牙的连接,杜绝被他人重复破解的可能性,使用的API函数是GAPRole_TerminateConnection()。

4、带加密的空中升级

为了防止项目的升级,功能的更改,还有漏洞的出现,现在的无线智能项目,都是有空中升级的功能,而带加密的空中升级是为了防止非产品官方人员的升级,使得他人对产品做不相关的开发,从而产生未知的风险。其主要思想是把整个程序空间分为3部分:启动代码,代码A和代码B。启动代码作为中心管理,决定开机后使用的是代码A还是代码B。当使用代码A的时候,空中升级就会在代码B部分做更改,反之当使用代码B的时候,空中升级会在代码A部分做更改。这样子可以有效防止空中升级在升级到一半的时候,升级中断,导致代码崩溃,程序崩溃。如下图所示: