更新记录
1.0.0(2026-04-02)
- 初始版本
- 支持设备搜索、连接、绑定登录
- 支持健康数据监听间隔设置(心率、血氧、HRV、压力、血糖)
- 支持实时健康数据检测
- 支持历史健康数据同步
- 支持设备控制(查找、关机、恢复出厂)
平台兼容性
uni-app(4.81)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | 5.0 | 1.0.0 | 14 | 1.0.0 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.82)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
hl-rwble-ring
RW BLE 手环/戒指 UTS 插件,封装 RW 官方蓝牙可穿戴 SDK(Android AAR / iOS Framework),适用于 uni-app App 端:设备发现与连接、绑定与时间、健康全天监听、单次测量、历史同步、戒指扩展能力(视频手势、LED、拍照触发)等。
目录
平台与环境
| 平台 | 支持 | 说明 |
|---|---|---|
| App Android | ✅ | 依赖 app-android/libs 中 AAR;需在 HBuilderX 运行配置 中配置原生环境或打自定义基座 |
| App iOS | ✅ | 依赖 app-ios/Frameworks;需 Xcode 本地编译或自定义基座;Info.plist 含蓝牙用途描述 |
| HarmonyOS / H5 / 小程序 | ❌ | 未接入 |
官方说明:UTS Android 运行 · UTS iOS 插件
快速开始
1. 导入(推荐命名空间,避免与其它模块同名导出冲突)
import * as RwBleRing from '@/uni_modules/hl-rwble-ring'
2. 初始化与日志(建议在应用启动或进入蓝牙页时调用)
RwBleRing.initSDK()
RwBleRing.enableDebugLog((level, tag, message) => {
console.log(`[${level}] ${tag}: ${message}`)
})
3. 退出页面时释放(可选,避免重复初始化或泄漏)
import { onUnmounted } from 'vue'
onUnmounted(() => {
RwBleRing.destroySDK()
})
类型说明
以下与 utssdk/interface.uts 一致;复杂结构在运行时多为 UTSJSONObject,用 中括号 访问字段,例如 result.data['power']。
RwBleDevice
| 字段 | 类型 | 说明 |
|---|---|---|
name |
string | 广播名 |
mac |
string | 设备 MAC |
rssi |
number | 信号强度 |
RwConnectionEvent
| 字段 | 类型 | 说明 |
|---|---|---|
status |
string | connecting / connected / disconnected / timeout / error / otaFailed 等 |
device |
RwBleDevice | null | 当前关联设备;异常场景可能为空对象占位(如蓝牙关闭) |
errorCode |
number | 错误码,成功多为 0 |
RwResult(多数指令回调)
| 字段 | 类型 | 说明 |
|---|---|---|
code |
number | 0 成功,非 0 为失败(与 SDK 一致) |
message |
string | 描述信息 |
data |
UTSJSONObject | null | 成功时携带负载;失败时一般为 null(iOS 不会用 NSNull 占位,避免桥接崩溃) |
RwHealthRealtimeData(单次检测实时值)
| 字段 | 类型 | 说明 |
|---|---|---|
dataType |
string | 与传入的 healthType 一致 |
value |
number | 实时测量值 |
RwSyncOptions(历史同步)
| 字段 | 类型 | 说明 |
|---|---|---|
supportStress |
boolean | 是否同步压力 |
supportBloodSugar |
boolean | 是否同步血糖 |
supportMuslimPraise |
boolean | 是否同步赞念 |
onProgress |
(progress: number) => void | null |
进度 0–100 |
onFinish |
() => void | null |
完成 |
onError |
(code: number) => void | null |
失败 |
onData |
(dataType: string, data: UTSJSONObject[]) => void | null |
分类型数据批次 |
健康业务类型 healthType(字符串)
统一用于监听设置、单次检测启停:
| 值 | 含义 |
|---|---|
heartRate |
心率 |
bloodOxygen |
血氧 |
hrv |
HRV |
stress |
压力 |
bloodSugar |
血糖 |
API 一览
| 函数 | 说明 |
|---|---|
initSDK() |
初始化 SDK(蓝牙前台能力等) |
enableDebugLog(callback) |
输出原生调试日志 |
startScan(onDevice, onFinish, onError) |
开始扫描;onFinish/onError 可传 null |
stopScan() |
停止扫描 |
connectDevice(mac, name, callback) |
连接设备 |
disconnectDevice() |
断开 |
isDeviceConnected() |
是否已连接 |
loginDevice(bindType, userId, callback) |
绑定/登录(参数以 RW 文档为准) |
setTime(timezone) |
同步时区与时间,如中国区传 8 |
getFirmwareInfo(callback) |
固件信息 |
getPower(callback) |
电量 |
setHealthMonitor(healthType, isOpen, intervalMinutes, callback) |
设置全天监听开关与间隔(分钟,常见 30/60,以设备为准) |
getHealthMonitor(healthType, callback) |
获取全天监听配置 |
getWearPosition(callback) |
佩戴手(左/右) |
setWearPosition(isRightHand, callback) |
true 右手,false 左手 |
startHealthTest(healthType, onRealtimeData, onResult) |
启动单次检测 + 实时值 |
stopHealthTest(healthType, callback) |
停止单次检测 |
getVideoHid(callback) |
戒指手势刷视频开关 |
setVideoHid(isOpen, callback) |
设置视频手势开关 |
getLedLevel(callback) |
LED 亮屏:data.isOpen、data.lcdLevel(1–3) |
setLedLevel(isOpen, level, callback) |
设置 LED;关闭时可 isOpen=false, level=1 |
startTakePhoto(onResult, onTakePhoto) |
拍照模式;onTakePhoto(action) 中 action===2 表示拍照触发 |
stopTakePhoto() |
退出拍照模式 |
findDevice() |
查找设备(震动/响铃) |
powerOff() |
关机 |
factoryReset() |
恢复出厂 |
syncHealthData(options) |
历史健康数据同步 |
destroySDK() |
释放监听、回调等资源 |
调用示例(按场景)
扫描与连接
RwBleRing.startScan(
(device) => {
console.log(device.name, device.mac, device.rssi)
},
() => {
console.log('扫描结束')
},
(code, msg) => {
console.error('扫描失败', code, msg)
}
)
RwBleRing.stopScan()
RwBleRing.connectDevice(mac, name, (event) => {
if (event.status == 'connected') {
console.log('已连接', event.device)
} else if (event.status == 'disconnected') {
console.log('已断开')
} else if (event.status == 'error' || event.status == 'timeout') {
console.log('连接异常', event.errorCode)
}
})
RwBleRing.disconnectDevice()
const ok = RwBleRing.isDeviceConnected()
绑定、时间、固件、电量
// bindType / userId 请按 RW SDK 文档与业务约定填写;以下为演示占位
RwBleRing.loginDevice(1, '1000', (result) => {
if (result.code == 0) {
console.log('登录成功')
}
})
RwBleRing.setTime(8) // UTC+8
RwBleRing.getFirmwareInfo((result) => {
if (result.code == 0 && result.data != null) {
const d = result.data
console.log(d['deviceClass'], d['deviceNo'], d['uiVersion'])
}
})
RwBleRing.getPower((result) => {
if (result.code == 0 && result.data != null) {
console.log('电量', result.data['power'])
}
})
全天监听:获取 / 设置
获取为异步,建议在回调里关闭 uni.showLoading。
const healthType = 'heartRate'
uni.showLoading({ title: '读取中…', mask: true })
RwBleRing.getHealthMonitor(healthType, (result) => {
uni.hideLoading()
if (result.code == 0 && result.data != null) {
const d = result.data
const isOpen = d['isOpen'] == true || d['isOpen'] == 1
const minutes = d['intervalMinutes']
console.log('开启', isOpen, '间隔', minutes)
}
})
// 开启监听,间隔 60 分钟(设备不支持的时间会被 SDK 处理)
RwBleRing.setHealthMonitor(healthType, true, 60, (result) => {
console.log(result.message, result.code)
})
佩戴位置
RwBleRing.getWearPosition((result) => {
if (result.code == 0 && result.data != null) {
const right = result.data['isRightHand']
console.log(right ? '右手' : '左手')
}
})
RwBleRing.setWearPosition(false, (result) => {
console.log(result.message)
}) // 左手
单次健康检测(实时值 + 结束回调)
RwBleRing.startHealthTest(
'heartRate',
(data) => {
console.log(data.dataType, data.value)
},
(result) => {
console.log('控制结果', result.message)
}
)
RwBleRing.stopHealthTest('heartRate', (result) => {
console.log('停止', result.message)
})
视频手势、LED、拍照
RwBleRing.getVideoHid((result) => {
if (result.code == 0 && result.data != null) {
console.log('视频手势', result.data['isOpen'])
}
})
RwBleRing.setVideoHid(true, (result) => console.log(result.message))
RwBleRing.getLedLevel((result) => {
if (result.code == 0 && result.data != null) {
console.log(result.data['isOpen'], result.data['lcdLevel'])
}
})
RwBleRing.setLedLevel(true, 2, (result) => console.log(result.message))
RwBleRing.startTakePhoto(
(result) => console.log('模式', result.message),
(action) => {
if (action == 2) {
// 调起相机或业务拍照
console.log('设备触发拍照')
}
}
)
RwBleRing.stopTakePhoto()
查找 / 关机 / 恢复出厂
RwBleRing.findDevice()
RwBleRing.powerOff()
RwBleRing.factoryReset()
历史同步
RwBleRing.syncHealthData({
supportStress: true,
supportBloodSugar: true,
supportMuslimPraise: false,
: (p) => console.log('进度', p),
onFinish: () => console.log('完成'),
onError: (code) => console.error('错误', code),
onData: (dataType, list) => {
console.log(dataType, list.length)
for (let i = 0; i < list.length; i++) {
const row = list[i]
// 按 dataType 解析 row['date']、row['hr'] 等,见下节
}
}
})
历史同步 onData 类型说明
dataType 由原生 SDK 回调决定,不同固件/协议可能略有差异。当前插件常见取值如下(仅供参考,以真机为准):
dataType |
含义 |
|---|---|
step |
计步 |
sleep |
睡眠 |
heartRate |
心率 |
bloodOxygen |
血氧 |
hrv |
HRV |
stress |
压力 |
bloodSugar |
血糖 |
muslimCount |
赞念 |
每条元素为 UTSJSONObject,字段名随类型不同(如心率常见 date、time、hr;计步常见 date、step、distance、calorie)。杰理睡眠等协议可能仅含 time、sleepModel 等,需按 RW 文档解析。
完整示例工程
仓库内演示页:pages/ring-demo/index.vue
覆盖能力概览:
- 扫描列表、连接/断开、登录、对时
- 固件、电量
- 五项健康监听获取/设置(含
uni.showLoading) - 佩戴位置、实时检测、视频 HID、LED、拍照
- 查找/关机/恢复出厂
syncHealthData基础同步与扩展项onUnmounted中destroySDK()
可直接对照该文件复制业务代码片段。
注意事项
-
自定义基座
含三方原生库,真机调试需使用自定义调试基座或云端正式包,标准基座无法加载插件原生部分。 -
调用顺序
建议先initSDK(),再扫描/连接;多数指令需已连接设备后再调用(与官方 Demo 一致)。 -
异步与 UI
getHealthMonitor、getFirmwareInfo、getPower等均在蓝牙交互完成后才回调,耗时数百毫秒~数秒属正常;长时间操作建议showLoading并在回调里hideLoading。 -
RwResult.data访问
使用result.data['field'];判断存在用result.data != null。iOS 侧失败时 不会 向data写入NSNull,避免强转崩溃。 -
isOpen等布尔含义字段
桥接后可能是number(0/1),判断时建议兼容:val == true || val == 1(与演示页parseMonitorData一致)。 -
setTime/loginDevice参数
时区、绑定类型与用户 ID 以 RW 官方 PDF / Demo 为准;演示中loginDevice(1, '1000')仅为占位。 -
单次检测
startHealthTest的onResult多为启动指令应答;实时数值走onRealtimeData。iOS 侧测量结束由通知驱动,请勿假设onResult会多次携带完整流程(详见插件内注释)。 -
UTS 与 Vue
插件内部已对需长期持有的回调使用@UTSJS.keepAlive等处理;业务侧避免在回调里引用已销毁的页面实例。 -
同步选项
supportStress/supportBloodSugar/supportMuslimPraise需设备与固件支持;否则可能无对应onData或报错码。 -
权限
Android 需蓝牙/定位等系统授权;iOS 需在系统设置中允许蓝牙,且包内包含蓝牙使用说明(插件已提供Info.plist模板)。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 273
赞赏 2
下载 11517715
赞赏 1902
赞赏
京公网安备:11010802035340号