- 版本:1.0.0
- GitHub: https://github.com/GeoTecINIT/awarns-framework
- NPM: https://npmjs.net.cn/package/%40awarns%2Fwear-os
- 下载
- 昨天: 3
- 上周: 6
- 上个月: 18
@awarns/wear-os
本模块允许收集 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
的数据收集只能启动一次,如果在执行startDetectingFastWatchAccelerometerChanges
后startDetectingWatchAccelerometerChanges
并在收集过程中,startDetectingFastWatchAccelerometerChanges
将被忽略。因此,如果您想在集合进行过程中动态更改集合的配置,您必须停止集合,然后再次以新的所需配置启动它。然而,由于底层的通信API(即蓝牙),任务的顺序无法保证。这意味着如果停止和启动任务在非常接近的时间内执行,启动任务可能会在智能手表上先于停止任务执行。如果您确实需要更改集合的配置,您应该在执行停止任务后等待一段时间(例如,1秒)再执行启动任务。
任务生成器参数
参数名称 | 类型 | 描述 |
---|---|---|
sensor |
WatchSensor |
用于收集数据的传感器。见下文。 |
providerConfiguration |
ProviderConfiguration |
任务的集合配置。见下文。 |
prefix (可选) |
字符串 |
将前缀添加到任务的名称中。对于为同一传感器创建多个任务但具有多个配置非常有用。 |
- WatchSensor
值 | 描述 |
---|---|
ACCELEROMETER |
代表手表的加速度计传感器。 |
GYROSCOPE |
代表手表的陀螺仪传感器。 |
MAGNETOMETER |
代表手表的磁力计传感器。 |
HEART_RATE |
代表手表的心率监测器。 |
GEOLOCATION |
代表手表的GPS系统。 |
- ProviderConfiguration
属性 | 类型 | 描述 |
---|---|---|
sensorDelay |
WatchSensorDelay | 数字 |
指示两个连续样本之间的时间。可以是WatchSensorDelay (即UI 、NORMAL 、GAME 或FASTEST )或以毫秒为单位的值。由于WatchSensorDelay 面向高采样率传感器,因此强烈建议使用(且高于1000毫秒)的值。 |
batchSize |
数字 |
指示每次记录中要传递的样本数量。 |
注意:Android OS将
sensorDelay
视为建议。样本可能以较小的或较高的速率传递。
任务输出事件
除了常规的
{task-name}Finished
事件外,这些任务在执行完成后不会产生显著的事件。然而,一旦启动任务完成运行,在数据收集活动期间,内部监听器会发出相关事件。以下列出了这些事件。
watchAccelerometerSamplesAcquired
watchGyroscopeSamplesAcquired
watchMagnetometerSamplesAcquired
watchHeartRateSamplesAcquired
watchGeolocationAcquired
在应用程序任务图中的示例用法
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 }));注意:要使用
writeRecords
或checkAreaOfInterestProximity
任务,必须安装并配置持久性或地理围栏包。分别参见持久性和地理围栏包文档。
停止传感器的数据收集
要注册这些任务以供使用,您只需在应用程序的任务列表中导入它们并调用它们的生成函数即可
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 |
三轴 |
包含具有加速度计传感器的x 、y 和z 值的样本列表。 |
watchGyroscopeSamplesAcquired |
三轴 |
包含具有陀螺仪传感器的x 、y 和z 值的样本列表。 |
watchMagnetometerSamplesAcquired |
三轴 |
包含具有磁力计传感器的x 、y 和z 值的样本列表。 |
watchHeartRateSamplesAcquired |
心率 |
包含心率传感器的值列表。 |
watchGeolocationAcquired |
地理位置 | Array |
包含一个或多个GNSS位置。如果将batchSize 设置为1,则负载将是一个Geolocation 记录。否则,负载将是一个Geolocation 数组。 |
plainMessageSent |
消息已发送 |
包含发送到手表的消息内容。 |
plainMessageSentAndResponseReceived |
消息已接收 |
包含发送到手表的消息内容和手表的响应。 |
纯消息已接收 |
消息已接收 |
包含从手表接收到的消息内容。 |
记录
三轴
属性 | 类型 | 描述 |
---|---|---|
id |
字符串 |
记录的唯一ID。 |
type |
字符串 |
以下值之一:watch-accelerometer 、watch-gyroscope 或watch-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