蓝牙技术原理、开发与应用
摘要
蓝牙是一种无线技术标准,用于在短距离内交换数据,建立个人局域网,它自1994年由爱立信公司发明以来,已经发展成为一个庞大的技术家族,深刻地影响了消费电子、物联网、工业自动化等多个领域,本文将从蓝牙的核心原理出发,介绍其技术演进,探讨开发实践,并列举其广泛的应用。

第一部分:蓝牙技术原理
要理解蓝牙,首先要明白它如何工作,其原理可以概括为以下几个核心方面:
核心概念:Piconet(微微网)
蓝牙网络的基本单元是 Piconet(微微网),一个Piconet由一个 主设备 和最多7个 从设备 组成。
- 主设备:负责发起连接、同步时钟、决定通信时隙,一个Piconet中只能有一个主设备。
- 从设备:被主设备连接,只能与主设备通信,不能直接与其他从设备通信(除非进入Sniff模式等特殊状态)。
- 点对点:最简单的Piconet,只包含一个主设备和一个从设备。
- Scatternet(散射网):一个蓝牙设备可以同时作为多个Piconet的主设备或从设备,从而将这些Piconet连接起来,形成一个更大范围的Scatternet,但这在实现上较为复杂,实际应用较少。
工作频段与调制方式
- 频段:蓝牙工作在 4 GHz ISM(工业、科学、医疗) 频段,这是一个全球通用的免费频段,但也意味着充满了Wi-Fi、微波炉等其他设备的干扰。
- 调制方式:为了在嘈杂的2.4GHz环境中可靠通信,蓝牙采用了独特的 跳频扩频 技术。
关键技术:跳频扩频
这是蓝牙抗干扰能力的核心。
- 原理:蓝牙设备不是固定在一个频率上通信,而是在79个指定的信道(每个信道间隔1MHz)上以极快的速度(1600次/秒)进行切换。
- 过程:
- 主设备和从设备在建立连接时,会约定一个“跳频序列”。
- 通信时,双方按照这个序列同步地切换到下一个信道。
- 即使某个信道被Wi-Fi或其他信号干扰,通信也只是短暂中断,下一个跳频周期会自动切换到干净的信道,从而保证了整体的通信稳定性。
- GFSK:早期蓝牙版本(如BR)使用高斯频移键控进行调制,数据率为1Mbps或2Mbps。
通信方式:BR/EDR 与 BLE
蓝牙技术主要分为两大技术路线,这也是理解蓝牙原理的关键。

A. 蓝牙基本速率/增强数据率
这是传统蓝牙,我们常用于连接耳机、音箱、鼠标等。
- 特点:
- 连接稳定:基于电路交换,连接一旦建立,延迟较低且稳定。
- 高吞吐量:支持较高的数据传输速率(BR: 1-3 Mbps, EDR: 2-3 Mbps)。
- 高功耗:为了维持稳定连接和传输数据,功耗相对较高。
- 应用:音频传输(A2DP协议)、文件传输(OBEX协议)、人机交互设备(HID协议)。
B. 蓝牙低功耗
这是现代物联网的基石,是蓝牙技术的革命性演进。
- 特点:
- 极低功耗:通过“连接-断开”的广播模式和不连续的接收/发送来省电,一个纽扣电池可以让BLE设备工作数月甚至数年。
- 低速率:数据传输速率较低(理论最高约2 Mbps),但对于传感器数据等小包数据完全足够。
- 快速连接:设备可以快速进入和离开连接状态,非常适合需要频繁唤醒的场景。
- 核心概念:
- 广播:设备可以周期性地发送广播包,不建立连接,让周围设备知道自己的存在和提供的服务,这是BLE设备被发现的唯一方式。
- GATT:通用属性协议,BLE设备间的所有通信都基于GATT,一个设备作为 GATT Server(数据提供方),另一个作为 GATT Client(数据读取方)。
- 服务与特征:GATT Server的数据以“服务”和“特征”的形式组织。
- 服务:相关特征的集合,电池服务”、“心率服务”。
- 特征:一个数据项,包含一个值、描述符和属性(可读、可写、可通知等),心率值本身就是一个特征,可以被客户端读取或订阅。
协议栈
蓝牙的通信是一层协议的堆叠,每一层都有其特定功能。
- L2CAP (逻辑链路控制和适配协议层):在底层链路之上,为上层协议提供数据分段和重组服务。
- ATT (属性协议):BLE核心协议,定义了Client如何读写Server的属性(即服务和特征)。
- GATT (通用属性协议):建立在ATT之上,定义了数据应如何组织成服务和特征,并定义了发现、读、写、通知等操作。
- 应用层协议:在GATT之上,定义了具体的应用场景,如 HID(人机接口设备)、GAP(通用访问协议,负责设备发现、连接等)、A2DP(音频传输协议)等。
第二部分:蓝牙技术开发
开发蓝牙应用,无论是作为主设备还是从设备,都需要遵循其协议栈,下面以最主流的 BLE开发 为例进行说明。

开发环境与硬件
- 硬件平台:
- 主设备:智能手机(iOS/Android)、电脑、开发板(如Raspberry Pi、ESP32)。
- 从设备:各种微控制器,如 Nordic nRF52系列、TI CC254x/CC2640、ESP32,这些芯片都集成了BLE控制器和射频收发器。
- 开发环境:
- 主端开发:使用原生语言。
- Android: Java/Kotlin + Android Bluetooth API
- iOS: Swift/Objective-C + Core Bluetooth Framework
- 从端开发:使用C/C++在微控制器上开发,通常需要厂商提供的SDK。
- Nordic: nRF Connect SDK / Zephyr RTOS
- TI: SimpleLink CC13xx/CC26xx SDK
- ESP-IDF: Espressif官方开发框架
- 主端开发:使用原生语言。
BLE 开发核心流程(以从设备为例)
开发一个BLE从设备,主要工作就是定义和实现自己的 GATT服务。
步骤1:定义服务和特征 这是开发的第一步,也是最重要的一步,你需要设计你的设备能提供什么数据。
- 示例:制作一个温湿度传感器
- 服务:环境感知服务
- UUID:
0x181A(标准服务,或自定义一个UUID)
- UUID:
- 特征1:温度
- UUID:
0x2A6E(标准特征) - 属性:可读 + 可通知
- 数据格式:一个16位整数,单位为0.1摄氏度 (25.5°C 存储为 255)
- UUID:
- 特征2:湿度
- UUID:
0x2A6F(标准特征) - 属性:可读 + 可写
- 数据格式:一个16位整数,单位为0.1% (60.5% 存储为 605)
- UUID:
- 服务:环境感知服务
步骤2:实现固件逻辑 使用SDK提供的API,将上述定义实现到代码中。
- 初始化BLE栈:启动蓝牙,设置设备名称。
- 添加GATT服务:将你定义的服务和特征注册到BLE协议栈中。
- 实现回调函数:当主设备进行特定操作时,BLE栈会调用你的回调函数。
- 读回调:当主设备读取温度特征时,此函数被调用,你需要返回当前的温度值。
- 写回调:当主设备写入湿度特征时,此函数被调用,你可以处理写入的数据(设置一个目标湿度)。
- 通知/指示回调:当主设备订阅了温度通知后,你需要主动调用发送通知的函数,将最新的温度数据推送给主设备。
- 处理广播:设置广播包的内容,至少包含设备名称,还可以包含一些服务UUID,方便主
