Flutter极地数据展示插件carp_polar_package的使用
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
更多关于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'),
],
),
),
);
}
}
注意事项
-
真实设备连接:上述代码仅展示了如何配置
PolarSamplingPackage
,并没有实际连接到Polar设备或启动数据收集。在实际应用中,你需要使用CarpMobileSensingService
来启动和管理数据收集任务。 -
权限处理:在实际应用中,你需要处理设备权限(如访问心率传感器的权限),这通常涉及到在Android的
AndroidManifest.xml
和iOS的Info.plist
中添加相应的权限声明。 -
数据展示:上述代码中的心率和步数是模拟数据。在实际应用中,你需要从
CarpMobileSensingService
获取实时数据并更新UI。 -
错误处理:在实际应用中,你需要添加适当的错误处理逻辑,以处理设备连接失败、数据收集错误等情况。
这个示例提供了一个基本的框架,你可以在此基础上添加更多功能和细节,以满足你的具体需求。