HarmonyOS Health Industry SDK:让穿戴设备为你记录健康数据

什么是 Health Industry SDK

你有没有用过华为手表记录运动数据?比如跑步的距离、心率、睡眠质量等等。这些数据都存在手表里,但你想在手机 App 里查看这些数据怎么办?

Health Industry SDK(运动健康行业开发工具包)就是让开发者能访问这些数据的工具。它面向运动健康行业应用开发者,提供华为穿戴设备的开放能力。简单说,它让你的应用可以读取华为手表/手环上的健康数据,还可以设置设备的各种功能。

你可能会问:前面不是有个 Health Service Kit 吗?有什么区别?区别很大:

  • Health Service Kit:面向普通应用开发者,不需要穿戴设备,只要用户有华为账号就行。主要做运动数据的读写,数据存在华为的健康数据平台里
  • Health Industry SDK:面向行业应用开发者,需要穿戴设备。可以读取手表上的原始数据(心率、体温、血氧等),还可以控制手表的功能

如果你做的是一个普通的运动记录 App,用 Health Service Kit 就够了。如果你做的是一个医疗健康 App,需要读取手表的实时心率、体温等数据,那就得用 Health Industry SDK。

核心功能

Health Industry SDK 提供以下功能:

  1. 设备设置:设置和查询设备信息、开关状态。比如设置单位制(公制/英制)、设置科学睡眠开关。这些设置会直接修改手表的配置
  2. 数据查询:查询健康数据、运动数据、日常活动数据。比如查询用户的体温记录、运动记录、睡眠记录等。这些数据是手表采集的原始数据
  3. 事件订阅:订阅设备状态和数据更新。比如订阅实时心率数据,当用户心率变化时,你的 App 能立刻收到通知。也可以订阅运动数据更新,用户跑完步后自动通知你
  4. 应用管理:设置行业应用息屏不断网、保活、开机自启动。这些功能适合需要后台持续运行的应用,比如实时心率监测

环境搭建

硬件要求

  • 设备类型:华为穿戴设备(手表、手环)
  • HarmonyOS 系统:HarmonyOS NEXT Developer Beta1 及以上

软件要求

  • DevEco Studio 版本:DevEco Studio 5.1.1 Release 及以上
  • HarmonyOS SDK 版本:HarmonyOS 5.1.1 Release SDK 及以上

搭建步骤

  1. 安装 DevEco Studio:去华为开发者官网下载安装
  2. 配置开发环境:确保网络环境正常
  3. 设备调试:使用真机进行调试

项目结构

├── entry/src/main
│  ├── src
│  │  ├── common
│  │  │  ├── queryData
│  │  │  │  ├── temperature.ets    // 查询体温数据接口
│  │  │  │  └── workout.ets        // 查询单次运动数据接口
│  │  │  ├── settingInfo
│  │  │  │  ├── truSleep.ets       // 查询、设置科学睡眠开关接口
│  │  │  │  └── unit.ets           // 查询、设置单位制接口
│  │  │  ├── subscribeEvent
│  │  │  │  ├── heartRate.ets      // 订阅心率数据接口
│  │  │  │  └── workoutUpdate.ets  // 订阅单次运动数据更新接口
│  │  ├── entryability
│  │  │  └── EntryAbility.ets      // 程序入口类
│  │  └── pages
│  │     └── Index.ets             // 主页面
│  ├── resources
│  │  ├── rawfile
│  │  │  └── auth.cer              // 鉴权证书文件
│  └── module.json5

项目结构比较清晰,按功能分成了几个目录:

  • queryData:数据查询相关接口,包括体温查询和运动数据查询
  • settingInfo:设备设置相关接口,包括科学睡眠开关和单位制设置
  • subscribeEvent:事件订阅相关接口,包括心率订阅和运动数据更新订阅
  • rawfile/auth.cer:鉴权证书文件,用 SDK 之前必须配置

第一步:导入模块

import { industryServiceClient, IndustryService } from '@huawei-cbg/health-industry-sdk';
import { BusinessError } from '@ohos.base';

导入 Health Industry SDK 的核心模块:

  • industryServiceClient:客户端接口,用来鉴权和获取设备。你可以理解为"SDK 的入口"
  • IndustryService:设备接口,用来查询数据和设置功能。所有的数据查询和设备设置都通过它来完成

第二步:设置鉴权证书

在使用 SDK 之前,需要先进行鉴权。鉴权就像"登录",告诉华为"我是合法的开发者,有权访问这些数据"。

第一步是设置鉴权证书。证书是一个文件,你需要从华为开发者后台申请,然后放到项目的 src/main/resources/rawfile 目录下。

// certName 为鉴权证书的证书名称
industryServiceClient.setCertPath(context, certName).then(() => {
  // 设置鉴权证书路径成功
  console.info(`Succeeded in setting certPath.`);
}).catch((err: BusinessError) => {
  // 设置鉴权证书路径失败
  throw new Error(`Failed to set certPath. Code is ${err.code}, message is ${err.message}.`);
});

调用 setCertPath 设置证书路径。certName 是证书文件的名称,比如 auth.cer

为什么要用证书?因为 Health Industry SDK 涉及用户的健康数据,这是非常敏感的信息。证书机制确保只有合法的应用才能访问这些数据,保护用户隐私。

第三步:进行鉴权

设置好证书后,就可以进行鉴权了。

industryServiceClient.getAuthorization(context).then(() => {
  // 鉴权成功
  console.info(`Succeeded to getting authorization.`);
}).catch((err: BusinessError) => {
  // 鉴权失败
  throw new Error(`Failed to get authorization. Code is ${err.code}, message is ${err.message}.`);
});

调用 getAuthorization 进行鉴权。鉴权需要访问网络,确保设备已连接网络。

鉴权成功后,你就可以使用 SDK 的各种功能了。鉴权失败的话,可能是证书配置有问题,或者网络不通。

第四步:获取设备对象

鉴权成功后,需要获取设备对象。设备对象就像"遥控器",后续所有的操作都通过它来完成。

industryServiceClient.getDeviceManager(context).getDevices().then(devices => devices?.[0])
  .then((device: IndustryService.Device) => {
    // 获取设备对象成功,可以开始使用了
  }).catch((err: BusinessError) => {
    // 获取设备列表失败
    throw new Error(`Failed to get devices. Code is ${err.code}, message is ${err.message}.`);
  });

获取设备对象的过程:

  1. getDeviceManager(context):获取设备管理器
  2. getDevices():获取已连接的设备列表
  3. devices?.[0]:取第一个设备。如果你有多个设备,可以遍历列表

获取到 IndustryService.Device 设备对象后,就可以调用各种接口了。

第五步:查询和设置单位制

// 查询单位制
device.getSettingInfo(IndustryService.SettingType.UNIT).then((result: IndustryService.Unit) => {
  // 查询单位制成功
  console.info(`Succeeded in getting unit, result is ${result}.`);
}).catch((err: BusinessError) => {
  // 查询单位制失败
  throw new Error(`Failed to get unit. Code is ${err.code}, message is ${err.message}.`);
});

调用 getSettingInfo 查询当前的单位制设置。返回值是 IndustryService.Unit 类型:

  • Metric:公制,用公里、公斤、摄氏度
  • Imperial:英制,用英里、磅、华氏度

你可能会问:为什么要设置单位制?因为不同国家的用户习惯不同。中国用户习惯用公制,美国用户习惯用英制。你可以根据用户的偏好来设置。

// 设置单位制
device.setSettingInfo(IndustryService.SettingType.UNIT, unit).then(() => {
  // 设置单位制成功
  console.info('Succeeded in setting unit.');
}).catch((err: BusinessError) => {
  // 设置单位制失败
  throw new Error(`Failed to set unit. Code is ${err.code}, message is ${err.message}.`);
});

调用 setSettingInfo 设置单位制。设置后,手表上显示的距离、速度等数据就会按照新的单位制来显示。

第六步:查询和设置科学睡眠开关

// 查询科学睡眠开关状态
device.getSettingInfo(IndustryService.SettingType.TRU_SLEEP_SWITCH).then((value: boolean) => {
  // 查询科学睡眠开关状态成功
  console.info(`Succeeded in getting TruSleepSwitch, value is ${value}.`);
}).catch((error: BusinessError) => {
  // 查询科学睡眠开关状态失败
  throw new Error(`Failed to get TruSleepSwitch. Code is ${error.code}, message is ${error.message}.`);
});

查询科学睡眠开关的状态,返回值是 boolean 类型:

  • true:科学睡眠已开启。手表会用更高级的算法来分析用户的睡眠质量
  • false:科学睡眠已关闭。手表用普通的睡眠检测算法

科学睡眠是什么?简单说就是华为手表的高级睡眠分析功能。开启后,手表会记录你的深睡、浅睡、REM(快速眼动)等睡眠阶段,给你更详细的睡眠报告。

// 设置科学睡眠开关状态
device.setSettingInfo(IndustryService.SettingType.TRU_SLEEP_SWITCH, value).then(() => {
  // 设置科学睡眠开关状态成功
  console.info('Succeeded in setting TruSleepSwitch.');
}).catch((error: BusinessError) => {
  // 设置科学睡眠开关状态失败
  throw new Error(`Failed to set TruSleepSwitch. Code is ${error.code}, message is ${error.message}.`);
});

设置科学睡眠开关,把 value 设置为 truefalse 就可以了。

第七步:查询体温数据

// 构造查询体温数据参数
let queryParam: IndustryService.QueryOptions = {
  type: IndustryService.DataType.TEMPERATURE,
  startTime: 1736777580, // 查询开始时间戳(秒级)
  endTime: 1736777580    // 查询结束时间戳(秒级)
};

// 调用 Device 对象的 queryHistoryData 方法查询体温数据
device.queryHistoryData(queryParam).then((data: IndustryService.HistoryData[]) => {
  // 查询体温数据成功
  console.info(`Succeeded in querying temperature data, result is ${JSON.stringify(data)}.`);
}).catch((err: BusinessError) => {
  // 查询体温数据失败
  throw new Error(`Failed to query temperature data. Code is ${err.code}, message is ${err.message}.`);
});

调用 queryHistoryData 查询体温数据。需要传入查询参数:

  • type:数据类型,这里用 TEMPERATURE 表示体温。还有其他类型,比如 WORKOUT(运动)、SLEEP(睡眠)等
  • startTime:开始时间戳(秒级)。注意是秒级,不是毫秒级
  • endTime:结束时间戳(秒级)

返回的是一个数组,包含了这个时间段内的所有体温记录。每条记录有时间戳和体温值。

你可能会问:手表怎么测体温?华为手表有皮肤温度传感器,可以测量手腕的皮肤温度。虽然不是精确的体温,但可以用来监测体温变化趋势。

第八步:查询单次运动数据

// 构造查询单次运动数据查询参数
let queryParam: IndustryService.QueryOptions = {
  type: IndustryService.DataType.WORKOUT,
  startTime: 1740195486, // 查询开始时间戳(秒级)
  endTime: 1740206286    // 查询结束时间戳(秒级)
};

// 调用 Device 对象的 queryHistoryData 方法查询单次运动数据
device.queryHistoryData(queryParam).then((result: IndustryService.HistoryData[]) => {
  // 查询单次运动数据成功
  console.info(`Succeeded in querying workout, result: ${JSON.stringify(result)}`);
}).catch((err: BusinessError) => {
  // 查询单次运动数据失败
  throw new Error(`Failed to query workout. Code is ${err.code}, message is ${err.message}.`);
});

查询单次运动数据,和查询体温数据类似,只是 type 换成了 WORKOUT

返回的运动数据包括:运动类型、开始时间、结束时间、距离、卡路里、心率等。这些数据是手表在用户运动时自动记录的。

第九步:订阅心率数据

如果你想实时获取用户的心率数据,可以订阅心率数据。这在运动监测、健康预警等场景下很有用。

// 订阅心率数据
device.subscribeRealTimeData(IndustryService.RealTimeDataType.HEART_RATE, callback).then(() => {
  // 订阅心率数据成功
  console.info('Succeeded in subscribing heartRate.');
}).catch((err: BusinessError) => {
  // 订阅心率数据失败
  throw new Error(`Failed to subscribe heartRate. Code is ${err.code}, message is ${err.message}.`);
});

调用 subscribeRealTimeData 订阅心率数据。传入一个回调函数,当有新的心率数据时,会调用这个回调函数。

订阅后,手表会实时把心率数据发送到你的 App。你可以用这个数据来做实时心率显示、心率异常预警等。

// 取消订阅心率数据
device.unSubscribeRealTimeData(IndustryService.RealTimeDataType.HEART_RATE, callback).then(() => {
  // 取消订阅心率数据成功
  console.info('Succeeded in unsubscribing heartRate.');
}).catch((err: BusinessError) => {
  // 取消订阅心率数据失败
  throw new Error(`Failed to unsubscribe heartRate. Code is ${err.code}, message is ${err.message}.`);
});

不需要的时候,调用 unSubscribeRealTimeData 取消订阅。注意:取消订阅时的回调函数要和订阅时的是同一个对象,否则取消不了。

为什么要取消订阅?因为订阅会保持和手表的连接,消耗电量和网络资源。如果你不需要实时数据了,及时取消订阅可以省电。

第十步:订阅运动数据更新

// 订阅单次运动数据更新
device.subscribeEvent(IndustryService.EventType.WORKOUT_UPDATE_EVENT, callback).then(() => {
  // 订阅单次运动数据更新成功
  console.info('Succeeded in subscribing workoutUpdateEvent.');
}).catch((err: BusinessError) => {
  // 订阅单次运动数据更新失败
  throw new Error(`Failed to subscribe workoutUpdateEvent. Code is ${err.code}, message is ${err.message}.`);
});

订阅运动数据更新,当用户完成一次运动后,会触发回调函数。比如用户跑完步,手表会自动通知你的 App,你就可以拉取这次运动的数据了。

// 取消订阅单次运动数据更新
device.unSubscribeEvent(IndustryService.EventType.WORKOUT_UPDATE_EVENT, callback).then(() => {
  // 取消订阅成功
  console.info('Succeeded in unsubscribing WORKOUT_UPDATE_EVENT.');
}).catch((err: BusinessError) => {
  // 取消订阅失败
  throw new Error(`Failed to unsubscribe WORKOUT_UPDATE_EVENT. Code is ${err.code}, message is ${err.message}.`);
});

取消订阅运动数据更新。

实际应用场景

Health Industry SDK 在实际开发中有很多用途:

运动健康应用

// 查询用户的运动数据
async function getUserWorkoutData(startTime: number, endTime: number) {
  let queryParam: IndustryService.QueryOptions = {
    type: IndustryService.DataType.WORKOUT,
    startTime: startTime,
    endTime: endTime
  };
  let data = await device.queryHistoryData(queryParam);
  // 展示运动数据,比如做成运动记录列表
  displayWorkoutData(data);
}

运动健康应用可以查询用户的历史运动数据,展示在页面上。用户可以查看自己的运动记录、运动趋势等。

实时心率监测

// 实时监测用户心率
function startHeartRateMonitoring() {
  device.subscribeRealTimeData(IndustryService.RealTimeDataType.HEART_RATE, (data) => {
    // 更新心率显示
    updateHeartRateDisplay(data.heartRate);
    // 检查心率是否异常
    if (data.heartRate > 100) {
      showWarning('心率过高,请注意休息');
    }
  });
}

实时心率监测可以订阅心率数据,当心率异常时给用户提示。这在运动监测、老年人健康监护等场景下很有用。

睡眠质量分析

// 查询用户的睡眠数据
async function getSleepData(startTime: number, endTime: number) {
  let queryParam: IndustryService.QueryOptions = {
    type: IndustryService.DataType.SLEEP,
    startTime: startTime,
    endTime: endTime
  };
  let data = await device.queryHistoryData(queryParam);
  // 分析睡眠质量,比如深睡时长、浅睡时长、REM时长
  analyzeSleepQuality(data);
}

睡眠质量分析可以查询用户的睡眠数据,分析深睡、浅睡、REM 等睡眠阶段,给用户提供睡眠建议。

适用场景

Health Industry SDK 适合以下场景:

  • 运动健康应用:记录和分析运动数据
  • 医疗健康应用:监测心率、体温等健康指标
  • 企业健康管理:员工健康管理平台
  • 保险应用:根据健康数据提供个性化保险方案
  • 健身应用:记录健身数据,提供健身建议

注意事项

  1. 鉴权要求:使用前需要进行鉴权,需要联网。鉴权失败的话,所有接口都用不了
  2. 证书配置:需要配置鉴权证书,证书从华为开发者后台申请
  3. 设备支持:需要华为穿戴设备,没有设备的话无法使用
  4. 数据类型:支持体温、心率、运动、睡眠等多种数据类型,要选择正确的类型
  5. 订阅管理:不需要时要及时取消订阅,避免资源浪费和电量消耗

核心流程图

Health Industry SDK 的初始化与数据访问流程:

导入 Health Industry SDK

设置鉴权证书路径

调用 getAuthorization 进行鉴权

鉴权是否成功?

检查证书和网络配置

获取设备管理器

获取已连接的穿戴设备

获取 Device 设备对象

开始使用 SDK 功能

SDK 支持的四大功能模块:

Health Industry SDK

设备设置

数据查询

事件订阅

应用管理

设置单位制

科学睡眠开关

查询体温数据

查询运动数据

查询睡眠数据

订阅实时心率

订阅运动数据更新

息屏不断网

保活与开机自启

总结

Health Industry SDK 让你的应用可以访问华为穿戴设备的健康数据,核心流程:

  1. 配置鉴权证书,告诉 SDK 你是合法的开发者
  2. 进行鉴权,建立和华为服务器的连接
  3. 获取设备对象,拿到和手表通信的"遥控器"
  4. 查询或设置设备功能,读取数据或修改配置
  5. 订阅实时数据,实时获取心率、运动等数据

掌握了这些,你就能开发出各种运动健康应用,让用户更好地管理自己的健康。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐