https://mp.weixin.qq.com/s/qjKsxuF4TRrH5CWh8TOvzw
蓝牙点灯
1 蓝牙简介

蓝牙(Bluetooth)是一种短距离无线通信技术,用于在电子设备之间传输数据或建立语音连接。它采用2.4GHz ISM频段(2.402GHz–2.480GHz),支持点对点或小型局域网(如蓝牙Mesh)通信,具有低功耗、低成本、易集成的特点。
连接方式:
点对点(如手机连接耳机)。
广播模式(如Beacon定位)。
Mesh组网(智能家居设备互联)。
典型应用:
音频传输:无线耳机、音箱(如A2DP协议)。
数据传输:手机与电脑互传文件(如OBEX协议)。
物联网(IoT):智能手环、智能家居(BLE)。
车载系统:蓝牙免提通话(HFP协议)。
蓝牙的各个版本:
| 版本 | 关键改进 | 典型用途 |
|---|---|---|
| 蓝牙1.x | 基础速率(1Mbps) | 早期无线耳机、鼠标 |
| 蓝牙2.x | EDR(增强数据速率,3Mbps) | 文件传输、音频设备 |
| 蓝牙3.0 | HS(高速模式,借用Wi-Fi) | 大文件传输(已淘汰) |
| 蓝牙4.0 | 引入低功耗蓝牙(BLE) | 可穿戴设备、IoT |
| 蓝牙5.0 | 2倍速度、4倍距离、Mesh网络支持 | 智能家居、定位服务 |
| 蓝牙5.3 | 更低延迟、更强抗干扰(2021年) | 游戏耳机、医疗设备 |
经典蓝牙和低功耗蓝牙:
| 对比维度 | 经典蓝牙(BR/EDR) | 低功耗蓝牙(BLE) |
|---|---|---|
| 传输速率 | 1-3 Mbps,带宽大 | 1 Mbps(BLE 5.0可达 2 Mbps) |
| 功耗水平 | 高,持续传输耗电明显 | 极低,纽扣电池能撑一两年 |
| 典型场景 | 蓝牙音箱、耳机、车载音频 | 智能手环、传感器、物联网终端 |
| 协议复杂度 | 复杂,涉及音频编解码、高速数据流 | 精简,专为短数据、低频交互设计 |
| 嵌入式对接频率 | 偶尔碰到(音频类项目) | 非常高频,绝大多数IoT项目都用它 |
传输距离:
经典蓝牙(BR/EDR):通常10–100米(取决于功率等级)。
低功耗蓝牙(BLE):约10–50米(优化功耗,适合IoT设备)。
数据传输速率:
经典蓝牙(如蓝牙4.0):最高3Mbps(蓝牙5.0可达50Mbps)。
BLE:适用于小数据量(如传感器数据),功耗极低。
不过目前业界大部分都是BLE了。

2 蓝牙协议栈

对于开发来说,90% 的精力聚焦在Application + Profiles + GATT / GAP
-
GAP (通用访问规范) 开发:
-
干什么:决定设备“怎么给别人看”。
-
代码层面:你需要调用 API 去设置设备的名字(比如叫 "Smart_Glasses_XXXX")、配置广播数据包(Advertising Data,包含厂商自定义数据)、设置是作为 Master(主机)去扫描别人,还是作为 Slave(从机)等待被连接,以及设置配对安全等级(SMP 密钥输入、Just Works 等)。
-
-
GATT (通用属性配置文件) 开发:
-
干什么:决定设备“怎么传输数据”。
-
代码层面:这是最核心的。你需要定义 GATT Database。你需要自己设计一个个 Service(服务) 和 Characteristic(特征)。
-
例如:做一个心率服务(UUID:
0x180D),里面包含一个心率测量的特征,配置它具有Notify(通知)属性,然后写代码定期把传感器采集上来的数据丢进这个特征值里发出去。
-
-
Profiles & Application (应用层):
-
干什么:业务逻辑。
-
代码层面:处理传感器数据、控制 LED 闪烁、处理按键事件,并在连接断开时处理重连逻辑。
-
少数两个场景需要其它层面的开发:
场景 A:双芯片架构(例如高通主平台 + 独立蓝牙芯片)
在像智能眼镜、高性能车载、或者高速网关这类复杂的嵌入式系统中,SoC(跑 Android/Linux)和蓝牙芯片是分离的。
-
这时候,Radio和Controller 在外面的蓝牙芯片里,而 Host(包括 L2CAP, ATT, SMP, GATT, GAP)全部跑在 Linux/Android 内核和用户态协议栈(如 BlueZ, Fluoride)中!
-
你的工作:你虽然不用从头写 L2CAP,但你需要在 Linux 下配置它的参数。
场景 B:硬核调优与防坑(固件工程师的必修课)
当你遇到设备连不上、断连、或者传输速率卡死时,你必须深入到这几层去调优:
-
L2CAP (逻辑链路控制与适配协议):
-
调优避坑:如果你要传输大数据(比如智能眼镜要通过蓝牙同步固件升级包/OTA),默认的蓝牙数据包极小。你需要写代码触发 MTU Exchange(交换最大传输单元),在 L2CAP 层将 MTU 从默认的 23 字节放大到 247 字节甚至更大。如果不做这个“开发/配置”,你的蓝牙传输速率会慢得像龟爬。
-
-
SMP (安全管理器协议):
-
调优避坑:如果你的设备要求极高的安全性(不希望别的眼镜或手机能随便连上你的网关窃取数据),你需要去配置 SMP 的加密流程(比如使能 MITM 密码保护、配置数据签名)。
-
-
ATT (属性协议):
-
调优避坑:当你用抓包工具(如 Wireshark、Ellisys)抓取蓝牙空中报文排查 Bug 时,你会直接面对
ATT_ERR_INSUFFICIENT_AUTHENTICATION(权限不足)或ATT_MTU_REQ等报文。看得懂 ATT 层的状态码,是解决诡异蓝牙连接问题的分水岭。
-
3 搭建蓝牙调试环境
工作中的问题,调试蓝牙描述文件
前阵工作中遇到的。
iOS 和 iPadOS 支持的蓝牙描述文件 - 官方 Apple 支持 (中国)
在树莓派上定制蓝牙 Profile 通常需要修改或创建自定义的 Bluetooth 服务 (Profile) 来实现特定的功能,例如定制 Audio Sink、HID(Human Interface Device)、或 GATT(Generic Attribute Profile)服务。
以下是定制蓝牙 Profile 的步骤:
1. 安装蓝牙开发工具
确保树莓派上安装了必要的软件:
sudo apt update sudo apt install bluez bluez-tools
bluez: 树莓派的官方蓝牙协议栈。bluez-tools: 提供蓝牙管理的命令行工具。
2. 理解蓝牙 Profile
蓝牙 Profile 是蓝牙设备支持的特定功能集合,例如:
- GATT Profile:支持 BLE(蓝牙低功耗)服务。
- A2DP Profile:支持高质量音频传输。
- HID Profile:支持输入设备(如键盘和鼠标)。
选择需要定制的 Profile,并确定其实现方式。
3. 修改或创建自定义 Profile
A. 创建自定义 GATT 服务
使用
BlueZ提供的 GATT 接口,可以创建自定义的 GATT 服务和特征。
创建服务文件 在
/usr/lib/systemd/system/或自定义路径下创建 GATT 服务描述文件。编写 Python 示例(使用
dbus) 使用bluez和dbus的 Python 接口,定义 GATT 服务和特征:import dbus import dbus.service import dbus.mainloop.glib from gi.repository import GLib class CustomService(dbus.service.Object): PATH = '/com/example/service' def __init__(self, bus): dbus.service.Object.__init__(self, bus, self.PATH) @dbus.service.method('com.example.service', in_signature='s', out_signature='s') def Echo(self, message): print(f"Received: {message}") return f"Echo: {message}" if __name__ == "__main__": dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) system_bus = dbus.SystemBus() service = CustomService(system_bus) loop = GLib.MainLoop() print("Custom Bluetooth Service Running") loop.run()启动服务 确保脚本能够随系统启动运行:
sudo systemctl enable your-custom-service.service sudo systemctl start your-custom-service.service
B. 修改 BlueZ 配置
BlueZ 使用
.conf文件来配置默认 Profile。编辑/etc/bluetooth/main.conf或相关配置文件以启用/禁用某些 Profile。
4. 调试和验证
调试工具 使用以下工具调试蓝牙服务:
bluetoothctl: 蓝牙管理工具。hcitool: 检查蓝牙设备的状态。btmon: 查看蓝牙事件日志。验证 Profile 是否加载 使用
bluetoothctl验证 Profile 是否正常加载:bluetoothctl show验证服务功能 使用手机或其他蓝牙设备连接并测试自定义 Profile 的功能。
5. 进一步优化
- 如果需要长期运行,可以将自定义 Profile 打包成 Systemd 服务。
- 如果需要 BLE,建议了解 GATT 服务的规范并使用
BlueZ D-Bus API。
3 学习计划
使用树莓派5学习蓝牙开发是一个系统的过程,涵盖硬件配置、协议栈使用、编程实践和实际应用开发。以下是分阶段的学习路径:
---
### **一、硬件准备**
1. **树莓派5基础配置**
- 确保系统为最新版Raspberry Pi OS(Bookworm),自带蓝牙5.0/BLE支持:
```bash
sudo apt update && sudo apt upgrade
```
- 检查蓝牙硬件状态:
```bash
hciconfig -a # 查看蓝牙适配器(应显示hci0)
bluetoothctl --version # 确认蓝牙管理工具
```2. **外设扩展(可选)**
- **USB蓝牙适配器**:若需双模(经典蓝牙+BLE)或更高版本(如蓝牙5.2)。
- **BLE开发板**(如nRF52系列):用于双向设备开发测试。---
### **二、蓝牙协议栈与工具链**
1. **Linux蓝牙协议栈**
- **BlueZ**:官方蓝牙协议栈,提供命令行工具和DBus API:
```bash
sudo apt install vbluez-tools blueman
```
- 常用命令:
```bash
bluetoothctl # 交互式管理(扫描/配对/连接)
hcitool lescan # BLE设备扫描(旧版工具)
```2. **开发库选择**
- **Python库**(快速原型):
```bash
pip install pybluez dbus-python # 经典蓝牙
pip install bleak # BLE开发(推荐)
```
- **C/C++库**(高性能):
```bash
sudo apt install libbluetooth-dev # BlueZ开发头文件
```---
### **三、分阶段学习实践**
#### **阶段1:基础控制与扫描**
1. **通过`bluetoothctl`手动操作**
- 扫描并连接蓝牙耳机:
```bash
bluetoothctl
power on
scan on
pair <MAC地址>
connect <MAC地址>
```2. **Python脚本扫描BLE设备(使用Bleak)**
```python
from bleak import BleakScanner
async def scan_devices():
devices = await BleakScanner.discover()
for d in devices:
print(f"{d.name}: {d.address}")
import asyncio; asyncio.run(scan_devices())
```#### **阶段2:数据通信**
1. **BLE数据读写**
- 读取心率传感器数据(示例UUID):
```python
from bleak import BleakClient
HR_UUID = "00002a37-0000-1000-8000-00805f9b34fb"
async def read_hr(device_addr):
async with BleakClient(device_addr) as client:
hr = await client.read_gatt_char(HR_UUID)
print(f"Heart Rate: {int(hr[1])} bpm")
```2. **经典蓝牙文件传输**
- 使用PyBluez实现OBEX协议(需额外库如`obexftp`)。#### **阶段3:自定义服务开发**
1. **创建BLE外设(需BlueZ 5.50+)**
- 使用`bluetoothctl`注册GATT服务:
```bash
menu gatt
register-service 0x1234 # 自定义UUID
```2. **Python模拟BLE设备(Bleak示例)**
```python
from bleak import BleakServer
async def run_server():
server = BleakServer()
await server.start()
print("模拟设备地址:", server.address)
```---
### **四、进阶方向**
1. **蓝牙Mesh组网**
- 使用Zephyr OS或Silicon Labs方案配合树莓派作为边界路由器。2. **低延迟优化**
- 调整蓝牙参数(如MTU、连接间隔):
```bash
sudo hcitool lecup --handle <连接句柄> --min 6 --max 12
```3. **安全研究**
- 测试配对漏洞(如BLURtooth攻击)或嗅探(需Ubertooth硬件)。---
### **五、调试与工具**
- **Wireshark抓包**:
```bash
sudo apt install wireshark
sudo usermod -aG wireshark pi # 当前用户加入抓包组
```
- **蓝牙日志**:
```bash
sudo btmon # 实时监控HCI层数据
```---
### **六、推荐项目**
1. **智能家居网关**:通过树莓派桥接BLE传感器与Wi-Fi。
2. **蓝牙遥控车**:用手机APP控制树莓派GPIO。
3. **Beacon定位系统**:基于RSSI信号强度测距。---
### **注意事项**
- 树莓派5的蓝牙与Wi-Fi共用天线,密集2.4GHz环境可能干扰性能。
- 开发BLE应用时,优先使用`bleak`而非已弃用的`pybluez`。通过以上步骤,可系统掌握蓝牙协议栈、嵌入式开发及物联网应用集成。
(TODO)&spm=1001.2101.3001.5002&articleId=145368696&d=1&t=3&u=7eb357ee19a94ab08c82cd3f892e0cd5)
1190

被折叠的 条评论
为什么被折叠?



