蓝牙4.0(Bluetooth Low Energy, BLE)是一种低功耗无线通信协议,广泛应用于可穿戴设备、医疗设备和智能家居等领域。本案例设计一个心率监测系统,使用 BLE 将心率数据从传感器设备传输到手机应用。
使用 Arduino IDE 和 ESP32 BLE 库实现。
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// UUID 定义
#define SERVICE_UUID "180D" // 心率服务 UUID
#define CHARACTERISTIC_UUID "2A37" // 心率测量特性 UUID
BLEServer *pServer = nullptr;
BLECharacteristic *pCharacteristic = nullptr;
bool deviceConnected = false;
uint8_t heartRate = 75; // 初始心率
// 连接回调类
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("设备已连接");
}
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("设备已断开连接");
}
};
void setup() {
Serial.begin(115200);
// 初始化 BLE 设备
BLEDevice::init("HeartRateMonitor");
// 创建 BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// 创建心率服务
BLEService *pService = pServer->createService(SERVICE_UUID);
// 创建心率测量特性
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
// 启动服务
pService->start();
// 开始广播
pServer->getAdvertising()->start();
Serial.println("开始广播");
}
void loop() {
if (deviceConnected) {
// 模拟心率数据更新
heartRate = random(60, 100);
// 打包心率数据(按照蓝牙规范)
uint8_t heartRateData[2] = {0x00, heartRate}; // 标志位 + 心率值
pCharacteristic->setValue(heartRateData, sizeof(heartRateData));
pCharacteristic->notify(); // 通知中心设备
Serial.printf("发送心率数据: %d bpm\n", heartRate);
}
delay(1000); // 每秒更新一次
}
手机端使用 Flutter 框架和 flutter_blue 插件。
dependencies:
flutter:
sdk: flutter
flutter_blue: ^0.8.0
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() => runApp(HeartRateApp());
class HeartRateApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Heart Rate Monitor',
home: HeartRateScreen(),
);
}
}
class HeartRateScreen extends StatefulWidget {
@override
_HeartRateScreenState createState() => _HeartRateScreenState();
}
class _HeartRateScreenState extends State<HeartRateScreen> {
FlutterBlue flutterBlue = FlutterBlue.instance;
BluetoothDevice? connectedDevice;
BluetoothCharacteristic? heartRateCharacteristic;
int heartRate = 0;
@override
void initState() {
super.initState();
scanForDevices();
}
void scanForDevices() {
flutterBlue.startScan(timeout: Duration(seconds: 5));
flutterBlue.scanResults.listen((results) {
for (ScanResult r in results) {
if (r.device.name == "HeartRateMonitor") {
connectToDevice(r.device);
flutterBlue.stopScan();
break;
}
}
});
}
void connectToDevice(BluetoothDevice device) async {
await device.connect();
setState(() {
connectedDevice = device;
});
// 获取服务
List<BluetoothService> services = await device.discoverServices();
for (BluetoothService service in services) {
if (service.uuid.toString() == "180d") {
for (BluetoothCharacteristic c in service.characteristics) {
if (c.uuid.toString() == "2a37") {
heartRateCharacteristic = c;
// 订阅心率数据
c.setNotifyValue(true);
c.value.listen((value) {
setState(() {
heartRate = value[1]; // 第二字节是心率值
});
});
}
}
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Heart Rate Monitor')),
body: Center(
child: connectedDevice == null
? Text("扫描中,请稍候...")
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"心率: $heartRate bpm",
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
connectedDevice?.disconnect();
setState(() {
connectedDevice = null;
heartRate = 0;
});
},
child: Text("断开连接"),
),
],
),
),
);
}
}
BLEDevice
库初始化 BLE 外围设备。HeartRateMonitor
。flutter_blue
扫描 BLE 设备。HeartRateMonitor
的设备。通过 BLE 的低功耗和规范化特性,本案例实现了简单的心率监测系统。蓝牙4.0 为实时数据传输和低功耗设计提供了理想选择,特别适合医疗设备和可穿戴领域。