@awarns/phone-sensors
智能手机传感器的可靠并发访问
npm i --save @awarns/phone-sensors

@awarns/phone-sensors

npm (scoped) npm

本模块允许从移动设备内嵌的IMU传感器(即加速度计和陀螺仪)和磁力计收集数据。

此插件作为 BackgroundSensors Android 库的包装器,即使在应用处于后台或设备空闲时也能启用数据收集。此模块提供启动和停止数据收集过程的任务。

使用以下命令行指令安装插件

ns plugin add @awarns/phone-sensors

用法

安装此插件后,您将能够访问两个任务组,每组包含两个任务,用于启动和停止数据收集过程。这两个任务组之间的主要区别在于用于数据收集的底层服务的实现。一个组使用标准数据收集服务,但另一个组使用一个特殊的服务,该服务将系统时钟与NTP服务器同步,以便对收集的数据进行最精确的时间戳标记。从传感器收集的数据将是一个 三轴 记录,如下所述。

设置(可选)

此插件可以在框架初始化期间使用其加载器进行可选注册

// ... platform imports
import { awarns } from '@awarns/core';
import { demoTasks } from '../tasks';
import { demoTaskGraph } from '../graph';
import { registerPhoneSensorsPlugin } from '@awarns/phone-sensors';

awarns
.init(
demoTasks,
demoTaskGraph,
[
registerPhoneSensorsPlugin({
enableVibrationOnStart: false
})
]
)
// ... handle initialization promise

插件加载器参数选项

属性 类型 描述
enableVibrationOnStart boolean (可选) 启用或禁用在数据收集服务启动时生成振动。默认启用。

如果插件未注册,则 振动默认启用

警告:由于操作系统施加的限制,插件只能注册一次(即第一次初始化插件)。换句话说,如果插件首先使用 enableVibrationOnStart 注册为 true,然后开发人员想禁用振动,将 enableVibrationOnStart 设置为 false 将没有任何效果。如果您想更改 enableVibrationOnStart 的值,您将不得不卸载应用程序。

任务

标准收集服务任务

任务名称 描述
startDetecting{prefix}Phone{sensor}Changes 允许以特定配置(见下文)启动对 sensor 的数据收集。可以使用 prefix 来区分不同的配置。
stopDetectingPhone{sensor}Changes 前一个任务的补充。允许停止从 sensor 收集数据。

NTP 同步收集服务任务

任务名称 描述
startDetecting{prefix}PhoneNTPSynced{sensor}Changes 允许以特定配置(见下文)启动对 sensor 的数据收集。在开始收集之前,系统时钟将与NTP服务器同步,以便对收集的数据进行准确的时间戳标记。可以使用 prefix 来区分不同的配置。
stopDetectingPhoneNTPSynced{sensor}Changes 前一个任务的补充。允许停止从 sensor 收集数据。

以特定配置启动对传感器的数据收集

要注册这些任务以供使用,您只需在应用程序的任务列表中导入它们并调用它们的生成函数即可

import { Task } from '@awarns/core/tasks';
import {
startDetectingPhoneSensorChangesTask,
PhoneSensor,
SensorDelay,
} from '@awarns/phone-sensors';

export const demoTasks: Array<Task> = [
startDetectingPhoneSensorChangesTask(PhoneSensor.ACCELEROMETER, { sensorDelay: SensorDelay.NORMAL, batchSize: 50 }),
// startDetectingPhoneAccelerometerChanges

startDetectingPhoneSensorChangesTask(PhoneSensor.ACCELEROMETER, { sensorDelay: SensorDelay.FASTEST, batchSize: 50 }, 'Fast'),
// startDetectingFastPhoneAccelerometerChanges

startDetectingPhoneSensorChangesTask(PhoneSensor.GYROSCOPE, { sensorDelay: SensorDelay.NORMAL, batchSize: 50 }),
// startDetectingPhoneGyroscopeChanges

startDetectingPhoneNTPSyncedSensorChangesTask(PhoneSensor.GYROSCOPE, { sensorDelay: SensorDelay.NORMAL, batchSize: 50 }),
// startDetectingPhoneNTPSyncedGyroscopeChanges

startDetectingPhoneSensorChangesTask(PhoneSensor.MAGNETOMETER, { sensorDelay: SensorDelay.NORMAL, batchSize: 50 }),
// startDetectingPhoneMagnetometerChanges

];

警告:对于PhoneSensor的数据收集只能启动一次,如果在startDetectingPhoneAccelerometerChanges执行之后,且数据收集正在进行时,再次执行startDetectingFastPhoneAccelerometerChanges,则startDetectingFastPhoneAccelerometerChanges将被忽略。因此,如果您想在数据收集过程中动态更改收集的配置,您将必须停止收集,然后再使用新的期望配置重新启动。

任务生成器参数

参数名称 类型 描述
sensor PhoneSensor 用于收集数据的天线。见下文。
providerConfiguration ProviderConfiguration 任务的收集配置。见下文。
prefix (可选) 字符串 将前缀添加到任务的名称中。对于为同一传感器创建具有多个配置的多个任务非常有用。
  • PhoneSensor
描述
ACCELEROMETER 表示手机的加速度计传感器。
GYROSCOPE 表示手机的陀螺仪传感器。
MAGNETOMETER 表示手机的磁力计传感器。
  • ProviderConfiguration
属性 类型 描述
sensorDelay SensorDelay | 数字 指示两个连续样本之间的时间。可以是SensorDelay(即UINORMALGAMEFASTEST)或以毫秒为单位的值。
batchSize 数字 指示每个记录中要传递的样本数量。

注意:Android OS将sensorDelay视为建议。样本可能会以更小或更高的速率传递。

任务输出事件

这些任务在执行完成后不会产生显著事件,除了常规的{task-name}Finished事件。

然而,一旦启动任务完成运行,在数据收集活动期间,内部监听器将发出相关事件。以下列出这些事件。

在应用程序任务图中的示例使用

on('startEvent', run('startDetectingPhoneAccelerometerChanges'));
on('startEvent', run('startDetectingPhoneGyroscopeChanges'));
on('startEvent', run('startDetectingPhoneMagnetometerChanges'));

on('accelerometerSamplesAcquired', run('writeRecords'));
on('gyroscopeSamplesAcquired', run('writeRecords'));
on('magnetometerSamplesAcquired', run('writeRecords'));

注意:要使用writeRecords任务,必须安装并配置持久化包。见持久化包文档

停止传感器的数据收集

要注册这些任务以供使用,您只需在应用程序的任务列表中导入它们并调用它们的生成函数即可

import { Task } from '@awarns/core/tasks';
import {
stopDetectingPhoneSensorChangesTask,
PhoneSensor,
} from '@awarns/phone-sensors';

export const demoTasks: Array<Task> = [
stopDetectingPhoneSensorChangesTask(PhoneSensor.ACCELEROMETER), // stopDetectingPhoneAccelerometerChanges
stopDetectingPhoneNTPSyncedSensorChangesTask(PhoneSensor.GYROSCOPE), // stopDetectingPhoneNTPSyncedGyroscopeChanges
stopDetectingPhoneSensorChangesTask(PhoneSensor.MAGNETOMETER), // stopDetectingPhoneMagnetometerChanges
];

注意:可以使用特定PhoneSensor的停止任务来停止由任何启动任务为该PhoneSensor启动的数据收集,无论具体的配置如何。

任务生成器参数

参数名称 类型 描述
sensor WatchSensor 停止数据收集的传感器。

任务输出事件

这些任务在执行完成后不会产生显著事件,除了常规的{task-name}Finished事件。

在应用程序任务图中的示例使用

on('startEvent', run('startDetectingPhoneAccelerometerChanges').every(1, 'minute'));
on('startEvent', run('startDetectingPhoneNTPSyncedGyroscopeChanges').every(1, 'minute'));
on('startEvent', run('startDetectingPhoneMagnetometerChanges').every(1, 'minute'));

on('accelerometerSamplesAcquired', run('stopDetectingPhoneAccelerometerChanges'));
on('gyroscopeSamplesAcquired', run('stopDetectingPhoneNTPSyncedGyroscopeChanges'));
on('magnetometerSamplesAcquired', run('stopDetectingPhoneMagnetometerChanges'));

注意:在不使用其互补任务启动数据收集之前使用这些任务是没有意义的。

事件

名称 有效载荷 描述
accelerometerSamplesAcquired TriAxial 包含加速度计传感器的xyz值的样本列表。
gyroscopeSamplesAcquired TriAxial 包含陀螺仪传感器的xyz值的样本列表。
magnetometerSamplesAcquired TriAxial 包含磁力计传感器的xyz值的样本列表。

记录

TriAxial

属性 类型 描述
id 字符串 记录的唯一ID。
type 字符串 以下值之一:accelerometergyroscopemagnetometer
change 更改 始终为NONE
timestamp 日期 收集数据时的本地时间。等于记录中第一个样本的时间。
samples TriAxialSample[] 包含收集样本的列表。
TriAxialSample
属性 类型 描述
x 数字 传感器的x值。
y 数字 传感器的y值。
z 数字 传感器的z值。
timestamp 数字 收集样本时的本地时间(UNIX时间戳)。

许可

Apache License Version 2.0