邹文婷
(四川长虹电器股份有限公司,四川 绵阳 621000)
在V4.0 之前的版本演进中,蓝牙协议主要追求通信速度的提升。蓝牙协议V4.0 版本包括三个子规范,分别是传统蓝牙、高速蓝牙以及低功耗蓝牙(Bluetooh Low Energy,BLE)技术。其中首次增加的子集——低功耗BLE 协议,与传统蓝牙同样使用免许可的2.4 GHz ISM(Industrial Scientific Medical,ISM)无线电频段(主要开放给工业、科学、医疗领域使用),但显著降低了功耗及成本。因此,BLE 目前广泛被应用于智慧家居、运动医疗等领域[1]。
蓝牙使用2.4 GHz 的ISM 频段,BLE 的物理信道一共分为40 个,每个信道带宽为2 MHz。这40个物理信道被划分为两组,一组是37 个Data 数据信道,另外一组是3 个ADV 广播信道。物理信道从0 ~39 进行编号,Index 与物理信道之间存在对应关系,其中物理信道0 对应Index37,物理信道12对应Index38,物理信道39 对应Index39。Index37,Index38,Index39 固定作为广播信道,对应的中心频率分别为2 402 MHz,2 426 MHz,2 480 MHz。它们分散在整个BLE 频段的不同区域。在蓝牙连接成功建立之前,设备之间通过ADV(Advertising)广播信道来交互数据,而在蓝牙连接成功建立之后,就使用Data 数据信道来进行数据交互。一个广播事件会在3 个广播信道上分别发送一次,由于广播信道之间相差至少24 MHz,因此3 个信道同时被干扰的几率很小。在BLE 交互中,从设备通过广播信道来表示自己的存在,主设备通过广播信道来扫描和发起连接[2]。
低功耗蓝牙规范中有两类报文,分别是广播报文和数据报文。这两种报文具有两种不同的用途。其中,广播报文用于发现、连接过程,可以被多个设备扫描侦听到,或者定向发给特定设备。而在连接建立后,则开始使用数据报文,只能被连接中的主、从设备所解析。广播报文在广播信道传输,数据报文在数据信道传输。报文格式为前导Preamble(1 Byte)+接入地址Access Address(4 Bytes)+协议数据单元PDU(2 ~39 Bytes)+CRC(3 Bytes)。
前导(Preamble)是报文最开始的8 bits,为10101010 或者01010101。在广播通道固定使用10101010 即0xAA 作为前导,用于同步通信。Access Address 是接入地址,广播包的接入地址固定为0x8e89bed6,数据包的接入地址则为一个32 bits 的随机值;CRC 部分有3 个字节用于CRC 数据校验[3]。
将PDU 进一步展开,协议数据单元PDU=Header(2 Bytes)+Payload(最大37 Bytes)。
Header 中的Type 通过4 bits 来标识广播类型,其中0000,0001,0010,0110 分别为BLE 广播可设置的4 种类型,即可连接无定向广播、可连接定向广播、不可连接无定向广播以及可扫描无定向广播。定向和无定向是针对广播的对象而言的,如果是针对特定对象的广播(在广播包PDU 中会包含目标对象的BD_ADDR)就是定向广播,反之就是无定向。可连接和不可连接是指是否接受连接请求,如果是不可连接的广播类型,它将不回应连接请求。可扫描类型是指可回应扫描请求的广播。
嵌入蓝牙技术的设备一般由蓝牙底层模块controller 和蓝牙主机host 组成。在实际应用中,controller 位于一个独立的蓝牙模块中,负责定义RF,Baseband 等偏硬件的规范,而蓝牙host 位于主控CPU,负责在逻辑链路的基础上进行更为友好的封装,屏蔽蓝牙的技术细节,使得蓝牙应用的开发更为方便。Controller 与host 两者之间通过主机控制器接口(Host Controller Interface,HCI)协议进行通信[4]。
通过蓝牙对设备进行控制,一般需要被控制设备与控制设备之间配对并建立蓝牙连接后才能通过连接事件(Connectiong Event)发送、接收控制信号,而建立连接的过程需要设备的蓝牙协议栈host 处于工作状态。被控制设备在关机状态下,操作系统及蓝牙协议栈host 都不处于工作状态,无法进行配对、连接,因此需要特殊的流程来实现蓝牙开机[5],如图1 所示,具体介绍如下。
图1 开机流程实例
(1)被控制设备由HOST 与BT controller 模块组成,彼此通过HCI 与GPIO 接口通信。
(2)被控制设备与控制设备在开机状态下进行配对、连接,互相保存配对密钥及蓝牙MAC。
(3)被控制设备的BT controller 模块长供电,即在关机状态下,仍保持供电;被控制设备的host 在关机状态下可以卸载蓝牙驱动,关闭操作系统,进入睡眠(sleep)模式。
(4)被控制设备从开机状态进入关机状态前,通过HCI 将BT controller 模块设置为WoBLE(Wake on BLE)模式,即处于BLE scan 状态,能扫描到蓝牙广播并对收到的广播数据进行解析。之后判断该广播包是否为本机的开机广播包,即收到的广播数据是否为指定格式,且在指定字段中是否包含本机的蓝牙MAC。
(5)控制设备发出开机广播包,开机广播包的payload 经过专门的设计,详见第2 节。
(6)被控制设备的BT controller 模块扫描到开机广播报文,即通过GPIO 发出约定电平,控制主控CPU 部分系统开机、加载蓝牙驱动、运行蓝牙协议栈等操作。
(7)被控制设备系统开机后,通过HCI 接口设置BT controller 模块退出WoBLE 模式。
报文实例,如表1 所示。
表1 报文实例
针对报文实例的解析如下。
Adv PDU Header 中,Type=‘0x0’即可连接无定向广播事件。TxAdd 与RxAdd 为‘0x0’即蓝牙地址类型为Public Add(公共地址)。
ADV_IND 净 荷 为:Payload=AdvA(6 bytes)+AdvData(0 ~31 bytes)。
AdvA 为控制设备,即发出开机广播的设备的蓝牙MAC 地址。
Adv Data 由多个AD Structure(结构)组成,每个AD Structure 的格式都是由三部分构成:长度(Length)+ 类 型(AD Type)+ 数 据(AD Data)。第一个AD Structure 的第一个字节是0x02,表示这个AD Structure 由02 和跟在02 后面的2 个字节组成:02 01 05。第二个AD Structure 的第一个字节是0x14,表示这个AD Structure 由14 和跟在14 后面的20 个字节组成:14 FF 0D 00 00 0A 01 3A 1F 38 10 FF FF FF FF 43 48 42 54 52 43。如表2 所示。
表2 开机广播报文实例Adv Data
被控制设备的BT controller 模块扫描到以上开机广播报文,经解析长度、格式满足定义,且包含被控制设备的蓝牙MAC(在示例中为0A 01 3A 1F 38 10),即通过IO 口输出约定电平,控制主机部分开机。
目前,智能电视、智能机顶盒等产品广泛应用此设计方案来实现蓝牙开机功能,或仅仅对报文内容稍作调整定制,但流程设计相同。通过以上设计实例可以看出,虽然在BLE 技术中,广播通常用于发现、连接过程,服务于最终蓝牙连接的建立,但在本篇中,通过对广播报文的特殊设计,利用广播的特性,使得在蓝牙连接未能成功建立的场景下,也可实现部分控制功能。因此,根据不同报文的特点,结合实际场景需求来对流程进行设计,可以帮助蓝牙开发者实现更多的蓝牙控制方式。