@awarns/wear-os
可靠且并发访问配对智能手表的传感器,并允许两设备之间的通信
npm i --save @awarns/wear-os

@awarns/wear-os

npm (scoped) npm

本模块允许收集 Android WearOS 智能手表传感器的数据,并允许两设备(即手机和智能手表)之间的通信。

此插件作为 nativescript-wearos-sensors 插件的上层封装,该插件允许与配对的 WearOS 智能手表进行通信和数据收集。为了使用这些功能,必须将 WearOS 智能手表与手机配对,并安装一个对应的应用程序,该应用程序使用 WearOSSensors WearOS 库开发。

注意:请检查两个库的要求以获取更多信息

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

ns plugin add @awarns/wear-os

用法

设置

此插件要求您在框架初始化期间注册其加载器,如下所示

// ... platform imports
import { awarns } from '@awarns/core';
import { demoTasks } from '../tasks';
import { demoTaskGraph } from '../graph';
import { registerWearOSPlugin } from '@awarns/wear-os';

awarns
.init(
demoTasks,
demoTaskGraph,
[
registerWearOSPlugin(config), // Parameter config is optional
]
)
// ... handle initialization promise

插件加载器参数 (WearOSPluginConfig)

参数 类型 描述
sensors? WatchSensor[] 启用指定的传感器。默认情况下,所有传感器都启用。
enablePlainMessaging? boolean 启用纯消息通信机制。默认:false
enableWearCommands? boolean 启用允许在手表侧启动数据收集的命令机制。默认:false

此外,您还必须指定您是否要使用这些插件功能以及您想使用哪个手表。这提供了使用或禁用这些插件功能而不修改任务图定义的可能性。例如,如果未配对手表可用,则可以禁用这些功能。以下是一个示例

import { getConnectedWatches, setWatchFeaturesState, useWatch } from '@awarns/wear-os';

export async function setupWatchToUse(): Promise<void> {
const watches = await getConnectedWatches();

if (watches.length === 0) {
console.log('No WearOS watches connected! Disabling wear-os plugin features...');
setWatchFeaturesState(false);
return;
}

const watch = watches[0];
console.log(`Setup wear-os plugin to use ${watch.name} watch!`);
setWatchFeaturesState(true);
useWatch(watch);
}

任务

任务名称 描述
startDetecting{prefix}Watch{sensor}Changes 允许启动具有特定配置(见下文)的 sensor 的数据收集。可以使用 prefix 来区分不同的配置。
stopDetectingWatch{sensor}Changes 上一任务的补充。允许停止从 sensor 收集数据。
sendPlainMessageToWatch 允许向配对的智能手表发送基于字符串的消息。使用示例可以是发送用于更新 UI 的信息。
sendPlainMessageToWatchAndAwaitResponse 允许向配对的智能手表发送基于字符串的消息,并等待其响应。

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

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

import { Task } from '@awarns/core/tasks';
import {
startDetectingWatchSensorChangesTask,
WatchSensor,
WatchSensorDelay,
} from '@awarns/wear-os';

export const demoTasks: Array<Task> = [
startDetectingWatchSensorChangesTask(WatchSensor.ACCELEROMETER, { sensorDelay: WatchSensorDelay.NORMAL, batchSize: 50 }),
// startDetectingWatchAccelerometerChanges

startDetectingWatchSensorChangesTask(WatchSensor.ACCELEROMETER, { sensorDelay: WatchSensorDelay.FASTEST, batchSize: 50 }, 'Fast'),
// startDetectingFastWatchAccelerometerChanges

startDetectingWatchSensorChangesTask(WatchSensor.HEART_RATE, { sensorDelay: WatchSensorDelay.NORMAL, batchSize: 5 }),
// startDetectingWatchHeartRateChanges

startDetectingWatchSensorChangesTask(WatchSensor.GEOLOCATION, { sensorDelay: 5000, batchSize: 5 }),
// startDetectingWatchGeolocationChanges
]

警告:对 WatchSensor 的数据收集只能启动一次,如果在执行 startDetectingFastWatchAccelerometerChangesstartDetectingWatchAccelerometerChanges 并在收集过程中,startDetectingFastWatchAccelerometerChanges 将被忽略。

因此,如果您想在集合进行过程中动态更改集合的配置,您必须停止集合,然后再次以新的所需配置启动它。然而,由于底层的通信API(即蓝牙),任务的顺序无法保证。这意味着如果停止和启动任务在非常接近的时间内执行,启动任务可能会在智能手表上先于停止任务执行。如果您确实需要更改集合的配置,您应该在执行停止任务后等待一段时间(例如,1秒)再执行启动任务。

任务生成器参数

参数名称 类型 描述
sensor WatchSensor 用于收集数据的传感器。见下文。
providerConfiguration ProviderConfiguration 任务的集合配置。见下文。
prefix (可选) 字符串 将前缀添加到任务的名称中。对于为同一传感器创建多个任务但具有多个配置非常有用。
  • WatchSensor
描述
ACCELEROMETER 代表手表的加速度计传感器。
GYROSCOPE 代表手表的陀螺仪传感器。
MAGNETOMETER 代表手表的磁力计传感器。
HEART_RATE 代表手表的心率监测器。
GEOLOCATION 代表手表的GPS系统。
  • ProviderConfiguration
属性 类型 描述
sensorDelay WatchSensorDelay | 数字 指示两个连续样本之间的时间。可以是WatchSensorDelay(即UINORMALGAMEFASTEST)或以毫秒为单位的值。由于WatchSensorDelay面向高采样率传感器,因此强烈建议使用(且高于1000毫秒)的值。
batchSize 数字 指示每次记录中要传递的样本数量。

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

任务输出事件

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

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

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

on('startEvent', run('startDetectingWatchAccelerometerChanges'));
on('startEvent', run('startDetectingWatchGyroscopeChanges'));
on('startEvent', run('startDetectingWatchMagnetometerChanges'));
on('startEvent', run('startDetectingWatchHeartRateChanges'));
on('startEvent', run('startDetectingWatchGeolocationChanges'));

on('watchAccelerometerSamplesAcquired', run('writeRecords'));
on('watchGyroscopeSamplesAcquired', run('writeRecords'));
on('watchMagnetometerSamplesAcquired', run('writeRecords'));
on('watchHeartRateSamplesAcquired', run('writeRecords'));
on('watchGeolocationAcquired', run('writeRecords'));
on('watchGeolocationAcquired', run('checkAreaOfInterestProximity', { nearbyRange: 100, offset: 15 }));

注意:要使用writeRecordscheckAreaOfInterestProximity任务,必须安装并配置持久性或地理围栏包。分别参见持久性地理围栏包文档。

停止传感器的数据收集

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

import { Task } from '@awarns/core/tasks';
import {
stopDetectingWatchSensorChangesTask,
WatchSensor,
} from '@awarns/wear-os';

export const demoTasks: Array<Task> = [
stopDetectingWatchSensorChangesTask(WatchSensor.ACCELEROMETER), // stopDetectingWatchAccelerometerChanges
stopDetectingWatchSensorChangesTask(WatchSensor.GYROSCOPE), // stopDetectingWatchGyroscopeChanges
stopDetectingWatchSensorChangesTask(WatchSensor.MAGNETOMETER), // stopDetectingWatchMagnetometerChanges
stopDetectingWatchSensorChangesTask(WatchSensor.HEART_RATE), // stopDetectingWatchHeartRateChanges
stopDetectingWatchSensorChangesTask(WatchSensor.GEOLOCATION), // stopDetectingWatchGeolocationChanges
];

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

任务生成器参数

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

任务输出事件

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

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

on('startEvent', run('startDetectingWatchAccelerometerChanges').every(1, 'minute'));
on('startEvent', run('startDetectingWatchGyroscopeChanges').every(1, 'minute'));
on('startEvent', run('startDetectingWatchMagnetometerChanges').every(1, 'minute'));
on('startEvent', run('startDetectingWatchHeartRateChanges').every(1, 'minute'));
on('startEvent', run('startDetectingWatchGeolocationChanges').every(1, 'minute'));

on('watchAccelerometerSamplesAcquired', run('stopDetectingWatchAccelerometerChanges'));
on('watchGyroscopeSamplesAcquired', run('stopDetectingWatchGyroscopeChanges'));
on('watchMagnetometerSamplesAcquired', run('stopDetectingWatchMagnetometerChanges'));
on('watchHeartRateSamplesAcquired', run('stopDetectingWatchHeartRateChanges'));
on('watchGeolocationAcquired', run('stopDetectingWatchGeolocationChanges'));

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

向配对手表发送消息

注意:要使用此功能,必须启用消息功能。

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

import { Task } from '@awarns/core/tasks';
import {
sendPlainMessageToWatchTask
} from '@awarns/wear-os';

export const demoTasks: Array<Task> = [
sendPlainMessageToWatchTask() // sendPlainMessageToWatch
];

任务生成器参数

此任务生成器不接收任何参数

任务输出事件

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

on('startEvent', run('sendPlainMessageToWatch', {
plainMessage: {
message: 'Hi from the smartphone!!'
}
}).every(1, 'minute'));

on('plainMessageSent', run('writeRecords'));

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

向配对手表发送消息并等待响应

注意:要使用此功能,必须启用消息功能。

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

import { Task } from '@awarns/core/tasks';
import {
sendPlainMessageToWatchAndAwaitResponseTask
} from '@awarns/wear-os';

export const demoTasks: Array<Task> = [
sendPlainMessageToWatchAndAwaitResponseTask() // sendPlainMessageToWatchAndAwaitResponse
];

任务生成器参数

此任务生成器不接收任何参数

任务输出事件

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

on('startEvent', run('sendPlainMessageToWatchAndAwaitResponse', {
plainMessage: {
message: 'Tell me something ;)'
},
timeout: 3000
}).every(1, 'minute'));

on('plainMessageSentAndResponseReceived', run('writeRecords'));

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

从事件的数据中发送消息

注意:要使用此功能,必须启用消息功能。

您还可以通过在触发其执行的事件中注入消息来调用这些任务。这允许以更灵活的方式发送消息(即不需要在任务图中指定消息)。

示例用法

import { awarns } from '@awarns/core';
import { PlainMessage } from '@awarns/wear-os';

export function sendMessage(message: PlainMessage) {
awarns.emitEvent('sendMessage', {
data: message
});
}

然后,在任务图中

on('sendMessage', run('sendPlainMessageToWatch'));

接收由监视器触发的消息

注意:要使用此功能,必须启用消息功能。

监视器也可以通过自己的方式向智能手机发送消息(即,无需先从智能手机接收消息,然后回复)。当这些消息被智能手机接收时,将触发plainMessageReceivedEvent事件。

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

on('plainMessageReceived', run('writeRecords'));

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

事件

名称 负载 描述
watchAccelerometerSamplesAcquired 三轴 包含具有加速度计传感器的xyz值的样本列表。
watchGyroscopeSamplesAcquired 三轴 包含具有陀螺仪传感器的xyz值的样本列表。
watchMagnetometerSamplesAcquired 三轴 包含具有磁力计传感器的xyz值的样本列表。
watchHeartRateSamplesAcquired 心率 包含心率传感器的值列表。
watchGeolocationAcquired 地理位置 | Array 包含一个或多个GNSS位置。如果将batchSize设置为1,则负载将是一个Geolocation记录。否则,负载将是一个Geolocation数组。
plainMessageSent 消息已发送 包含发送到手表的消息内容。
plainMessageSentAndResponseReceived 消息已接收 包含发送到手表的消息内容和手表的响应。
纯消息已接收 消息已接收 包含从手表接收到的消息内容。

记录

三轴

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

心率

属性 类型 描述
id 字符串 记录的唯一ID。
type 字符串 始终为watch-heart-rate
change 更改 始终为NONE
timestamp 日期 数据收集时的本地时间。它等于记录中第一个样本的时间。
samples HeartRateSample[] 包含收集到的样本的列表。
HeartRateSample
属性 类型 描述
value 数字 传感器报告的心率值。
timestamp 数字 收集样本时的本地时间(UNIX时间戳)。

地理位置

属性 类型 描述
id 字符串 记录的唯一ID。
type 字符串 始终为watch-geolocation
change 更改 始终为NONE
timestamp 日期 数据收集时的本地时间。它等于记录中第一个样本的时间。
latitude 数字 GPS报告的纬度。
longitude 数字 GPS报告的经度。
altitude 数字 GPS报告的高度。
verticalAccuracy 数字 纬度的估计误差。
horizontalAccuracy 数字 经度的估计误差。
speed 数字 当获取位置时设备的估计速度。
direction 数字 当获取位置时设备的估计方向。

消息已发送

属性 类型 描述
id 字符串 记录的唯一ID。
type 字符串 始终为plain-message-sent
change 更改 始终为NONE
timestamp 日期 发送消息时的本地时间。
content PlaiMessage 发送的消息内容。
PlainMessage
属性 类型 描述
message 字符串 消息内容。
inResponseTo? PlainMessage 可以包含一个PlainMessage,以指示当前消息是响应inResponseTo消息。

消息已接收

属性 类型 描述
id 字符串 记录的唯一ID。
type 字符串 始终为plain-message-received
change 更改 始终为NONE
timestamp 日期 发送消息时的本地时间。
content ReceivedMessage 接收到的消息内容。
ReceivedMessage
属性 类型 描述
senderNodeId 字符串 发送消息的手表的ID。
plainMessage PlainMessage 接收到的消息。

许可

Apache License Version 2.0