首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >蓝牙4.0通讯协议

蓝牙4.0通讯协议

作者头像
用户1750537
发布2025-08-29 18:27:39
发布2025-08-29 18:27:39
10000
代码可运行
举报
运行总次数:0
代码可运行
蓝牙4.0 案例分析:心率监测系统

背景

蓝牙4.0(Bluetooth Low Energy, BLE)是一种低功耗无线通信协议,广泛应用于可穿戴设备、医疗设备和智能家居等领域。本案例设计一个心率监测系统,使用 BLE 将心率数据从传感器设备传输到手机应用。

系统需求
  1. 心率传感器设备
    • 读取心率数据。
    • 使用 BLE 广播心率信息。
  2. 手机端应用
    • 通过 BLE 接收心率数据。
    • 在应用中显示实时心率。

实现思路
  1. 硬件平台:ESP32 开发板(支持 BLE)。
  2. BLE 角色:
    • 心率传感器作为 BLE 外围设备(Peripheral)。
    • 手机作为 BLE 中心设备(Central)。
  3. BLE Profile:
    • 使用 Heart Rate Profile (HRP),遵循蓝牙规范。

代码实现
心率传感器代码(ESP32)

使用 Arduino IDE 和 ESP32 BLE 库实现。

代码语言:javascript
代码运行次数:0
运行
复制
#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 和 Dart)

手机端使用 Flutter 框架和 flutter_blue 插件。

pubspec.yaml
代码语言:javascript
代码运行次数:0
运行
复制
dependencies:
  flutter:
    sdk: flutter
  flutter_blue: ^0.8.0
手机端代码
代码语言:javascript
代码运行次数: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("断开连接"),
                  ),
                ],
              ),
      ),
    );
  }
}

步骤说明
  1. ESP32 设置
    • 使用 BLEDevice 库初始化 BLE 外围设备。
    • 设置心率服务(UUID 为 180D)和心率测量特性(UUID 为 2A37)。
    • 广播设备名称为 HeartRateMonitor
  2. 手机端开发
    • 使用 flutter_blue 扫描 BLE 设备。
    • 连接到名称为 HeartRateMonitor 的设备。
    • 订阅心率测量特性,接收心率数据并实时更新 UI。
  3. 测试
    • 使用 ESP32 开发板运行心率传感器代码。
    • 手机运行 Flutter 应用,连接 ESP32 并显示心率数据。

运行结果
  1. ESP32 开发板通过 BLE 广播模拟的心率数据(如 75 bpm)。
  2. 手机应用扫描到 ESP32,并订阅心率数据。
  3. 实时显示心率数据,并可随时断开连接。

扩展功能
  1. 实际传感器接入
    • 替换模拟心率为实际心率传感器(如 MAX30100)。
  2. 数据存储与分析
    • 将心率数据保存到本地或云端,进行长期健康趋势分析。
  3. 多设备支持
    • 同时支持多个心率传感器设备的连接。

总结

通过 BLE 的低功耗和规范化特性,本案例实现了简单的心率监测系统。蓝牙4.0 为实时数据传输和低功耗设计提供了理想选择,特别适合医疗设备和可穿戴领域。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 蓝牙4.0 案例分析:心率监测系统
    • 背景
  • 系统需求
  • 实现思路
  • 代码实现
    • 心率传感器代码(ESP32)
    • 手机端应用代码(基于 Flutter 和 Dart)
      • pubspec.yaml
      • 手机端代码
  • 步骤说明
  • 运行结果
  • 扩展功能
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档