Flutter极地数据展示插件carp_polar_package的使用

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

Flutter极地数据展示插件carp_polar_package的使用

本库包含一个用于 carp_mobile_sensing 框架的采样包,以与Polar心率设备一起工作。该包支持以下类型的 Measure(注意,该包定义了自己的命名空间 dk.cachet.carp.polar):

  • dk.cachet.carp.polar.accelerometer : 加速度计
  • dk.cachet.carp.polar.gyroscope : 陀螺仪
  • dk.cachet.carp.polar.magnetometer : 磁力计
  • dk.cachet.carp.polar.ecg : 心电图 (ECG)
  • dk.cachet.carp.polar.ppi : 脉搏间隔 (PPI)
  • dk.cachet.carp.polar.ppg : 光电容积描记法 (PPG)
  • dk.cachet.carp.polar.hr : 心率

该包使用了基于官方Polar API的Flutter插件 polar。支持以下设备:

  • H10心率传感器
  • H9心率传感器
  • Polar Verity Sense光学心率传感器

查看 carp_mobile_sensing维基 获取更多文档,特别是关于可用的测量类型。 查看CARP移动感知应用 以了解如何在Flutter中构建移动感知应用。此演示应用还包括对Polar采样包的支持。

对于其他CARP产品的Flutter插件,请参见CARP移动感知在Flutter

如果你有兴趣编写自己的CARP采样包,请参阅维基上的说明,了解如何扩展 CARP。

安装

要使用此包,请将以下内容添加到你的 pubspec.yaml 文件中。请注意,此包只能与 carp_mobile_sensing 一起使用。

dependencies:
  flutter:
    sdk: flutter
  carp_core: ^latest
  carp_mobile_sensing: ^latest
  carp_polar_package: ^latest

Android集成

查看官方Polar描述中的Android: Getting Started

在你的app的 manifest.xml 文件中添加以下内容(位于 android/app/src/main):

<!-- Polar SDK需要蓝牙扫描权限来搜索BLE设备。Polar BLE SDK不使用扫描来决定位置,因此可以使用"neverForLocation"权限标志。-->
<uses-permission
    android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />

<!-- Polar SDK需要蓝牙连接权限来连接找到的BLE设备。-->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- 允许Polar SDK连接已配对的蓝牙设备。旧版蓝牙权限,适用于API 30(Android Q)或更早版本的设备。 -->
<uses-permission
    android:name="android.permission.BLUETOOTH"
    android:maxSdkVersion="30" />

<!-- 允许Polar SDK发现和配对蓝牙设备。旧版蓝牙权限,适用于API 30(Android Q)或更早版本的设备。 -->
<uses-permission
    android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />

<!-- Polar SDK需要精确定位权限才能获取蓝牙扫描结果。在API 30(Android Q)的设备上请求精确定位权限。注意,如果您的应用程序需要定位来执行其他用途,则删除android:maxSdkVersion="30" -->
<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="30" />

<!-- 如果请求了精确定位权限,则需要粗略定位权限。在API 30(Android Q)的设备上请求粗略定位权限。注意,如果您的应用程序需要定位来执行其他用途,则删除android:maxSdkVersion="30" -->
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:maxSdkVersion="30" />

注意: 第一次启动应用时,确保允许其访问手机的位置。这是在Android上使用BLE所必需的。

iOS集成

查看官方Polar描述中的iOS: Getting Started

需要iOS 14或更高版本。因此,在你的app的 Podfile 文件中(位于 ios 文件夹),确保平台设置为 14.0

platform :ios, '14.0'
  • 在项目目标设置中启用后台模式,并添加“使用蓝牙LE配件”
  • 在项目目标属性列表中添加键 <a href="https://developer.apple.com/documentation/bundleresources/information_property_list/nsbluetoothalwaysusagedescription" rel="ugc">NSBluetoothAlwaysUsageDescription</a>

Info.plist 文件中(位于 ios/Runner)添加以下权限:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>Uses bluetooth to connect to the Polar device</string>
<key>UIBackgroundModes</key>
<array>
  <string>bluetooth-central</string>
</array>

使用它

要使用此包,请将其导入到你的app中,与 carp_mobile_sensing 包一起使用:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_polar_package/carp_polar_package.dart';

收集Polar测量值可以像这样添加到研究协议中。

// 创建一个研究协议
StudyProtocol protocol = StudyProtocol(
  ownerId: 'owner@dtu.dk',
  name: 'Polar Sensing Example',
);

// 定义用于数据收集的设备 - 手机和eSense
var phone = Smartphone();
var polar = PolarDevice(
  roleName: 'hr-sensor',
  identifier: '1C709B20',
  name: 'H10',
  polarDeviceType: PolarDeviceType.H10,
);

protocol
  ..addPrimaryDevice(phone)
  ..addConnectedDevice(polar);

// 添加一个立即开始收集HR和ECG数据的后台任务
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: PolarSamplingPackage.HR),
      Measure(type: PolarSamplingPackage.ECG),
    ]),
    polar);

在执行带有Polar测量值的研究之前,在 SamplingPackageRegistry 中注册此包。

SamplingPackageRegistry().register(PolarSamplingPackage());

注意: 在电话可以通过BLE连接到设备之前,必须指定Polar设备的 identifier。这意味着Polar设备及其探头不应该在知道设备标识符之前连接和恢复。

还要注意的是,该包不处理蓝牙扫描/连接的权限。这应该在应用级别进行处理。

示例代码

这是一个非常简单的示例,展示了如何将此采样包作为CARP移动感知(CAMS)的一部分来定义研究协议。请注意,下面的代码本身无法运行。研究协议需要在CAMS框架中部署和执行。

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_polar_package/carp_polar_package.dart';

/// 这是一个非常简单的示例,展示了如何将此采样包作为CARP移动感知(CAMS)的一部分来定义研究协议。
///
/// 注意,下面的代码本身无法运行。研究协议需要在CAMS框架中部署和执行。
///
/// 查看如何使用CAMS的文档:
/// https://github.com/cph-cachet/carp.sensing-flutter/wiki
void main() async {
  // 注册此采样包,在使用其测量值之前
  SamplingPackageRegistry().register(PolarSamplingPackage());

  // 创建一个研究协议
  StudyProtocol protocol = StudyProtocol(
    ownerId: 'owner@dtu.dk',
    name: 'Polar Sensing Example',
  );

  // 定义用于数据收集的设备 - 手机和eSense
  var phone = Smartphone();
  var polar = PolarDevice(
    roleName: 'hr-sensor',
    identifier: '1C709B20',
    name: 'H10',
    polarDeviceType: PolarDeviceType.H10,
  );

  protocol
    ..addPrimaryDevice(phone)
    ..addConnectedDevice(polar, phone);

  // 添加一个立即开始收集步数、环境光、屏幕活动和电池状态的后台任务
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask()
        ..addMeasure(Measure(type: SensorSamplingPackage.STEP_COUNT))
        ..addMeasure(Measure(type: SensorSamplingPackage.AMBIENT_LIGHT))
        ..addMeasure(Measure(type: DeviceSamplingPackage.SCREEN_EVENT))
        ..addMeasure(Measure(type: DeviceSamplingPackage.BATTERY_STATE)),
      phone);

  // 添加一个立即开始收集HR和ECG数据的后台任务
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(measures: [
        Measure(type: PolarSamplingPackage.HR),
        Measure(type: PolarSamplingPackage.ECG),
      ]),
      polar);
}

更多关于Flutter极地数据展示插件carp_polar_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter极地数据展示插件carp_polar_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter极地数据展示插件carp_polar_package的代码示例。这个插件通常用于在移动设备上展示健康或运动数据,如心率、步数等。为了简单起见,我们假设你已经设置好了Flutter开发环境,并且已经添加了这个插件到你的pubspec.yaml文件中。

首先,确保你的pubspec.yaml文件中包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  carp_core: ^x.y.z  # 根据最新版本号替换
  carp_mobile_sensing: ^x.y.z  # 根据最新版本号替换
  carp_polar_package: ^x.y.z  # 根据最新版本号替换

然后运行flutter pub get来安装这些依赖。

接下来,我们创建一个简单的Flutter应用来展示如何使用carp_polar_package

main.dart

import 'package:flutter/material.dart';
import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_polar_package/carp_polar_package.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Polar Data Display',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PolarDataScreen(),
    );
  }
}

class PolarDataScreen extends StatefulWidget {
  @override
  _PolarDataScreenState createState() => _PolarDataScreenState();
}

class _PolarDataScreenState extends State<PolarDataScreen> {
  late StudyProtocol _studyProtocol;

  @override
  void initState() {
    super.initState();
    // 初始化一个研究协议
    _studyProtocol = StudyProtocol(
      ownerId: 'test-owner',
      studyId: 'test-study',
      name: 'Polar Data Display Study',
      description: 'A study to demonstrate the use of carp_polar_package',
      consentFormAssets: [],
      triggerSchedule: TriggerSchedule(),
      samplingPackages: [
        PolarSamplingPackage()  // 添加PolarSamplingPackage
          ..add(PolarHeartRateSensorTask())  // 添加心率任务
          ..add(PolarStepsSensorTask()),  // 添加步数任务
      ],
    );

    // 这里通常会启动数据收集,但为了简化,我们仅展示如何配置
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Polar Data Display'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              'Study Protocol:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              '${_studyProtocol.name}\n${_studyProtocol.description}',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 这里可以添加启动数据收集的代码
                // 例如使用CarpMobileSensingService.start(...)
                print('Start data collection (mock)');
              },
              child: Text('Start Data Collection'),
            ),
            SizedBox(height: 20),
            // 模拟显示心率和步数(这里应该使用从Polar设备获取的实际数据)
            Text('Simulated Data Display:'),
            SizedBox(height: 10),
            Text('Heart Rate: 72 bpm'),
            SizedBox(height: 10),
            Text('Steps: 10,000'),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 真实设备连接:上述代码仅展示了如何配置PolarSamplingPackage,并没有实际连接到Polar设备或启动数据收集。在实际应用中,你需要使用CarpMobileSensingService来启动和管理数据收集任务。

  2. 权限处理:在实际应用中,你需要处理设备权限(如访问心率传感器的权限),这通常涉及到在Android的AndroidManifest.xml和iOS的Info.plist中添加相应的权限声明。

  3. 数据展示:上述代码中的心率和步数是模拟数据。在实际应用中,你需要从CarpMobileSensingService获取实时数据并更新UI。

  4. 错误处理:在实际应用中,你需要添加适当的错误处理逻辑,以处理设备连接失败、数据收集错误等情况。

这个示例提供了一个基本的框架,你可以在此基础上添加更多功能和细节,以满足你的具体需求。

回到顶部