基于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
相关产品推荐
相关产品推荐

