更新记录
1.0.3(2026-07-24)
无
1.0.2(2026-07-24)
无
1.0.1(2026-07-24)
无
查看更多平台兼容性
uni-app(5.01)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.01)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
etalya-ring 接口文档
概述
etalya-ring 是一个 uni-app UTS 插件,通过 UTS 桥接层直连 CRP BLE SDK(my-ring-ble-1.2.0-20260522.aar),实现 MYRing 智能戒指的蓝牙扫描、连接和数据通信。
导入方式
import * as Ring from '@/uni_modules/etalya-ring'
所有 API 通过 Ring 对象调用。
运行环境
- HBuilderX 4.27+
- uni-app Vue 3 项目
- Android 6+(BLE 支持)
- Android 12+ 需额外声明
BLUETOOTH_SCAN/BLUETOOTH_CONNECT权限
快速开始
import * as Ring from '@/uni_modules/etalya-ring'
// 1. 初始化 SDK
Ring.init()
// 2. 注册数据事件监听(接收设备推送数据)
Ring.onDataEvent((event) => {
console.log(event.event, event.data)
})
// 3. 注册扫描事件监听
Ring.onScanEvent((result) => {
if (result.type === 'scanning') {
console.log('发现设备:', result.device)
} else if (result.type === 'complete') {
console.log('扫描完成, 共', result.count, '个设备')
}
})
// 4. 检查蓝牙并开始扫描
if (Ring.isBluetoothEnabled()) {
Ring.startScan()
}
// 5. 停止扫描
// Ring.stopScan()
// 6. 连接设备
// Ring.connect({ macAddress: 'XX:XX:XX:XX:XX:XX', callback: (ret) => { ... } })
// 7. 断开连接
// Ring.disconnect()
API 参考
初始化
Ring.init()
初始化 CRP BLE SDK,必须第一个调用。
- 参数: 无
- 返回:
CallbackResult
const ret = Ring.init()
if (ret.code === 0) {
console.log('初始化成功')
} else {
console.error('初始化失败:', ret.msg)
}
蓝牙状态
Ring.isBluetoothEnabled(): boolean
检查手机蓝牙是否已开启。
if (Ring.isBluetoothEnabled()) {
console.log('蓝牙已开启')
} else {
console.log('请打开蓝牙')
}
数据事件
Ring.onDataEvent(callback)
注册设备数据事件监听(on 前缀自动保持回调存活)。连接设备后,所有健康数据(心率、步数、电量等)通过此回调推送。
- 参数:
callback: (event: DataEvent) => void
Ring.onDataEvent((event) => {
console.log(event.event) // 事件名,如 'onHeartRateChange'
console.log(event.data) // 事件数据对象
})
事件列表:
| event 值 | 触发时机 | 数据字段说明 |
|---|---|---|
onConnectionStateChange |
连接状态变化 | state(0/1/2), stateText |
onCurrentSteps |
当前步数 | info(JSON 字符串) |
onHistorySteps |
历史步数 | day, info |
onHistoryStepsDetails |
步数详情 | info |
onHistorySleepChange |
历史睡眠 | day, info |
onHistorySleepListChange |
睡眠列表 | list |
onSleepDetails |
睡眠分段 | info |
onSleepInfo |
睡眠汇总 | info |
onSleepChronotype |
睡眠类型 | info |
onSleepEnd |
睡眠结束 | success(boolean) |
onHrTimingInterval |
心率定时设置 | interval |
onRealtimeHeartRate |
实时心率 | hr |
onHeartRate |
单次心率 | hr |
onHistoryHeartRate |
历史心率 | list |
onTimingHeartRate |
定时心率 | historyDay, list |
onBloodOxygenChange |
血氧数据 | bloodOxygen |
onBloodPressureChange |
血压数据 | sbp, dbp |
onHrvChange |
HRV 数据 | hrv |
onStressChange |
压力数据 | stress |
onTempMeasureComplete |
体温测量完成 | temp |
onHistoryTempChange |
历史体温 | historyDay, tempList |
onSupportBloodOxygenType |
血氧类型支持 | type |
onHistoryVoltage |
历史电压 | historyDay, voltageArray |
onStepsChange |
步数变化 | steps, distance, calories |
扫描
Ring.onScanEvent(callback)
注册扫描结果回调(on 前缀自动保持回调存活)。需在 startScan() 之前调用。
- 参数:
callback: (result: ScanResult) => void
Ring.onScanEvent((result) => {
if (result.type === 'scanning') {
// 每发现一个设备触发
console.log('设备:', result.device.name, result.device.macAddress)
} else if (result.type === 'complete') {
// 扫描结束(有设备)
console.log('共发现', result.count, '个设备')
} else if (result.type === 'timeout') {
// 扫描结束(无设备)
console.log('未发现设备')
}
})
ScanResult:
| 字段 | 类型 | 说明 |
|---|---|---|
| type | 'scanning' / 'complete' / 'timeout' |
回调类型 |
| device | ScanDeviceResult |
type=scanning 时存在 |
| devices | ScanDeviceResult[] |
type=complete/timeout 时存在 |
| count | number |
设备总数 |
ScanDeviceResult:
| 字段 | 类型 | 说明 |
|---|---|---|
| name | string |
设备名称 |
| macAddress | string |
MAC 地址 |
| rssi | number |
信号强度 |
| deviceId | string (可选) |
固件类型标识 |
Ring.startScan()
开始 BLE 设备扫描。
- 参数: 无
- 返回:
CallbackResult
const ret = Ring.startScan()
if (ret.code !== 0) {
console.error('启动扫描失败:', ret.msg)
}
说明: 扫描为连续模式,不会自动停止。SDK 内部会周期性地触发
onScanComplete回调,插件会自动重启扫描保持连续。如需停止,手动调用stopScan()。
Ring.stopScan()
停止扫描。
- 参数: 无
- 返回:
CallbackResult
Ring.stopScan()
连接
Ring.connect(options)
连接指定 MAC 地址的戒指设备。
-
参数:
options.macAddress: string— 必填,设备 MAC 地址options.callback: (state: ConnectionState) => void— 连接状态回调(可选)
-
返回:
CallbackResult
Ring.connect({
macAddress: 'XX:XX:XX:XX:XX:XX',
callback: (state) => {
console.log('连接状态:', state.stateText)
// state: { state: 2, stateText: 'connected' }
// state: { state: 0, stateText: 'disconnected' }
}
})
ConnectionState:
| state | stateText | 说明 |
|---|---|---|
| 0 | disconnected |
断开连接 |
| 1 | connecting |
连接中 |
| 2 | connected |
已连接 |
Ring.disconnect()
断开当前连接。
- 参数: 无
- 返回:
CallbackResult
Ring.disconnect()
Ring.isDeviceConnected(): boolean
查询当前设备是否已连接。
if (Ring.isDeviceConnected()) {
console.log('设备已连接')
}
设备信息
Ring.queryFirmwareVersion()
查询固件版本信息。结果通过 onDataEvent('onFirmwareVersion', ...) 推送。
- 参数: 无
- 返回:
CallbackResult
Ring.queryFirmwareHash()
查询固件哈希。
- 参数: 无
- 返回:
CallbackResult
Ring.checkFirmwareVersion(options)
检查固件更新。
- 参数:
options.version: string— 当前固件版本号
- 返回:
CallbackResult
Ring.queryBattery()
查询电池电量。结果通过 onDataEvent('onBattery', ...) 推送。
- 参数: 无
- 返回:
CallbackResult
时间同步
Ring.syncTime()
同步手机当前时间到戒指。
- 参数: 无
- 返回:
CallbackResult
Ring.syncTime()
用户信息
Ring.sendUserInfo(options)
发送用户信息到戒指(用于更精准的健康计算)。
- 参数:
options.weight: number— 体重(kg)options.height: number— 身高(cm)options.gender: number— 性别(0=女, 1=男)options.age: number— 年龄options.stepLength: number— 步长(cm)
- 返回:
CallbackResult
Ring.sendUserInfo({
weight: 65,
height: 170,
gender: 1,
age: 30,
stepLength: 70
})
设备控制
以下方法均通过 onDataEvent 推送回调结果。
| 方法 | 参数 | 说明 |
|---|---|---|
startMeasureHeartRate() |
无 | 开始实时心率测量 |
stopMeasureHeartRate() |
无 | 停止实时心率测量 |
enableTimingHeartRate(options) |
{ interval: number } |
开启定时心率(分钟) |
disableTimingHeartRate() |
无 | 关闭定时心率 |
queryHistoryHeartRate() |
无 | 查询历史心率 |
queryTimingHeartRate(options) |
{ day?: number } |
查询定时心率 |
startMeasureBloodOxygen() |
无 | 开始血氧测量 |
stopMeasureBloodOxygen() |
无 | 停止血氧测量 |
enableTimingBloodOxygen(options) |
{ interval: number } |
开启定时血氧 |
disableTimingBloodOxygen() |
无 | 关闭定时血氧 |
startMeasureBloodPressure() |
无 | 开始血压测量 |
stopMeasureBloodPressure() |
无 | 停止血压测量 |
startMeasureHrv() |
无 | 开始 HRV 测量 |
stopMeasureHrv() |
无 | 停止 HRV 测量 |
enableTimingHrv(options) |
{ interval: number } |
开启定时 HRV |
disableTimingHrv() |
无 | 关闭定时 HRV |
startMeasureStress() |
无 | 开始压力测量 |
stopMeasureStress() |
无 | 停止压力测量 |
enableTimingTemp() |
无 | 开启定时体温 |
disableTimingTemp() |
无 | 关闭定时体温 |
queryCurrentSteps() |
无 | 查询当前步数 |
queryHistorySteps(options) |
{ day?: number } |
查询历史步数 |
queryCurrentSleep() |
无 | 查询当前睡眠 |
queryHistorySleep(options) |
{ day?: number } |
查询历史睡眠 |
queryHistorySleepList() |
无 | 查询睡眠历史列表 |
querySleepInfo(options) |
{ index?: number } |
查询睡眠详情 |
querySleepDetails(options) |
{ index?: number } |
查询睡眠分段数据 |
sendSleepEnd() |
无 | 发送停止睡眠指令 |
sendHeartRateAlert(options) |
{ enable, heartRate } |
设置心率预警 |
sendActivityReminder(options) |
{ enable, interval, duration, startHour, endHour } |
设置久坐提醒 |
enableSos(options) |
{ enable: boolean } |
设置 SOS 功能 |
shutdown() |
无 | 关闭戒指 |
restartDevice() |
无 | 重启戒指 |
resetDevice() |
无 | 恢复出厂设置 |
startOta(callback) |
callback | OTA 固件升级 |
sendDailyGoals(options) |
{ steps, distance, calories, activeTime } |
设置每日目标 |
querySettingInfo(callback) |
callback | 查询设置信息 |
sendAutoLock(seconds) |
number |
设置自动锁屏秒数 |
sendBrightness(brightness) |
number |
设置屏幕亮度 |
sendBindingReminder() |
无 | 发送绑定提醒 |
sendScreenResolution(options) |
{ width, height } |
设置屏幕分辨率 |
类型定义
CallbackResult
type CallbackResult<T = any> = {
code: number // 0=成功, 非0=错误
msg: string // 描述信息
data?: T // 返回数据(可选)
}
ScanDeviceResult
type ScanDeviceResult = {
name: string // 设备名称
macAddress: string // MAC 地址
rssi: number // 信号强度 (dBm)
deviceId?: string // 固件类型标识
}
ConnectionState
type ConnectionState = {
state: number // 0=断开, 1=连接中, 2=已连接
stateText: 'disconnected' | 'connecting' | 'connected'
}
DataEvent
type DataEvent = {
event: string // 事件名称
data: any // 事件数据
}
注意事项
1. on 前缀函数
onScanEvent 和 onDataEvent 以 on 开头且仅有单个 callback 参数,UTS 运行时自动保持回调存活,支持多次触发。
2. 扫描为连续模式
startScan() 会持续扫描直到手动调用 stopScan()。SDK 内部周期结束会自动重启。
3. Android 运行时权限
BLE 扫描需要运行时动态请求权限:
| Android 版本 | 所需权限 |
|---|---|
| 6-11 | ACCESS_FINE_LOCATION |
| 12+ | BLUETOOTH_SCAN + BLUETOOTH_CONNECT |
建议在调用 startScan() 前使用 plus.android.requestPermissions() 请求权限。
4. AAR 依赖路径
SDK AAR 文件位于 utssdk/app-android/libs/ 目录,路径在 utssdk/app-android/config.json 中声明。
5. UTS 桥接限制
| 限制 | 说明 |
|---|---|
| 参数默认值 | 桥接层参数数组按 JS 实参数量分配,访问默认参数时越界 |
| UTSCallback 单次调用 | 自动提取的 fnJS 第一次调用后消耗,需用 on 前缀机制 |
6. 修改 .uts 无需重打基座
开发模式下,修改 .uts 文件后直接运行到手机即可生效,无需重新打包自定义基座。
如需更换 AAR 依赖(如更新 SDK 版本),需修改 config.json 后重新运行。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 2
赞赏 0
下载 12456726
赞赏 1935
赞赏
京公网安备:11010802035340号