You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于NativeScript开发Wear OS应用:心率传感器访问与MQTT传输问题

嘿,我来帮你搞定这个问题!NativeScript确实对Wear OS的文档支持不足,但咱们可以直接调用Android原生API来访问心率传感器,再配合MQTT插件完成数据发送。下面是一步步的实现方案:

实现步骤

1. 配置Android权限

首先得在AndroidManifest里添加传感器权限,因为心率传感器属于身体传感器权限范畴。打开App_Resources/Android/src/main/AndroidManifest.xml,添加以下内容:

<uses-permission android:name="android.permission.BODY_SENSORS" />
<uses-feature android:name="android.hardware.sensor.heart_rate" android:required="false" />

2. 动态申请传感器权限

Android 6.0及以上版本需要动态申请敏感权限,所以咱们得先请求用户授权:

import { Permissions } from "@nativescript/core";

async function requestHeartRatePermission() {
    const permissionStatus = await Permissions.requestPermission(android.Manifest.permission.BODY_SENSORS);
    if (permissionStatus === "granted") {
        // 权限通过,初始化传感器
        setupHeartRateSensor();
    } else {
        console.error("用户拒绝了心率传感器权限,无法获取数据");
        // 这里可以给用户弹窗提示需要权限才能使用功能
    }
}

// 在页面加载时调用权限请求,比如pageLoaded事件里
// 如果你用Angular,就在ngOnInit里调用
requestHeartRatePermission();

3. 访问心率传感器(调用Android原生API)

NativeScript允许直接调用Android的SensorManager,咱们用它来获取心率传感器数据:

import { Application } from "@nativescript/core";
import { Sensor, SensorEvent, SensorEventListener, SensorManager } from "@nativescript/core/android";

let sensorManager: SensorManager;
let heartRateSensor: Sensor;
let sensorListener: SensorEventListener;

function setupHeartRateSensor() {
    const androidContext = Application.android.context;
    sensorManager = androidContext.getSystemService(android.content.Context.SENSOR_SERVICE) as SensorManager;
    heartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);

    if (!heartRateSensor) {
        console.error("当前设备不支持心率传感器");
        return;
    }

    // 创建传感器监听器,处理心率数据
    sensorListener = new (java.lang.Object.extend({
        onSensorChanged: function(event: SensorEvent) {
            if (event.sensor.getType() === Sensor.TYPE_HEART_RATE) {
                const currentHeartRate = event.values[0];
                console.log(`实时心率:${currentHeartRate} BPM`);
                // 拿到数据后,调用MQTT发送函数
                sendToMQTT(currentHeartRate);
            }
        },
        onAccuracyChanged: function(sensor: Sensor, accuracy: number) {
            // 传感器精度变化时的处理,比如记录日志
            console.log(`心率传感器精度更新:${accuracy}`);
        }
    }))();

    // 注册传感器监听器,采样率选SENSOR_DELAY_NORMAL即可,避免耗电
    sensorManager.registerListener(sensorListener, heartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
}

// 记得在页面销毁或应用暂停时注销监听器,防止内存泄漏
function cleanupSensor() {
    if (sensorManager && sensorListener) {
        sensorManager.unregisterListener(sensorListener);
    }
}

// 比如在pageUnloaded事件里调用cleanupSensor()

4. 用MQTT插件发送数据

你提到知道NativeScript有MQTT插件,咱们用nativescript-mqtt来实现数据发送:

先安装插件:

npm install nativescript-mqtt

实现MQTT连接与数据发送:

import { MqttClient, MqttMessage } from "nativescript-mqtt";

let mqttClient: MqttClient;

function initMQTT() {
    mqttClient = new MqttClient({
        uri: "tcp://你的MQTT服务器地址:1883", // 替换成你的服务器地址
        clientId: `wear-heart-rate-${Math.random().toString(36).slice(2, 10)}`, // 唯一客户端ID
        cleanSession: true,
        // 如果服务器需要认证,添加下面两行
        // username: "你的用户名",
        // password: "你的密码"
    });

    // 监听连接丢失事件,可实现重连逻辑
    mqttClient.onConnectionLost((error) => {
        console.log("MQTT连接断开:", error);
        // 这里可以写重连逻辑,比如延迟几秒后重新调用initMQTT()
    });

    // 连接MQTT服务器
    mqttClient.connect()
        .then(() => console.log("MQTT连接成功"))
        .catch(err => console.error("MQTT连接失败:", err));
}

// 发送心率数据到MQTT服务器
function sendToMQTT(heartRate: number) {
    if (!mqttClient || !mqttClient.isConnected()) {
        console.error("MQTT未连接,无法发送数据");
        return;
    }

    // 构造要发送的消息,比如转成JSON格式
    const messageContent = JSON.stringify({
        heartRate: heartRate,
        timestamp: new Date().toISOString()
    });

    const mqttMessage = new MqttMessage(messageContent, 0, false);
    // 发布到指定主题,比如"wear/heartrate"
    mqttClient.publish("wear/heartrate", mqttMessage)
        .then(() => console.log("心率数据发送成功"))
        .catch(err => console.error("发送数据失败:", err));
}

// 在应用启动时初始化MQTT,比如app.ts里调用
initMQTT();

一些重要提示

  • Wear OS设备限制:部分Wear OS设备需要用户先在系统健康应用中启动心率监测,才能获取到数据,如果你的代码没拿到数据,可以提示用户检查系统设置。
  • 耗电优化:不要把传感器采样率设得太高,SENSOR_DELAY_NORMAL足够满足心率监测需求,避免不必要的耗电。
  • 生命周期管理:在应用暂停(比如切换到后台)时记得注销传感器监听器,恢复前台时重新注册,减少后台耗电。
  • MQTT重连:Wear OS设备可能会因为蓝牙断开或网络波动丢失MQTT连接,建议实现自动重连逻辑。

内容的提问来源于stack exchange,提问作者Ayesh Towheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:58