Flutter健康数据收集插件movisens_flutter的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter健康数据收集插件movisens_flutter的使用

安装

pubspec.yaml 文件中添加 movisens_flutter 作为依赖。对于如何添加依赖,请参阅文档。

此插件使用了 flutter_blue_plus 插件,因此使用此插件的应用程序应遵循 flutter_blue_plus 的设置指南。

Android

android/app/src/main/AndroidManifest.xml 中添加以下内容:

<!-- 告诉Google Play Store您的应用程序使用蓝牙LE
    如果蓝牙是必需的,则将android:required设置为true -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />

<!-- Android 12中的新蓝牙权限
https://developer.android.com/about/versions/12/features/bluetooth-permissions -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- 对于Android 11或更低版本的遗留权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/>

<!-- 对于Android 9或更低版本的遗留权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />

android/app/build.gradle 中的 minSdkVersion 至少设置为21:

android {
  defaultConfig {
      ...
      minSdkVersion 21
      ...
  }
}

iOS

ios/Runner/Info.plist 中添加以下内容:

<dict>
  <key>NSBluetoothAlwaysUsageDescription</key>
  <string>需要BLE权限</string>
  <key>NSBluetoothPeripheralUsageDescription</key>
  <string>需要BLE权限</string>
  <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
  <string>需要位置权限</string>
  <key>NSLocationAlwaysUsageDescription</key>
  <string>需要位置权限</string>
  <key>NSLocationWhenInUseUsageDescription</key>
  <string>需要位置权限</string>
</dict>

API

movisens_flutter 包是一个特定于Movisens的蓝牙API实现。

在顶层,您有一个 MovisensDevice。该设备具有一系列 MovisensService,这些服务将数据分为不同的类别。

如图所示,每个服务有1个或多个 MovisensBluetoothCharacteristics。每个特征是一种数据类型。它可以是传感器温度事件这样的数据流,也可以是删除数据这样的读写操作。

movisens_flutter设计

未记录的API

有4个服务和9个特性未在Movisens的文档中列出,因为它们是通用的蓝牙GATT规范的一部分,但已添加到此插件中。以下是它们的名称和UUID列表。电池服务、心率服务和用户数据服务已添加到特定于Movisens的实现中,以简化插件API。

  • SERVICE: 0000180f-0000-1000-8000-00805f9b34fb // BATTERY SERVICE(添加到电池服务)

    • 00002a19-0000-1000-8000-00805f9b34fb // 电池级别
  • SERVICE: 0000180a-0000-1000-8000-00805f9b34fb // DEVICE INFORMATION SERVICE

    • 00002a26-0000-1000-8000-00805f9b34fb // 固件修订字符串
    • 00002a29-0000-1000-8000-00805f9b34fb // 制造商名称字符串
    • 00002a24-0000-1000-8000-00805f9b34fb // 模型编号字符串
    • 00002a25-0000-1000-8000-00805f9b34fb // 序列号字符串
  • SERVICE: 0000180d-0000-1000-8000-00805f9b34fb // HEART RATE SERVICE(添加到HRV服务)

    • 00002a37-0000-1000-8000-00805f9b34fb // 心率测量
  • SERVICE: 0000181c-0000-1000-8000-00805f9b34fb // USER DATA SERVICE(添加到用户数据服务)

    • 00002a8c-0000-1000-8000-00805f9b34fb // 性别
    • 00002a8e-0000-1000-8000-00805f9b34fb // 身高
    • 00002a98-0000-1000-8000-00805f9b34fb // 体重

示例用法

初始化

要连接到Movisens设备,必须知道其名称。 使用名称可以创建一个 MovisensDevice 并连接。

为什么使用名称而不是MAC地址?

iOS不提供BLE设备的MAC地址 - 相反,它们使用生成的UUID,每个手机都不同。 这意味着单个设备在两部不同的iPhone上会有不同的ID,无法用于定位特定设备。

连接可能需要多达10秒,因为设备必须连接并加载所有功能。

// 设备的名称
String deviceName = "MOVISENS Sensor 03348";

MovisensDevice device = MovisensDevice(name: deviceName);

// 连接到设备
await device.connect();

开始监听流

要监听Movisens设备,必须启用设备在记录数据时通知你。 这是通过 enableNotify() 完成的,它启用了服务中的所有特征(即事件类型)。

// 启用设备发出每个服务的所有事件:
await device.ambientService?.enableNotify();
await device.edaService?.enableNotify();
await device.hrvService?.enableNotify();
await device.markerService?.enableNotify();
await device.batteryService?.enableNotify();
await device.physicalActivityService?.enableNotify();
await device.respirationService?.enableNotify();
await device.sensorControlService?.enableNotify();
await device.skinTemperatureService?.enableNotify();
await device.deviceInformationService?.enableNotify();

一旦启用服务,您可以监听该服务的 events 流,其中包含该服务中所有特征发出的所有数据。

或者,您可以监听每个特定特征,例如 skinTemperatureEvents 并仅接收该类型的事件。

请注意阅读有关记录数据事件的时间戳部分的重要信息。

使用读/写函数

某些特征不是流式传输的,必须使用读/写操作。 例如,从设备删除数据需要写入设备。

await device.sensorControlService?.setDeleteData(true);

这将在设备上删除数据,前提是没有正在进行的测量。

断开连接

要停止监听并断开连接,只需调用设备上的 disconnect() 方法。

await device.disconnect();

更多关于Flutter健康数据收集插件movisens_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter健康数据收集插件movisens_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 movisens_flutter 插件在 Flutter 应用中收集健康数据的示例代码。这个插件主要用于与 Movisens 设备进行数据交互,比如收集加速度计、心率等传感器数据。

首先,确保你已经在 pubspec.yaml 文件中添加了 movisens_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  movisens_flutter: ^最新版本号  # 请替换为实际的最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 应用中实现设备连接和数据收集。以下是一个简单的示例代码:

import 'package:flutter/material.dart';
import 'package:movisens_flutter/movisens_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  MovisensClient? _movisensClient;
  String _deviceStatus = "Not Connected";
  List<Map<String, dynamic>> _sensorData = [];

  @override
  void initState() {
    super.initState();
    initMovisensClient();
  }

  Future<void> initMovisensClient() async {
    _movisensClient = await MovisensClient.create();
    _movisensClient!.onDeviceStatusChanged!.listen((status) {
      setState(() {
        _deviceStatus = status == DeviceStatus.connected
            ? "Connected"
            : "Not Connected";
      });
    });

    _movisensClient!.onSensorDataReceived!.listen((data) {
      setState(() {
        _sensorData.add(data);
      });
    });
  }

  Future<void> connectToDevice() async {
    if (_movisensClient!.deviceStatus == DeviceStatus.disconnected) {
      await _movisensClient!.connect();
    } else {
      print("Already connected to the device.");
    }
  }

  Future<void> startDataCollection() async {
    if (_movisensClient!.deviceStatus == DeviceStatus.connected) {
      await _movisensClient!.startDataCollection(
        samplingRate: 10, // 设置采样率,根据需求调整
        sensorTypes: [SensorType.accelerometer], // 选择需要收集的传感器类型
      );
    } else {
      print("Device is not connected. Please connect first.");
    }
  }

  Future<void> stopDataCollection() async {
    if (_movisensClient!.deviceStatus == DeviceStatus.connected) {
      await _movisensClient!.stopDataCollection();
    } else {
      print("Device is not connected. Cannot stop data collection.");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Movisens Flutter Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Device Status: $_deviceStatus'),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: connectToDevice,
                child: Text('Connect to Device'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: startDataCollection,
                child: Text('Start Data Collection'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: stopDataCollection,
                child: Text('Stop Data Collection'),
              ),
              SizedBox(height: 20),
              Expanded(
                child: ListView.builder(
                  itemCount: _sensorData.length,
                  itemBuilder: (context, index) {
                    return ListTile(
                      title: Text('Data Point ${index + 1}'),
                      subtitle: Text(_sensorData[index].toString()),
                    );
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _movisensClient?.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个 MovisensClient 实例,并监听了设备状态变化和传感器数据接收事件。通过按钮控制设备的连接、开始数据收集和停止数据收集。收集到的数据会存储在一个列表中,并在 UI 中展示出来。

请注意,这只是一个基础示例,实际应用中你可能需要根据具体需求进行更多的配置和处理,比如错误处理、设备兼容性检查等。同时,确保你的设备已经正确配对,并且 movisens_flutter 插件的版本与你的设备兼容。

回到顶部