# 小程序SDK **Repository Path**: yucheng_3/mini-program-sdk ## Basic Information - **Project Name**: 小程序SDK - **Description**: 玉成小程序SDK - **Primary Language**: JavaScript - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 4 - **Created**: 2024-08-22 - **Last Updated**: 2025-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 小程序SDK # 一、SDK 概览 ## 1.介绍 “玉成小程序SDK” 旨在为开发者提供一套便捷、高效的工具集,帮助其快速集成特定功能至微信小程序中,提升开发效率与质量,降低开发成本与难度。 ## 2.项目结构 ```Plaintext miniprogram(项目根目录,存小程序代码及资源) ├──.vscode(VS Code配置,助开发调试) ├── components(存自定义组件,提高复用率) ├── dist(存构建打包后文件,初始或为空) ├── doc(存项目相关文档) ├── image(存项目图片资源) ├── pages(存小程序页面代码,含逻辑、配置、结构、样式文件 ) ├── typings(存类型声明文件,用于类型检查等) └── utils(存通用工具函数 ) ├──.gitignore(Git 忽略文件,指定不跟踪的文件或目录) ├── app.js(小程序入口,定义全局逻辑、生命周期函数、全局数据和方法) ├── app.json(小程序全局配置,设页面路径、窗口表现等) ├── jsconfig.json(配置 JavaScript 语言服务,如智能提示、代码检查) ├── project.config.json(项目配置,记开发工具中配置信息) ├── project.private.config.json(存私有项目配置,如本地调试特殊配置) ├── README.md(项目说明文档,介绍功能、背景、用法等) └── sitemap.json(配置小程序及页面索引,控微信内搜索展示) ``` ## 3.安装教程 ### 3.1.准备工作 1. 确保您的计算机上已经安装了 Node.js,Node.js 是运行小程序开发所需工具和依赖的基础环境。建议安装长期支持(LTS)版本。 2. 安装微信开发者工具,您可以从 “微信公众平台” 官方下载地址下载对应操作系统版本的 “微信开发者工具” 并完成安装。 ### 3.2.拉取代码 - gite命令:git clone https://gitee.com/yucheng_3/mini-program-sdk.git (需要安装 git 管理工具) - 直接下载 zip 压缩包 ### 3.3.在 “微信开发者工具” 中导入项目 1. 打开微信开发者工具。 2. 点击 “导入项目” 按钮。 3. 在弹出的窗口中: 4. 选择刚才克隆并安装好依赖的项目目录。 5. 输入您的小程序 AppID(如果没有正式的 AppID,可以选择 “体验版” 或使用测试 AppID)。 6. 点击 “导入” 按钮。 7. 等待项目导入完成,微信开发者工具会自动检测项目配置并加载代码。 ## 4.视频教程 - 配置运行:https://www.bilibili.com/video/BV1jnLyzrEia?vd_source=1bbe446020fe3d8e8adfaf746df7984a - demo运行:https://www.bilibili.com/video/BV1G8LyzvE3m?vd_source=1bbe446020fe3d8e8adfaf746df7984a ### 4.1 蓝牙搜索连接场景 - 视频:https://www.bilibili.com/video/BV1VbLyzKEJf?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/searchLink - 详情:本项目提供详细的演示视频教程教您如何在项目中集成 SDK,并完整实现蓝牙扫描、连接及断开连接等核心功能。从环境配置到代码实操,全流程清晰指引,助您轻松掌握蓝牙功能开发要点,快速应用于实际项目场景 。 ### 4.2 设置类API - 视频:https://www.bilibili.com/video/BV17JLyzGEdc?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/setting - 详情:本项目详细指导开发者在完成蓝牙设备配对连接后,如何运用插件 API 实现高效的指令发送与设备交互。通过系统化的操作流程和代码示例,助您快速掌握利用 API 接口向蓝牙设备精准下达指令,轻松实现双向数据通信与功能控制 。 ### 4.3 获取设备信息API - 视频:https://www.bilibili.com/video/BV1ZNLmzEEGL?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/queryDeviceInfo - 详情:本项目所开发的 API 旨在实现:当设备通过蓝牙成功建立连接后,可调用该 API 快速地获取设备的各项信息数据,涵盖设备基础属性、设备状态、支持功能等多维度内容,为后续设备管理及功能拓展提供可靠的数据支持 。 ### 4.4 获取设备实时数据 - 视频:https://www.bilibili.com/video/BV1oNLmzEE9C?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/realTimeData - 详情:实时数据仅支持获取(实时步数),本项目主要功能为:在完成蓝牙设备连接后,能够实时地接收设备上传的健康数据,其中包括但不限于用户行走的实时步数等关键信息,可满足运动数据监测、健康状态分析等多样化应用场景需求。 ### 4.5 测量、同步数据 - 视频:https://www.bilibili.com/video/BV1oNLmzEE9Q?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/syncData - 详情:本项目以(心率)为实例实现同步,支持同步的数据:步数、心率、睡眠、血压、组合数据(包含血氧、呼吸率、体温、血糖等)、组合数据(包含血脂、尿酸等),基于蓝牙通讯协议,在设备成功配对并建立稳定连接后,启动健康数据实时采集程序。通过蓝牙通信协议,系统将采集到的健康数据同步至终端处理平台。 ### 4.6 ECG测量 - 视频:https://www.bilibili.com/video/BV17NLmzJEa6?vd_source=1bbe446020fe3d8e8adfaf746df7984a - 源码:https://gitee.com/easylive/ycsdkresource/tree/master/mini-program-resource/ecg - 详情:本项目提供API:测量ECG、同步ECG、删除ECG,基于蓝牙通信技术实现设备连接,通过调用 API 接口执行 ECG(心电图)心电测量功能。在测量过程中,支持实时同步 ECG 数据,便于数据的即时传输与分析;同时,也提供删除 ECG 数据的功能,可灵活管理历史心电数据,满足不同场景下的数据处理需求 。 ## 5. 版本说明 注意:插件分为两大类:完整版、基础版。根据实际情况选择版本,修改版本号必须看版本说明选择对应版本。 版本 3.x.1 为完整版带有OTA、表盘功能(占用:1000k左右) 版本 3.x.2 为基础版没有OTA、表盘功能 (占用: 60k左右 ) 版本 2.x.x 为完整版历史版本,不推荐使用(未压缩完整版占用过大,占用1300k左右) 版本 1.x.x 为基础版历史版本 ### 3.0.2 - 基础版没有OTA、表盘功能,搜索时使设备可被重复搜索(占用: 60k左右 ) ### 3.0.1 - 完整版带有OTA、表盘功能,搜索时使设备可被重复搜索(占用:1000k左右) ### 2.0.4 - 完整版,修复开启运动回调异常、完善寻找手机功能 ### 2.0.3 - 完整版,修复校准指令无解析返回 ### 2.0.1 - 完整版,修复测量血氧无数据返回 ### 2.0.0 - 基础版,新增表盘市场、OTA功能 ### 1.2.8 - 基础版,补充“获取设备信息”数据 ### 1.2.7 - 基础版,新增同步历史hrv、压力数据指令 ### 1.2.6 - 基础版,新增单次测量hrv、压力 ### 1.2.5 - 基础版,新增ECG测量指令 ### 1.2.4 - 基础版,监听单次测量结果、扫描设备刷新提示 ### 1.2.3 - 基础版,新增开始单次测量心率功能 # 二、API - 根据官方文档https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html ## 引用插件 ### 在app.json中引入插件 ```json "plugins": { "YCBluetooth-plugin": { // 插件名称,可以自定义。在下方 requirePlugin 时调用的名称需要与这里一致 "version": "3.1.2", // 版本号,可以在插件信息中查看所有历史版本信息,上方也有版本以供选择 "provider": "wxe1e0a9838f57e796" // 固定不变,插件信息 } }, ``` ### 通过 requirePlugin 来调用 api ```JavaScript // 在js文件中引入,requirePlugin()中的参数与app.json中配置的对应 const YCBluetoothPlugin = requirePlugin("YCBluetooth-plugin"); // 需要与上方自定义名称一致 ``` ## 初始化 ### API ```JavaScript // 初始化蓝牙适配器、然后会有其他内部操作进行处理。 function initBluetooth(callback); // 初始化 ``` ### 参数: - callback: 初始化的结果 ### 使用示例 ```JavaScript // 使用 res:返回success | fail YCBluetoothPlugin.initBluetooth((res) => { if(res == success){ // 初始化成功逻辑代码 } }); ``` 确保不要多次调用初始化操作,每次进入页面时都调用 initBluetooth,可能会导致蓝牙适配器重复初始化。虽然微信小程序的蓝牙适配器设计为可以多次打开和关闭,但频繁的初始化可能会引起一些不可预见的问题。建议是只进行一次初始化,不关闭也不再初始化。 ## 反初始化 ```JavaScript // 关闭蓝牙适配器,会断开所有连接,需要重新初始化打开蓝牙适配器才能进行下一次连接操作。 function deinitBluetooth(); ``` ### 参数 - 无 ### 使用示例 ```JavaScript // 一般不使用 YCBluetoothPlugin.deinitBluetooth(); ``` ## 1.设备相关 ### 1.1 搜索设备 #### API ```JavaScript function startSearchDevice(callback); ``` #### 参数 - 无 #### 使用示例 ```JavaScript startSearchDevice( function (devices) { // 搜索到的设备列表 -> BlueToothDevice[] if(devices.length > 0){ console.log('当前蓝牙设备的信号强度(单位 dBm):', device[0].RSSI); console.log('当前蓝牙设备的广播数据段中的 ManufacturerData 数据段:', device[0].advertisData); console.log('当前蓝牙设备的广播数据段中的 ServiceUUIDs 数据段:', device[0].advertisServiceUUIDs); console.log('当前蓝牙设备是否可连接( Android 8.0 以下不支持返回该值 ):', device[0].connectable); console.log('蓝牙设备 id:', device[0].deviceId); console.log('当前蓝牙设备的广播数据段中的 LocalName 数据段:', device[0].localName); console.log('蓝牙设备名称,某些设备可能没有:', device[0].name); console.log('当前蓝牙设备的广播数据段中的 ServiceData 数据段:', device[0].serviceData); } }); ``` ### 1.2 停止搜索 #### API ```JavaScript function stopSearchDevice(); ``` #### 参数 - 无 #### 使用示例 ```JavaScript stopSearchDevice(); ``` ### 1.3 连接设备 #### API ```JavaScript function connectDevice(deviceId, callBack); ``` #### 参数 - deviceId: 需要连接设备的设备ID, Android: mac地址, iOS: UUID - callBack: 连接结果 #### 使用示例 ```JavaScript // 连接设备 connectDevice(deviceId, function (isConnected, res) { // 是否连接 isConnected : true->成功 false->失败 // 失败信息 res if(isConnected){ console.log("连接成功") } else{ console.log("连接失败:" + res) } }); ``` ### 1.4 断开连接 #### API ```JavaScript function disconnectDevice(deviceId, callback); ``` #### 参数 - deviceId: 需要连接设备的设备ID, Android: mac地址, iOS: UUID - callBack: 断开连接结果 #### 使用示例 ```JavaScript disconnectDevice(deviceID, (isDisconnected, msg) => { // 是否断开 isDisconnected : true->成功 false->失败 // 失败信息 res if(isConnected){ console.log("断开成功") } else{ console.log("断开失败:" + res) } }); ``` ### 1.5 蓝牙状态回调 #### API ```JavaScript function onBLEConnectionStateChange(callback); ``` #### 参数 - 无 #### 使用示例 ```JavaScript onBLEConnectionStateChange((res) => { // connected: 连接状态 true-->连接 false-->未连接 // deviceId: 设备mac地址 }); ``` ## 2. 查询设备的信息 ### 2.1 查询设备的基本信息 #### API ```JavaScript function queryDeviceBasicInfo(completion); ``` #### 参数 - completion 是一个回调函数,用于接收查询的结果。 #### 返回值 ```JavaScript { deviceID: 设备ID号, mcuFirmwareMajorVersion: 固件主版本, mcuFirmwareSubVersion: 固件子版本, batteryStatus: 电池状态, 0:正常, 1:低电量, 2:充电中, 3:充满, batteryPower: 电量 0 - 100, bindStatus: 绑定状态, 0:未绑定, 1:已绑定, syncFlag: 同步标识, 0:无需同步, 1:需要同步, agreementSubVersion: 协议主版本,没有默认为0, agreementMajorVersion: 协议子版本,没有默认为0, bloodPressSubVersion: 血压固件主版本,没有默认为0, bloodPressMajorVersion: 血压固件子版本,没有默认为0, TPSubVersion: TP固件主版本,没有默认为0, TPMajorVersion: TP固件子版本,没有默认为0, bloodSugarSubVersion: 血糖固件主版本,没有默认为0, bloodSugarMajorVersion: 血糖固件子版本,没有默认为0, UISubVersion: UI主版本,没有默认为0, UIMajorVersion: UI子版本,没有默认为0, deviceType: 设备类型 0:手表, 1:戒指, 2:触摸戒指, 3:体温贴, 4:心电贴,, } ``` #### 使用示例 ```JavaScript queryDeviceBasicInfo(function (state, response) { console.log('设备的基础信息' + response) }); ``` ### 2.2 查询设备的MacAddress #### API ```JavaScript function queryDeviceMacAddress(completion); ``` #### 参数 - completion 是一个回调函数,用于接收查询的结果。 #### 使用示例 ```JavaScript queryDeviceMacAddress(function (state, response) { console.log('收到设备响应' + response) }); ``` ### 2.3 查询设备型号 #### API ```JavaScript function queryDevcieModel(completion); ``` #### 参数 - completion 是一个回调函数,用于接收查询的结果。 #### 使用示例 ```JavaScript queryDevcieModel(function (state, response) { console.log('设备型号信息' + response) }); ``` ### 2.4 查询设备主题信息 #### API ```JavaScript function queryDeviceTheme(completion); ``` #### 参数 - completion 是一个回调函数,用于接收查询的结果。 #### 使用示例 ```JavaScript // { // total: 主题总数, // current: 当前主题的下标, // } queryDeviceTheme(function (state, response) { console.log('主题信息' + response['total'] + ', ' + response['current']) }); ``` ### 2.5 查询设备平台 #### API ```JavaScript function queryDeviceMcu(completion); ``` #### 参数 - completion 是一个回调函数,用于接收查询的结果。 #### 使用示例 ```JavaScript queryDeviceMcu(function (state, response) { console.log('设备平台' + response) }); ``` ### 2.6 查询设备功能支持列表 #### API ```JavaScript function queryDevcieSupportFunction(); ``` #### 参数 - completion 是一个回调函数,用于存储结果. - 结果中存储的是一个对象,每个属性都有一个标志位,是一个布尔值。 > 注意: 定制设备一般不需要使用到此参数 #### 使用举例 ```JavaScript queryDevcieSupportFunction(function (state, response) { console.log('功能列表' + response) }); ``` ## 关于类型功能列表的类型补充 ```JavaScript /// 血压 var isSupportBloodPressure /// 语言设置 var isSupportLanguageSettings /// 消息推送 (总开关) var isSupportInformationPush /// 心率 var isSupportHeartRate /// OTA升级 var isSupportOta /// 实时数据上传 var isSupportRealTimeDataUpload /// 睡眠 var isSupportSleep /// 计步 var isSupportStep // ====== /// 多运动 var isSupportSport /// HRV var isSupportHRV /// 呼吸率 var isSupportRespirationRate /// 血氧 var isSupportBloodOxygen /// 历史ECG var isSupportHistoricalECG /// 实时ECG var isSupportRealTimeECG /// 血压告警 var isSupportBloodPressureAlarm /// 心率告警 var isSupportHeartRateAlarm // === 闹钟类型 ==== /// 闹钟数量 var alarmClockCount /// 闹钟类型 起床 var isSupportAlarmTypeWakeUp /// 闹钟类型 起床 var isSupportAlarmTypeSleep /// 闹钟类型 锻炼 var isSupportAlarmTypeExercise /// 闹钟类型 吃药 var isSupportAlarmTypeMedicine /// 闹钟类型 约会 var isSupportAlarmTypeAppointment /// 闹钟类型 聚会 var isSupportAlarmTypeParty /// 闹钟类型 会议 var isSupportAlarmTypeMeeting /// 闹钟类型 自定义 var isSupportAlarmTypeCustom // === 消息推送 === // 第一组 var isSupportInformationTypeTwitter var isSupportInformationTypeFacebook var isSupportInformationTypeWeiBo var isSupportInformationTypeQQ var isSupportInformationTypeWeChat var isSupportInformationTypeEmail var isSupportInformationTypeSMS var isSupportInformationTypeCall // 第二组 var isSupportInformationTypeTelegram var isSupportInformationTypeSkype var isSupportInformationTypeSnapchat var isSupportInformationTypeLine var isSupportInformationTypeLinkedIn var isSupportInformationTypeInstagram var isSupportInformationTypeMessenger var isSupportInformationTypeWhatsApp // ====== /// 翻腕亮屏 var isSupportWristBrightScreen /// 勿扰模式 var isSupportDoNotDisturbMode /// 血压水平设置 var isSupportBloodPressureLevelSetting /// 出厂设置 var isSupportFactorySettings /// 找设备 var isSupportFindDevice /// 找手机 var isSupportFindPhone /// 防丢提醒 var isSupportAntiLostReminder /// 久坐提醒 var isSupportSedentaryReminder // ====== /// 上传数据 加密 var isSupportUploadDataEncryption /// 通话 var isSupportCall /// 心电诊断 var isSupportECGDiagnosis /// 明日天气 var isSupportTomorrowWeather /// 今日天气 var isSupportTodayWeather /// 搜周边 var isSupportSearchAround /// 微信运动 var isSupportWeChatSports /// 肤色设置 var isSupportSkinColorSettings // ====== /// 温度 var isSupportTemperature /// 音乐控制 var isSupportMusicControl /// 主题 var isSupportTheme /// 电极位置 var isSupportElectrodePosition /// 血压校准 var isSupportBloodPressureCalibration /// CVRR var isSupportCVRR /// 腋温测量 var isSupportAxillaryTemperatureMeasurement /// 温度预警 var isSupportTemperatureAlarm // ====== /// 温度校准 var isSupportTemperatureCalibration /// 机主信息编辑 var isSupportHostInfomationEdit /// 手动拍照 var isSupportManualPhotographing /// 摇一摇拍照 var isSupportShakePhotographing /// 女性生理周期 var isSupportFemalePhysiologicalCycle /// 表盘功能 var isSupportWatchFace /// 通讯录 var isSupportAddressBook /// ECG结果精准 var isECGResultsAccurate // 运动模式 /// 登山 var isSupportMountaineering /// 足球 var isSupportFootball /// 乒乓球 var isSupportPingPang /// 户外跑步 var isSupportOutdoorRunning /// 室内跑步 var isSupportIndoorRunning /// 户外步行 var isSupportOutdoorWalking /// 室内步行 var isSupportIndoorWalking /// 实时监护模式 var isSupportRealTimeMonitoring /// 羽毛球 var isSupportBadminton /// 健走 var isSupportWalk /// 游泳 var isSupportSwimming /// 篮球 var isSupportPlayball /// 跳绳 var isSupportRopeskipping /// 骑行 var isSupportRiding /// 健身 var isSupportFitness /// 跑步 var isSupportRun /// 室内骑行 var isSupportIndoorRiding /// 踏步机 var isSupportStepper /// 划船机 var isSupportRowingMachine /// 仰卧起坐 var isSupportSitups /// 跳跃运动 var isSupportJumping /// 重量训练 var isSupportWeightTraining /// 瑜伽 var isSupportYoga // === /// 同步运动实时数据 var isSupportSyncRealSportData /// 启动心率测量 var isSupportStartHeartRateMeasurement /// 启动血压测量 var isSupportStartBloodPressureMeasurement /// 启动血氧测量 var isSupportStartBloodOxygenMeasurement /// 启动体温测量 var isSupportStartBodyTemperatureMeasurement /// 启动呼吸率测量 var isSupportStartRespirationRateMeasurement /// 自定义表盘 var isSupportCustomWatchface // ====================================== /// 精准血压测量 var isSupportAccurateBloodPressureMeasurement /// SOS开关 var isSupportSOS /// 血氧告警 var isSupportBloodOxygenAlarm /// 精准血压实时数据上传 var isSupportAccurateBloodPressureRealTimeDataUpload /// Viber消息推送 var isSupportInformationTypeViber /// 其它消息推送 var isSupportInformationTypeOther /// 自定义表盘颜色翻转 var isFlipCustomDialColor // 是否支持压力 var isSupportPressure // 是否支持测量血压 var isSupportStartHRV // 是否支持测量血氧 var isSupportStartBloodSugar // 是否支持测量压力 var isSupportStartPressure ``` ## 3. 设置设备的参数 设置类API回调返回为单值:0 -- > 成功 1 --> 失败 ### 3.1 设置步数目标 #### API ```JavaScript function setDeviceStepGoal(step, completion); ``` #### 参数 - step 目标步数 - completion 调用API的结果回调函数 #### 使用示例 ```JavaScript setDeviceStepGoal(100000, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.2 设置睡眠目标 #### API ```JavaScript function setDeviceSleepGoal(hour, minute, completion); ``` #### 参数 - hour 睡眠小时 - minute 睡眠分钟 - completion 调用API的结果回调函数 #### 使用示例 ```JavaScript // 睡眠目标 8小时30分 setDeviceStepGoal(8, 30, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.3 查询闹钟 #### API ```JavaScript function queryDeviceAlarm(completion); ``` #### 参数 - 无 #### 使用示例 ```JavaScript queryDeviceAlarm(function (state, res) { if (state == succeed) { // 查询到闹钟 // 循环获取闹钟数据 /* // 闹钟结果 [ { alarmType: 闹钟类型 在当前文档最后中有定义 alarmTypeXXX的常量, hour: 闹钟的时 0 ~ 23, minute: 闹钟的分 0 ~ 59, repeat: 重复数组 每个元素是 reapeatXXX的值 在当前文档最后中有定义, snoozeTime: 贪睡时长 0 ~ 59, } ] */ } else { console.log("查询失败:" + res) } }); ``` ### 3.4 删除闹钟 #### API ```JavaScript function deleteDeviceAlarm(hour, minute, completion); ``` #### 参数 - hour: 闹钟的时 0 ~ 23 - minute: 闹钟的分 0 ~ 59 - completion: 执行的结果回调 #### 使用示例 ```JavaScript // 删除12点30分的闹钟 deleteDeviceAlarm(12, 30, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.5 增加闹钟 ```JavaScript function addDeviceAlarm(alarmType, hour, minute, repeat, snoozeTime, completion); ``` #### 参数 - alarmType: 闹钟类型 在当前文档最后中有定义 alarmTypeXXX的常量 - hour: 时 0 ~ 23 - minute: 分 0 ~ 59 - repeat: 重复 数组 传入 reapeatXXX的数组 在当前文档最后中有定义 - snoozeTime: 贪睡时长 0 ~ 59 - completion: 执行结果的回调 #### 使用示例 ```JavaScript // 添加一个7:30起床的闹钟 addDeviceAlarm( alarmTypeWakeUp, 7, 30, [ repeatMonday, repeatTuesday, repeatWednesday, repeatThursday, repeatFriday, repeatSaturday, repeatSunday, repeatEnable, ], 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.6 修改闹钟 #### API ```JavaScript function modifyDeviceAlarm(oldHour, oldMinute, hour, minute, alarmType, repeat, snoozeTime, completion); ``` #### 参数 - oldHour: 闹钟原来的时 0 ~ 23 - oldMinute: 闹钟原来的分 0 ~ 59 - hour: 闹钟新的时 0 ~ 23 - minute: 闹钟新的分 0 ~ 59 - alarmType: 闹钟类型 在当前文档最后中有定义 alarmTypeXXX的常量 - repeat: 重复 数组 传入 reapeatXXX的数组 在当前文档最后中有定义 - snoozeTime: 贪睡时长 0 ~ 59 - completion: 执行结果的回调 #### 使用示例 ```JavaScript // 将每天起床的闹钟改为睡觉的闹钟 modifyDeviceAlarm( 7, 30, 22, 0, alarmTypeSleep, [ repeatMonday, repeatTuesday, repeatWednesday, repeatThursday, repeatFriday, repeatSaturday, repeatSunday, repeatEnable, ], 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.7 设置时间 注意:连接后必须同步一次时间,否则可能导致测量时间不准,数据为无效数据 - 时间只支持公历,不支持农历,佛历等其它形式。 #### API ```JavaScript function setDeviceTime(year, month, day, hour, minute, second, completion); ``` #### 参数 - year: 年 - month: 月 - day: 日 - hour: 时 - minute: 分 - second: 秒 - completion: 执行的结果回调 #### 使用示例 ```JavaScript // 2025年4月24日9点30分0秒 setDeviceTime(2025, 4, 24, 9, 30, 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.8 设置用户信息 #### API ```JavaScript function setDeviceUserInfo(height, weight, gender, age, completion); ``` #### 参数 - height: 身高 100 ~ 255 cm - weight: 体重 kg 30 ~ 200 kg - 性别: 0 表示男,1表示女 - age: 6 ~ 120 - completion: 设置成功否的回调 #### 使用示例 ```JavaScript setDeviceUserInfo(180, 120, 0, 18, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.9 设置单位 #### API ```JavaScript function setDeviceUnit(distance, weight, temperature, timeFormat, completion); ``` #### 参数 - distance: 距离单位 0: km, 1: mile - weight: 体重单位 0: kg, 1: lb - 温度单位: 0: °C, 1: °F - 时间格式 0: 24小时制, 1: 12小时制 #### 使用示例 ```JavaScript setDeviceUnit(0, 0, 0, 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.10 设置久坐提醒 #### API ```JavaScript function setDeviceSedentary( startHour1, startMinute1, endHour1, endMinute1, startHour2, startMinute2, endHour2, endMinute2, interval, repeat, completion ); ``` #### 参数 - startHour1: 开始时间1 时 0 ~ 23 - startMinute1: 开始时间1 分 0 ~ 59 - endHour1: 结束时间1 时 0 ~ 23 - endMinute1: 结束时间1 分 0 ~ 59 - startHour2: 开始时间2 时 0 ~ 23 - startMinute2: 开始时间2 分 0 ~ 59 - endHour2: 结束时间2 时 0 ~ 23 - endMinute2: 结束时间2 分 0 ~ 59 - interval: 提醒间隔 15 ~ 45 分钟 - repeat: 重复时间的数组,每个元素都是以repeatXX的元素,在当前文档最后中有定义 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 8:30 ~ 12:30 14:00 ~ 18:30 每隔15分钟提醒一次,一周七天都提醒 setDeviceSedentary( 8, 30, 12, 30, 14, 0, 18, 30, 15, [ repeatMonday, repeatTuesday, repeatWednesday, repeatThursday, repeatFriday, repeatSaturday, repeatSunday, repeatEnable, ], function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.11 设置防丢 #### API ```JavaScript function setDeviceAntiLost(isEnable, completion); ``` #### 参数 - isEnable: 开启或关闭防丢 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript setDeviceAntiLost(true, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.12 设置左右手佩戴位置 #### API ```JavaScript function setDeviceWearingPosition(isRightHand, completion); ``` #### 参数 - isRightHand: 是否为右手 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 左手佩戴 setDeviceWearingPosition(false, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.13 设置心率报警 #### API ```JavaScript setDeviceHeartRateAlarm(isEnable, maxValue, minValue, completion); ``` #### 参数 - isEnable: 开启或关闭心率报警 - maxValue: 最高心率 100 – 240 - minValue: 最低心率 30-60 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 超过 120bpm 或 低于40 bpm 报警 setDeviceHeartRateAlarm(true, 120, 40, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.14 设置心率、健康监测模式 #### API ```JavaScript function setDeviceHeartRateMonitoringMode(isEnable, interval, completion); ``` #### 参数 - isEnable: 开启或关闭自动监测 true:开启 false:关闭 - interval: 间隔时间 1 ~ 60分钟,值越小,手表的功耗越大。 - completion: 设置是否成功的回调. #### 使用示例 ```JavaScript // 设置间隔30分钟监测一次 setDeviceHeartRateMonitoringMode(true, 30, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.15 设置找手机 #### API ```JavaScript function setDeviceFindPhone(isEnable, completion); ``` #### 参数 - isEnable: 开启或关闭 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript setDeviceFindPhone(true, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.16 恢复出厂设置 #### API ```JavaScript function setDeviceReset(); ``` #### 参数 - 无 #### 使用示例 ```JavaScript // 执行后,设备会重启并恢复出厂设置 setDeviceReset(); ``` ### 3.17 设置勿扰时间 #### API ```JavaScript function setDeviceNotDisturb(isEnable, startHour, startMinute, endHour, endMinute, completion); ``` #### 参数 - isEnable: 开启或关闭勿扰 - startHour: 开始时间的 时 0 ~ 23 - startMinute: 开始时间的 分 0 ~ 59 - endHour: 结束时间的 时 0 ~ 23 - endMinute: 结束时间的 分 0 ~ 59 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 9:30 ~ 12:00 启动勿扰 setDeviceNotDisturb(true, 9, 30, 12, 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.18 设置设备语言 #### API ```JavaScript function setDeviceLanguage(language, completion); ``` #### 参数 - language: 语言代码, 如果设备不支持则会显示为英语。 ```Plaintext 0x00:英语 0x01: 中文 0x02: 俄语 0x03: 德语 0x04: 法语 0x05: 日语 0x06: 西班牙语 0x07: 意大利语 0x08: 葡萄牙文 0x09: 韩文 0x0A: 波兰文 0x0B: 马来文 0x0C: 繁体中文 0x0D: 泰语 0x0E: 印尼语 0x0F: 越南语 0x10: 匈牙利语 0x11: 缅甸语 0x12: 爱沙尼亚语 0x13: 拉丁语 0x14: 保加利亚语 0x15: 蒙古语 0x16: 塞尔维亚语 0x17: 波斯语 0x18: 孟加拉语 0x19: 突厥语 0x1A: 阿拉伯语 0x1B: 希腊语 0x1C: 马来西亚语 0x1D: 希伯来语 0x1E: 芬兰语 0x1F: 捷克语 0x20: 克罗地亚语 0x21: 马其顿语 0x22: 威尔士语 0x23: 乌尔都语 0x24: 伊朗语 0x25: 白俄罗斯语 0x26: 荷兰语 0x27: 乌克兰语 0x28: 土耳其语 0x29: 老挝语 0x2A: 阿尔巴尼亚语 0x2B: 丹麦语 0x2C: 瑞典语 0x2D: 挪威语 0x2E: 冰岛语 0x2F: 梵语 0x30: 吉普赛语 0x31: 印地语 0x32: 罗马尼亚文 0xFF:其它 ``` - completion: 设置语言是否成功的回调 #### 使用示例 ```JavaScript // 设置中文 setDeviceLanguage(0x01, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.19 设置抬腕亮屏 #### API ```JavaScript function setDeviceWristBrightScreen(isEnable, completion); ``` #### 参数 - isEnable: 开启或关闭 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript setDeviceWristBrightScreen(true, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.20 设置屏幕亮度 #### API ```JavaScript function setDeviceDisplayBrightness(level, completion); ``` #### 参数 - level: 亮度 0:低, 1: 中, 2: 高 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript setDeviceDisplayBrightness(1, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.21 设置肤色 #### API ```JavaScript function setDeviceSkinColor(level, completion); ``` #### 参数 - level: 肤色 0:白, 1: 白间黄, 2: 黄, 3: 棕色, 4: 褐色, 5: 黑色 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 设置黄色皮肤 setDeviceSkinColor(2, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.22 设置主题 #### API ```JavaScript function setDeviceTheme(index, completion); ``` #### 参数 - index: 主题序号,从0开始。 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 显示第2个主题。 setDeviceTheme(1, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.23 设置温度报警 #### API ```JavaScript function setDeviceTemperatureAlarm( isEnable, highTemperatureIntegerValue, highTemperatureDecimalValue, lowTemperatureIntegerValue, lowTemperatureDecimalValue, completion ); ``` #### 参数 - isEnable: 开启或关闭温度报警 - highTemperatureIntegerValue: 高温整数值 36 – 100 摄氏度 - highTemperatureDecimalValue: 高温小数值 0-9 摄氏度 - lowTemperatureIntegerValue: 低温整数值 -127 - 36 摄氏度 - lowTemperatureDecimalValue: 低温小数值 0-9 摄氏度 - completion: 设置是否成功的回调 #### 使用示例 ```JavaScript // 设置高温度 38.0 报警 setDeviceTemperatureAlarm(true, 38, 0, 0, 0, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ### 3.24 设置温度监测模式 #### API ```JavaScript function setDeviceTemperatureMonitoringMode(isEnable, interval, completion); ``` #### 参数 - isEnable: 开启或关闭自动监测 - interval: 间隔时间 1 ~ 60分钟,值越小,手表的功耗越大。 - completion: 设置是否成功的回调. #### 使用示例 ```JavaScript setDeviceTemperatureMonitoringMode(true, 60, function (state, response) { if (state == succeed) { // 设置成功 } else { // 设置失败 } }); ``` ## 4. 获取与删除健康数据 健康数据用于查询手表中的步数、心率、血压、血氧、体温等。 ### 4.1 查询健康数据 #### API ```JavaScript function queryDeviceHealthData(dataType, completion); ``` #### 参数 - dataType 查询健康数据类型,具体的参数定义在 当前文档最后中有声明,都以queryHelathData开头。 - queryHealthDataStep: 查询步数 - queryHealthDataSleep: 查询睡眠 - queryHealthDataHeartRate: 查询心率 - queryHealthDataBloodPressure: 查询血压 - queryHealthDataCombinedData: 查询组合数据(包含血氧、呼吸率、体温、血糖等). - queryHealthDataInvasiveMeasurement: 查询组合数据(包含血脂、尿酸等). - queryHealthDataECG:查询ECG - completion - 这是一个回调函数,包含状态码及具体的参数信息。具体的使用,请参照使用示例。 - 注意 - 在 queryHealthDataCombinedData 获取的值中也有心率、血压和步数这些数据,但不要使用。 - 查询温度时,如果温度的小数值为`15`, 表示这个值是无效的,应弃之。 #### 使用示例 - 这里以步数为例,其它数据只是类型不同,及返回的对象不同。 ```JavaScript // state 是一个状态码 // response 是一个对象数组 queryDeviceHealthData(queryHealthDataStep, function (state, response) { if (state != succeed) { return } response.forEach(info => { console.log(info) console.log(info.startTime + ', ' + info.endTime + ',' + info.step + ',' + info.distance + ',' + info.calories) }); }) ``` ### 4.2 删除健康数据 查询到健康数据后。应该进行进存处理后,删除设备中的数据。 #### API ```JavaScript function deleteDeviceHealthData(dataType, callback); ``` #### 参数 - dataType 删除健康数据类型,具体的参数定义在 当前文档最后中有声明,都以deleteHealthData开头。 - deleteHealthDataStep: 删除步数 - deleteHealthDataSleep: 删除睡眠 - deleteHealthDataHeartRate: 删除心率 - deleteHealthDataBloodPressure: 删除血压 - deleteHealthDataCombinedData: 删除组合数据(包含血氧、呼吸率、体温等). - deleteHealthDataInvasiveMeasurement:删除血脂尿酸 - completion - 这是一个回调函数,包含状态码及具体的参数信息。具体的使用,请参照使用示例。 #### 使用示例 ```JavaScript // 删除步数 deleteDeviceHealthData(deleteHealthDataStep, function (isdel, res) { if (isdel) { console.log("删除成功") } else { console.log("删除失败") } }); ``` ### 4.3 健康数据类型补充说明 - 使用4.1中的API返回的结果是一个对象数组,不同类型的对象结构不相同,下面将分别说明。 #### 4.3.1 步数 ```JavaScript { startTime: 开始时间戳, 单位:秒, endTime: 结束时间戳, 单位:秒, step: 步数,, 单位:步, distance: 距离, 单位:米, calories: 卡路里,单位:千卡, } ``` #### 4.3.2 睡眠 ```JavaScript { startTime: 开始时间戳, 单位:秒, endTime: 结束时间戳, 单位:秒, deepSleepCount: 深睡次数**(Deprecated)**, lightSleepCount: 浅睡次数**(Deprecated)**, deepSleepMinutes: 深睡时长, 单位: 秒**(Deprecated)**, remSleepMinutes: 快速眼动时间, 单位:秒**(Deprecated)**, lightSleepMinutes: 浅睡时长, 单位:秒**(Deprecated)**, remSleepDuration:快速眼动时间, 单位:秒 deepSleepDuration:深睡时长,单位:秒 lightSleepDuration:浅睡时长, 单位:秒 detail: [ { startTime: 开始时间戳, 单位:秒, sleepType: 睡眠类型 lightSleepFlag,deepSleepFlag,remSleepFlag,awakeSleepFlag, duration: 睡眠持续时间, 单位:秒, } ] } ``` #### 4.3.3 心率 ```JavaScript { startTime: 开始时间戳, 单位:秒, mode: 测量模式, 0: 单次模式, 1:监测模式, heartRate: 心率值, } ``` #### 4.3.4 血压 ```JavaScript { startTime: 开始时间戳, 单位:秒, mode: 测量模式, 0: 单次模式, 1:监测模式, 2: 充气血压, systolicBloodPressure: 收缩压, diastolicBloodPressure: 舒张压, } ``` #### 4.3.5 组合数据 ```JavaScript { startTime: 开始时间戳, 单位:秒, step: 步数, 单位: 步, (不要使用) heartRate: 心率, (不要使用) systolicBloodPressure: 收缩压, (不要使用) diastolicBloodPressure: 舒张压, (不要使用) bloodOxygen: 血氧, respirationRate: 呼吸率, hrv: hrv, cvrr: cvrr, temperatureInteger: 温度整数, 单位: 摄氏, temperatureDecimal: 温度小数, 单位: 摄氏, fatInteger: 体脂整数, fatDecimal: 体脂小数, bloodGlucose: 血糖值(浮点值), } ``` #### 4.3.6 有创综合数据 ```JavaScript { startTime: 开始时间戳, 单位:秒, bloodGlucoseModel: 血糖模式 0非精准 1精准 bloodGlucoseInteger: 血糖整数 血糖取值范围:1.1mmol/L~33.3mmol/L bloodGlucoseFloat: 血糖小数 uricAcidModel: 尿酸模式 0非精准 1精准 uricAcid: 尿酸值, bloodKetoneModel: 血酮模式 0非精准 1精准, bloodKetoneInteger: 血酮整数, bloodKetoneFloat: 血酮小数, bloodFatModel: 血脂模式 0非精准 1精准, cholesterolInteger: 总胆固醇整数部分, cholesterolFloat: 总胆固醇小数部分(0-99), highLipoproteinCholesterolInteger: 高密度脂蛋白胆固醇 整数, highLipoproteinCholesterolFloat: 高密度脂蛋白胆固 醇小数(0-99), lowLipoproteinCholesterolInteger: 低密度脂蛋白 胆固醇 整数 lowLipoproteinCholesterolFloat: 低密度脂蛋白胆固 醇 小 数(0-99) triglycerideCholesterolInteger: 甘油三酯整数 triglycerideCholesterolFloat: 甘油三酯小数部分(0~99) } ``` ## 5. AppControl ### 5.1 找手环 #### API ```JavaScript function findDevice(remindCount, remindInterval, completion); ``` #### 参数 - remindCount 设备提醒次数 1 ~ 10, 建议使用 5 - remindInterval 提醒间隔 1 ~ 3 建议使用 1 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 > 调用后手环发生震动 #### 使用举例 ```JavaScript findDevice(5, 1, (state, res) => { if (state == succeed) { console.log("查询设备"+res) } else { console.log("查询设备"+res) } }) ``` ### 5.2 血压校准 #### API ```JavaScript function deviceBloodPressureCalibration(systolicBloodPressure, diastolicBloodPressure, completion); ``` #### 参数 - systolicBloodPressure 收缩压 - diastolicBloodPressure 舒张压 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 > 手表测试的光电血压有很大的偏差时,可以使用个方法对手表进行校准。 #### 使用举例 ```JavaScript // 校准值 115/75 deviceBloodPressureCalibration(115, 75, (state, res) => { if (state == succeed) { console.log("血压校准"+res) } else { console.log("血压校准"+res) } }) ``` ### 5.3 天气信息发送 #### API ```JavaScript // 发送今天天气 function sendDeviceWeatherData( lowestTemperature, highestTemperature, realTimeTemperature, weatherType, completion ); // 发送明天天气 function sendDeviceTomorrowWeatherData( lowestTemperature, highestTemperature, realTimeTemperature, weatherType, completion ); ``` #### 参数 - lowestTemperature 最低温度 摄氏 - highestTemperature 最高温度 摄氏 - realTimeTemperature 实时温度 摄氏 - weatherType 天气类型 具体的参数定义在 当前文档最后中有声明,都以weatherTypeXXX开头。 - weatherTypeUnknow 未知天气 - weatherTypeSunny 晴天 - weatherTypeCloudy 多云 - weatherTypeWind 大风 - weatherTypeRain 下雨 - weatherTypeSnow 下雪 - weatherTypeFoggy 大雾 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 今天 实时22度, 19~20度 晴天 sendDeviceWeatherData( 19, 20, 22, weatherTypeSunny, (state, res) => { if (state == succeed) { console.log("设置天气"+res) } else { console.log("设置天气"+res) } }) // 明天 实时15度, 12~17度 雨天 sendDeviceTomorrowWeatherData( 12, 17, 15, weatherTypeRain, (state, res) => { if (state == succeed) { console.log("设置天气"+res) } else { console.log("设置天气"+res) } }) ``` ### 5.5 启动或关闭实时数据上传 #### API ```JavaScript // 开启或关闭实数据上传 function realTimeDataUplod(isEnable, dataType, completion); ``` #### 参数 - isEnable 是否开启 - true 开启 - false 关闭 - dataType 数据类型 具体的参数定义在 当前文档最后中有声明,一般只用到 步数、心率、血压三个, 其余作为保留参数 - realStepDataUpload 步数 - realHeartRateDataUpload 心率 - realBloodOxygenUpload 血氧 - realBloodPressureUpload 血压 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 注意:其他健康数据(除步数外所有的实时数据)需要配合健康监测使用,设置健康监测时间为30分钟,则每30分钟上报一次数据,下方实时数据才能获取到相应的健康数据,不过目前该API只用于获取实时步数,其他实时数据已废弃,其他健康数据请使用“第四节同步数据” 获取。 #### 使用举例 ```JavaScript // 开启步数上传 realTimeDataUplod(true, realStepDataUpload, (state, res) => { if(state == succeed){ console.log("开启步数上传"+res) } }) // 关闭步数上传 realTimeDataUplod(false, realStepDataUpload, (state, res) => { if(state == succeed){ console.log("关闭步数上传"+res) } }) ``` ### 5.6 接收实时数据 #### API ```JavaScript function receiveRealTimeData(completion); ``` #### 参数 - completion - 这是一个回调函数,包含态状码数据类型及具体数据。 - 接收数据类型 具体的参数定义在 当前文档最后中有声明,都以receivedRealTime开头,一般只用到 步数、心率、血压、光电、心电, 其余作为保留参数 - receivedRealTimeStep 步数 - receivedRealTimeHeartRate 心率 - receivedRealTimeBloodOxygen 血氧 - receivedRealTimeBloodPressure 血压 - receivedRealTimePPG 光电 - receivedRealTimeECG 心电 - receivedRealTimeMonitoringMode 监测数据(包含运动) #### 使用举例 ```JavaScript receiveRealTimeData(function(realTimeDataType, res){ // 步数 if (realTimeDataType == receivedRealTimeStep) { console.log("实时步数:"+res) // 心率 } else if (realTimeDataType == receivedRealTimeHeartRate) { console.log("实时心率"+res) } }) ``` > 注意这个方法要在 5.5 节的方法开启前实现,否则会丢失数据。 ### 5.7 关机、复位重启 #### API ```JavaScript function deviceSystemOperator(mode, completion); ``` #### 参数 - mode 0x01: 关机, 0x02: 进入运输模式, 0x03: 系统复位重启 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 关机 deviceSystemOperator(1, (state, res) => { if (state == succeed) { console.log("操作成功"+res) } else { console.log("操作失败"+res) } }) // 复位重启 deviceSystemOperator(3, (state, res) => { if (state == succeed) { console.log("操作成功"+res) } else { console.log("操作失败"+res) } }) ``` ### 5.8 开启或停止运动 #### API ```JavaScript function controlSport(isEnable, sportType, completion); ``` #### 参数 - isEnable 开始或停止运动 - sportType: 运动类型 0x00: 预留 0x01: 跑步 0x02: 游泳 0x03: 骑行 0x04: 健身 0x05: 预留 0x06: 跳绳 0x07: 篮球 0x08: 健走 0x09: 羽毛球 0x0A: 足球 0x0B: 登山 0x0C: 乒乓球 0x0D:自由模式 0x0E:室内跑步 (或跑步机) 0x0F:户外跑步 0x10:户外步行 0x11:室内步行 0x12:走跑模式 0x13:室内骑行(或动感单车) 0x14:踏步机 0x15:划船机 0x16:实时监护模式 0x17:仰卧起 坐 0x18:跳跃运动 0x19:重量训练 0x1A: 瑜伽 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 开始运动 controlSport(true, 0x01, (state, res) => { if (state == succeed) { console.log("开始运动"+res) } else { console.log("开始运动"+res) } }) // 结束运动 controlSport(false, 0x01, (state, res) => { if (state == succeed) { console.log("结束运动"+res) } else { console.log("结束运动"+res) } }) ``` ### 5.9 运动数据接收 - 手环数据接收都是使用 5.6 节的方法来处理,不同的是如果是旧手环,则需要主动开启步数和心率上报(即分别调用两次5.5节的方法进行开启上传),而新版本的固件则不需要,直接接收手环的数据 ```JavaScript receiveRealTimeData(function(realTimeDataType, res){ if (realTimeDataType == receivedRealTimeStep) { // 运动中的 步数 距离 卡路里 (旧设备) console.log("实时步数"+JSON.stringify(res)) } else if (realTimeDataType == receivedRealTimeHeartRate) { // 运动过程中的心率 (旧设备) console.log("实时心率"+JSON.stringify(res)) } else if () { // 新设备: 时间 ,心率 ,步数,距离,卡路里 // startTimeStamp, heartRate, modeStep, modeDistance, modeCalories } }) ``` ### 5.10 血糖校准 > 手表测量的血糖有很大的偏差时,可以使用个方法对手表进行校准。 #### API ```JavaScript function deviceBloodGlucoseCalibratioin(bloodGlucoseIntegral, bloodGlucoseFractional, mode, completion); ``` #### 参数 - bloodGlucoseIntegral 血糖校准值整数部分 - bloodGlucoseFractional 血糖校准值小数部分 - mode 血糖校准模式 - bloodGlucoseCalibrationModeBeforeMeal 餐前 - bloodGlucoseCalibrationModeAfterMeal 餐后 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 校准值 4.9 餐前 deviceBloodGlucoseCalibratioin(4, 9, 0, (state, res) => { if (state == succeed) { console.log("血糖校准成功:"+res) } else { console.log("血糖校准失败:"+res) } }) ``` ### 5.11 PPG波形上传 > 部分定制手表,需要获取PPG数据,此功能需要具体的手表固件功能支持。 #### API ```JavaScript function waveDataUploadControl(state, dataType, completion); ``` #### 参数 - state 上传状态 - waveUploadStateOff 关闭 - waveUploadStateUploadWithOutSerialnumber 开始上传且上传包不带序号 (开启时使用此参数即可) - waveUploadStateUploadSerialnumber 开始上传且上传包带8位序号 (此参数暂时不使用) - dataType 波形类型 - waveUploadDataTypePPG 光电波形 - waveUploadDataTypeECG 心电波形 - waveUploadDataTypeMultiAxisSensor 多轴传感器波形 (保留参数,暂时不支持) - waveUploadDataTypeAmbientLight 环境光波形 (保留参数,暂时不支持) - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 关闭PPG上传 waveDataUploadControl(waveUploadStateOff, waveUploadDataTypePPG, (state, res) => { if (state == succeed) { console.log("ppg上传成功:"+res) } else { console.log("ppg上传失败:"+res) } } // 开启PPG上传 receiveRealTimeData(function(realTimeDataType, res){ if (realTimeDataType == receivedRealTimePPG) { console.log("实时PPG:"+res) } } waveDataUploadControl(waveUploadStateUploadWithOutSerialnumber, waveUploadDataTypePPG, (state, res) => {} ``` ### 5.12 尿酸校准 > 手表测量的尿酸有很大的偏差时,可以使用个方法对手表进行校准。 #### API ```JavaScript function deviceUricAcidCalibratioin(bloodGlucoseIntegral, bloodGlucoseFractional, mode, completion); ``` #### 参数 - range 范围 179-1190 单位:μmol/L - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 校准值 179 餐前 deviceUricAcidCalibratioin(179, (state, res) => { if (state == succeed) { console.log("尿酸校准成功:"+res) } else { console.log("尿酸校准失败:"+res) } }) ``` ### 5.13 血脂校准 > 手表测量的血脂有很大的偏差时,可以使用个方法对手表进行校准。 #### API ```JavaScript function deviceBloodFatCalibratioin(bloodGlucoseIntegral, bloodGlucoseFractional, mode, completion); ``` #### 参数 - bloodGlucoseIntegral 血糖校准值整数部分 - bloodGlucoseFractional 血糖校准值小数部分 - mode 血糖校准模式 - bloodGlucoseCalibrationModeBeforeMeal 餐前 - bloodGlucoseCalibrationModeAfterMeal 餐后 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 校准值 4.9 餐前 deviceBloodGlucoseCalibratioin(4, 9, 0, (state, res) => { if (state == succeed) { console.log("血脂校准成功:"+res) } else { console.log("血脂校准失败:"+res) } }) ``` ### 5.14 控制开始测量 #### API ```JavaScript function measureHealthData(dataType, switchType, healthType, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataInvasiveMeasurement 控制开始测量的 key - queryHealthDataInvasiveMeasurement Key - switchType 开关类型 - start 单次测量 - stop 关闭 - continuous 连续测量 - healthType 测量的健康数据 - measureHrData 心率 - measureBpData 血压 - measureBoData 血氧 - measureBrData 呼吸率 - measureTempData 体温 - measureBsData 血糖 - measureUaData 尿酸 - measureBkData 血酮 - measureEdaData EDA - measureHfData 血脂 - measureHrvData HRV - measurePpgData PPG - measurePressData 压力 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // 该API返回的是:开启测量是否成功,测量的数据需要5.6节接收设备上报的实时数据 appControlAPI.measureHealthData(queryHealthDataInvasiveMeasurement, start, measureHrData,(state,res)=>{ if (state == succeed) { this.setData({ canvasText: this.data.canvasText + "\n返回数据:"+ JSON.stringify(res), }) // 监听设备上报测量健康数据 this.receivedRealTimeHeartRate() } else{ this.setData({ canvasText: this.data.canvasText + "\n返回数据:"+ JSON.stringify(res), }) } }) // 注册监听,获取设备测量时返回的健康数据 receiveRealTimeData((realTimeDataType, res)=> { if (realTimeDataType == receivedRealTimeHeartRate) { console.log("测量心率:" + JSON.stringify(res)) this.setData({ heartRate: JSON.stringify(res) }) } else if (realTimeDataType == measureStatus) { console.log("单次测量结果:" + JSON.stringify(res)) this.setData({ apiName:"测量结果", status: JSON.stringify(res) }) } }) ``` ## 6. 发状健康信息 ### API ```JavaScript function sendHealthContent(healthInfoType, textArray, completion) ``` ### 参数 - healthInfoType: 信息类型,在constant中有定义. - YCDistributeHealthInfoTypeHealthAdvice 健康建议 - const YCDistributeHealthInfoTypeNutritiousMeals 营养膳食 - const YCDistributeHealthInfoTypeWorkOut 运动健身 - const YCDistributeHealthInfoTypeMentalSleep 心理睡眠 - const YCDistributeHealthInfoTypeTraditionalChineseMedicine 中医养生 - const YCDistributeHealthInfoTypeHealthFoodData 食材数据 - textArray 健康内容数组 - 每个标题对就一段文字内容,且标题不能超过七个中文字符。 - 以[[标题1, 内容1], [标题2, 内容2], ..., [标题n, 内容n]]的形式传递。 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 ### 使用举例 ```JavaScript sendHealthContent( constant.YCDistributeHealthInfoTypeHealthAdvice, [ ["合理膳食A", "少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。"], ["健康饮食B", "人是铁,钣是钢,人活着总要吃饭的。 人是铁,钣是钢,人活着总要吃饭的 人是铁,钣是钢,人活着总要吃饭的 人是铁,钣是钢,人活着总要吃饭的"], ["合理膳食C", "少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 "], ["健康饮食D", "人是铁,钣是钢,人活着总要吃饭的。 人是铁,钣是钢,人活着总要吃饭的 人是铁,钣是钢,人活着总要吃饭的 人是铁,钣是钢,人活着总要吃饭的"], ["合理膳食E", "少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 少吃垃圾食品,合理膳食,一日三餐都要均衡饮食。 "], ], function (state, response){ }); ``` ## 7.ECG ### 7.1 获取ECG数据总数 #### API ```JavaScript function queryCollectDataCount(dataType, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataECG 获取ECG数据 - queryHealthDataECG ECG - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryCollectDataCount( queryHealthDataECG ,(state, res) => { // 获取ECG数据总数 // state 状态 0 --> 成功 1 --> 失败 6 --> 无数据 // res 数据 if(state == succeed){ console.log("获取ECG总数成功:"+res) } else{ console.log("获取失败:"+state) } }) ``` ### 7.2 根据索引获取ECG数据 #### API ```JavaScript function queryCollectIndexDataInfo(dataType,index,uploadEnable, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataECG 获取ECG数据 - queryHealthDataECG ECG - index 索引 - 先使用 queryCollectDataCount 获取设备数据总数 (索引) - uploadEnable 是否上报 - true 上报 上报数据则是获取心电原始数据 - false 不上报 不上报数据则是获取数据总量信息,时间、字节数、包数等 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryCollectIndexDataInfo(queryHealthDataECG,index,false,(state,res)=>{ // 根据索引获取一条ECG数据,获取所有可以使用循环 // state 状态 0 -> 成功 1 -> 失败 // res 数据 [] if (state == succeed){ console.log("获取成功:" + res) } else { console.log("获取失败:" + res) } }) receiveRealTimeData( (realTimeDataType, res) => { if (realTimeDataType == YCCollectDataKeyReceiveCheckInfo) { this.setData({ ecgData: JSON.stringify(res), }) } }) ``` ### 7.3 根据索引删除ECG数据 #### API ```JavaScript function deleteCollectIndexData(dataType,index, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataECG 获取ECG数据 - queryHealthDataECG ECG - index 索引 - 先使用 queryCollectDataCount 获取设备数据总数(索引) - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.deleteCollectIndexData(queryHealthDataECG, this.data.ecgCount-1 ,(state,res)=>{ // this.data.ecgCount-1 索引值 // 使用 queryCollectDataCount 获取ecgCount // state 状态 0 -> 成功 其他 -> 失败 // res 数据 if (state == succeed) { console.log("删除成功:" + res) } else { console.log("删除失败:" + res) } }) ``` ### 7.4 根据时间戳获取ECG数据(不建议) #### API ```JavaScript // (有些手环会出现莫名奇妙的问题、参数较麻烦,统一用索引比较好) function queryCollectStampDataTimeInfo(dataType,timeStamp,uploadEnable, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataECG 获取ECG数据 - queryHealthDataECG ECG - timeStamp 时间戳 - 先使用 queryCollectIndexDataInfo获取设备数据,得到时间戳 - uploadEnable 是否上报 - true 上报 - false 不上报 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // (有些手环会出现莫名奇妙的问题、参数较麻烦,统一用索引比较好) appControlAPI.queryCollectStampDataTimeInfo(queryHealthDataECG,this.data.ecgList[index].timeStamp,false,(state,res)=>{ // this.data.ecgList // 先使用 queryCollectIndexDataInfo 获取this.data.ecgList // inde 为 this.data.ecgList 的长度-1 // false 不上报 // state 状态 0 -> 成功 1 -> 失败 // res 数据 if (state == succeed){ console.log("获取成功:" + res) } else { console.log("获取失败:" + res) } }) ``` ### 7.5 根据时间戳删除ECG数据(不建议) #### API ```JavaScript // (有些手环会出现莫名奇妙的问题、参数较麻烦,统一用索引比较好) function deleteCollectTimeStampData(dataType,timeStamp, completion); ``` #### 参数 - dataType 数据类型 queryHealthDataECG 获取ECG数据 - queryHealthDataECG ECG - timeStamp 时间戳 - 先使用 queryCollectIndexDataInfo获取设备数据,得到时间戳 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript // (有些手环会出现莫名奇妙的问题、参数较麻烦,统一用索引比较好) appControlAPI.deleteCollectTimeStampData(queryHealthDataECG, this.data.ecgList[index].timeStamp ,(state,res)=>{ // this.data.ecgList // 先使用 queryCollectIndexDataInfo 获取this.data.ecgList // index 索引 // false 不上报 // state 状态 0 -> 成功 1 -> 失败 // res 数据 if (state == succeed){ console.log("删除成功:" + res) } else { console.log("删除失败:" + res) } }) ``` ### 7.6 测量ECG #### API ```JavaScript // 开启血压检测 appControlAPI.bloodPressureMeasureController( continuous, (status,res)=>{ if(status == succeed){ // 开启实时ECG上传 appControlAPI.waveDataUploadControl(waveUploadStateUploadWithOutSerialnumber, waveUploadDataTypeECG, (state, res) => { // 开启实时获取血压数据 appControlAPI.realTimeDataUplod(true, realBloodPressureUpload, (state, res) => { }) // 开启实时获取hrv数据 appControlAPI.realTimeDataUplod(true, realHrvUpload, (state, res) => { }) // 监听血压、ECG数据、PPG数据 appControlAPI.receiveRealTimeData( (realTimeDataType, res) => { if (realTimeDataType == receivedRealTimeECG) { util.printLog(JSON.stringify(res)) this.setData({ canvasText: this.data.canvasText + "\n实时ECG:" + JSON.stringify(res) }) } else if (realTimeDataType == receivedRealTimeBloodPressure){ // util.printLog(JSON.stringify(res)) this.setData({ canvasText: this.data.canvasText + "\n实时血压:" + JSON.stringify(res) }) } else if (realTimeDataType == receivedRealTimePPG) { this.setData({ canvasText: this.data.canvasText + "\n实时PPG:" + JSON.stringify(res) }) } else if (realTimeDataType == measureECGStatus){ this.setData({ canvasText: this.data.canvasText + "\n测量ECG结束:" + JSON.stringify(res) }) } else if (realTimeDataType == receivedRealTimePressure){ this.setData({ canvasText: this.data.canvasText + "\n实时压力:" + JSON.stringify(res) }) } else if (realTimeDataType == electrodeKey) { this.setData({ canvasText: this.data.canvasText + "\n佩戴状态:" + JSON.stringify(res) }) } }) // 开启PPG上传 appControlAPI.waveDataUploadControl(waveUploadStateUploadWithOutSerialnumber, waveUploadDataTypePPG, (state, res) => { if (state == succeed) { this.setData({ canvasText: this.data.canvasText + "\n开启PPG上传:success" }) } else { this.setData({ canvasText: this.data.canvasText + "\n开启PPG上传:fail" }) } alertUtil.closeToast() }) } else { this.setData({ canvasText: this.data.canvasText + "\n开启ECG上传:fail" }) } }) } }) ``` #### 参数 - continuous 开启血压监测模式 - continuous 开启血压监测模式 - stop 关闭血压测量,也就是结束ecg测量 - waveUploadStateUploadWithOutSerialnumber 固定写法,数据定义在下方常量定义栏目中 - waveUploadDataTypeECG 固定写法,数据定义在下方常量定义栏目中 - realBloodPressureUpload 固定写法,数据定义在下方常量定义栏目中 - realHrvUpload 固定写法,数据定义在下方常量定义栏目中 - waveUploadStateUploadWithOutSerialnumber 固定写法,数据定义在下方常量定义栏目中 - waveUploadDataTypePPG 固定写法,数据定义在下方常量定义栏目中 #### 使用举例 ```JavaScript // 按照上方调用顺序调用相关API,获取ecg原始数据、心率、血压、hrv // 1.开启血压监测 appControlAPI.bloodPressureMeasureController( continuous, (status,res)=>{ if (status == succeed){ console.log("开启血压监测:" + JSON.stringify(res)) // 2.开启成功,开启实时ECG数据上传 appControlAPI.waveDataUploadControl(waveUploadStateUploadWithOutSerialnumber, waveUploadDataTypeECG, (status, res) => { if (status == succeed){ console.log("开启实时ECG数据上传:" + JSON.stringify(res)) // 3.开启成功,开启实时血压数据上传 appControlAPI.realTimeDataUplod(true, realBloodPressureUpload, (state, res) => { console.log("开启实时血压数据上传:" + JSON.stringify(res)) }) // 4.开启实时HRV数据上传 appControlAPI.realTimeDataUplod(true, realHrvUpload, (state, res) => { console.log("开启实时HRV数据上传:" + JSON.stringify(res)) }) // 5.监听设备上报数据,进行处理 appControlAPI.receiveRealTimeData( (realTimeDataType, res) => { if (realTimeDataType == receivedRealTimeECG) { console.log("实时ECG:" + JSON.stringify(res)) } else if (realTimeDataType == receivedRealTimeBloodPressure){ console.log("实时血压:" + JSON.stringify(res)) } else if (realTimeDataType == receivedRealTimePPG) { console.log("实时PPG:" + JSON.stringify(res)) } else if (realTimeDataType == measureECGStatus){ console.log("测量ECG结束:" + JSON.stringify(res)) } else if (realTimeDataType == receivedRealTimePressure){ console.log("测量ECG结束:" + JSON.stringify(res)) } else if (realTimeDataType == electrodeKey) { console.log("佩戴状态:" + JSON.stringify(res)) } }) } }) } else { // 开始测量ECG失败 console.log("开始测量ECG失败" + JSON.stringify(res)) } }) ``` ### 7.7 心电数据解析 相关API在第五节 注意事项: 小程序解析实时ECG数据 调用接口对原始数据滤波处理:/api/v2/ecg/filter_ecg_data 注意传入的ID参数必须是唯一ID,否则会导致多个用户同时测量时导致数据混淆 调用接口获取心电诊断结果:/api/v2/ecg/filter_result 注意测量时间过短会导致数据量少,诊断无数据,ID参数必须与解析ECG原始数据ID一致 必须在心电测量完全结束后再调用,并且不管是否正常结束ECG测量都必须调用一次该接口 诊断结果解析 ![img](https://bcnyqlpfktbz.feishu.cn/space/api/box/stream/download/asynccode/?code=YmZhYzNjYjM1MTllNWRjMmRkYWU0NzdhNzRiZmJlMTZfOHNYNjIxajRiTVBsVjVZbFk4MERpVlZaWm56TVlpQ0lfVG9rZW46STJvWGJMNGJMbzQ4UlV4ck9wNWNnSWNtbm9nXzE3NDY1ODk2NDA6MTc0NjU5MzI0MF9WNA) ```sql aiDataBean --> 诊断结果 首先判断 qrstype = 14 --> 测量失败 + 抱歉!本次測量信號欠佳,可能是皮膚乾燥造成,請清結或者潤濕測試部位的皮膚後重新測試,測試過程中保持安靜。 判断iaf = true --> 疑似心房颤动 + QRS波形正常,正常P波消失,出现f波,R-R间距不规则。 qrstype = 5 --> 室性早搏 + QRS-T波形宽大变形,QRS波形前无相关P波,QRS时限 > 0.12秒,T波方向与主波相反,完全性代偿间歇。 qrstype = 9 --> 房性早搏 + QRS波形正常,变异P波提前出现,P-R > 0.12秒,代偿间歇不完全。 heart : 0~50 --> 疑似心动过缓 + QRS波形正常,R-R间距偏长。 heart > 120 --> 疑似心动过块 + QRS波形正常,R-R间距偏短。 hrv >= 125 --> 疑似窦性心律不齐 + QRS波形正常,R-R间距变化偏大。 其余情况为:正常心电图 + QRS波形形态时限振幅正常,P-R间期正常,ST-T无改变,Q-T间期正常。 ecgList --> 滤波数据 HealthNormBean --> 各类指数数据 症状筛查目前只有三个判断:新房颤动、房性早搏、室性早搏 1.afflag = true -- > 疑似新房颤动 2.qrsType = 9 --> 疑似室性早搏 3.qrsType = 5 --> 疑似房性早搏 if (this.data.aiDataBean.iaf) { result_total = "疑似心房颤动" result_info = "QRS波形正常,正常P波消失,出现f波,R-R间距不规则。" } else { if (this.data.aiDataBean.qrstype == 5) { result_total = "室性早搏" result_info = "QRS-T波形宽大变形,QRS波形前无相关P波,QRS时限 > 0.12秒,T波方向与主波相反,完全性代偿间歇。" } else if (this.data.aiDataBean.qrstype == 9){ result_total = "房性早搏" result_info = "QRS波形正常,变异P波提前出现,P-R > 0.12秒,代偿间歇不完全。" } else if (heart >= 0 && heart <= 50){ result_total = "疑似心动过缓" result_info = "QRS波形正常,R-R间距偏长。" } else if (heart > 120){ result_total = "疑似心动过快" result_info = "QRS波形正常,R-R间距偏短。" } else if (hrv >= 125){ result_total = "疑似窦性心律不齐" result_info = "QRS波形正常,R-R间距变化偏大。" } else if (this.data.aiDataBean.qrstype == 1){ result_total = "正常心电图" result_info = "QRS波形形态时限振幅正常,P-R间期正常,ST-T无改变,Q-T间期正常。" } } ``` ## 8.助眠按摩 ### 8.1 获取设备ID #### API ```JavaScript function queryDeviceId(dataType, cmd, completion) ``` #### 参数 - dataType 数据类型 queryDeviceIdKey 获取设备电量信息的key - queryDeviceIdKey Key - cmd 操作指令 peripheralParamCmd1 获取设备电量信息的 cmd - peripheralParamCmd1 cmd 指令1 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryDeviceId(queryDeviceIdKey, peripheralParamCmd1, (state, res) => { // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: res.info = { count: count, key: key, deviceModel: deviceModel, // 设备支持功能数 deviceId1: deviceId1, // 设备ID1 -->助眠 deviceId2: deviceId2, // 设备ID2 -->按摩 } }) ``` ### 8.2 获取设备电量信息 #### API ```JavaScript function queryElectricityInformation(dataType, cmd, completion) ``` #### 参数 - dataType 数据类型 queryElectricityInformationKey 获取设备电量信息的key - queryElectricityInformationKey Key - cmd 操作指令 peripheralParamCmd1 获取设备电量信息的 cmd - peripheralParamCmd1 cmd 指令1 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryElectricityInformation(queryElectricityInformationKey, peripheralParamCmd1, (state, res) => { // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: res.info = { count: count, key: key, lowPowerShutdown: lowPowerShutdown, // 低电关机 lowPowerWarning: lowPowerWarning, // 低电警告 lowPowerReminder: lowPowerReminder, // 低电提醒 prohibitStart: prohibitStart, // 禁止启动 prohibitWork: prohibitWork, // 禁止工作 currentBatteryLevel: currentBatteryLevel // 当前电量 } }) ``` ### 8.3 获取设备状态信息 #### API ```JavaScript function queryDeviceStatus(dataType, cmd, deviceId, completion) ``` #### 参数 - dataType 数据类型 queryDeviceStatusKey 获取设备电量信息的key - queryDeviceStatusKey Key - cmd 操作指令 peripheralParamCmd2获取设备电量信息的 cmd - peripheralParamCmd2 cmd 指令2 - deviceId 设备ID - deviceId1 设备ID1 --> 助眠 - deviceId2 设备ID2 --> 按摩 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryDeviceStatus(queryDeviceStatusKey, peripheralParamCmd2, deviceId1, (state, res) => { // deviceId1 --> 助眠 deviceId2 --> 按摩 // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: res.info = { count: count, key: key, deviceId: deviceId, // 设备ID status: status, // 设备状态(0:-->关闭 1-->启动 2-->暂停 3-->继续) mode: mode, // 当前模式(1~n) strength: strength, // 当前强度(1~n) runTime: runTime, // 已经运行时间 runTimeTotal: runTimeTotal // 总运行时间 } }) ``` ### 8.4 获取设备支持档位数 #### API ```JavaScript function queryDeviceGearPosition(dataType, cmd, deviceId, completion) ``` #### 参数 - dataType 数据类型 queryDeviceGearPositionKey 获取设备电量信息的key - queryDeviceGearPositionKey Key - cmd 操作指令 peripheralParamCmd1 获取设备电量信息的 cmd - peripheralParamCmd1 cmd 指令1 - deviceId 设备ID - deviceId1 设备ID1 --> 助眠 - deviceId2 设备ID2 --> 按摩 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.queryDeviceGearPosition(queryDeviceGearPositionKey, peripheralParamCmd1, deviceId1, (state, res) => { // deviceId1 --> 助眠 deviceId2 --> 按摩 // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: res.info = { count: count, key: key, deviceId: deviceId, // 设备ID modeGear: modeGear, // 模式档位 IntensityLevel: IntensityLevel, // 强度档位 } }) ``` ### 8.5 设置设备运行模式 #### API ```JavaScript function setDeviceOperatingMode(dataType, cmd, deviceId, mode, strength, time, completion) ``` #### 参数 - dataType 数据类型 setDeviceOperatingModeKey 获取设备电量信息的key - setDeviceOperatingModeKey Key - cmd 操作指令 peripheralParamCmd1 获取设备电量信息的 cmd - peripheralParamCmd1 cmd 指令1 - deviceId 设备ID - deviceId1 设备ID1 --> 助眠 - deviceId2 设备ID2 --> 按摩 - mode 设置设备的模式,需要先使用 queryDeviceGearPosition 查看支持的模式以及档位数 - 3 (1~n)取决于获取设备支持的模式数,这里是第三种模式 - strength - 12 (1~n)取决于获取设备支持的档位数,这里是12档 - time 运行时间,单位为秒,设置运行时间必须大于等于两分钟(120 s) - 200 设置运行时间 200 s - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.setDeviceOperatingMode(setDeviceOperatingModeKey, peripheralParamCmd1, deviceId1, 3, 12, 200, (state,res) => { // 注意:设置运行模式后需要调用启动(peripheraModeControl)api,才能正常切换 // 指令解析: 设置运行模式为:助眠第三种模式,强度设置为12档,运行时间为200s // deviceId1 --> 助眠 deviceId2 --> 按摩 // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: 成功:success 失败:异常信息 }) ``` ### 8.6 设备控制(启动、关闭、暂停、继续) #### API ```JavaScript function deviceControl(dataType, cmd, deviceId, action, completion) ``` #### 参数 - dataType 数据类型 deviceControlKey 获取设备电量信息的key - deviceControlKey Key - cmd 操作指令 peripheralParamCmd1 获取设备电量信息的 cmd - peripheralParamCmd1 cmd 指令1 - deviceId 设备ID - deviceId1 设备ID1 --> 助眠 - deviceId2 设备ID2 --> 按摩 - action 设备的控制指令(启动、关闭、暂停、继续) - 0x00 关闭 - 0x01 启动 - 0x02 暂停 - 0x03 继续 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.deviceControl(deviceControlKey, peripheralParamCmd1, deviceId1, action, (state,res) => { // deviceId1 --> 助眠 deviceId2 --> 按摩 // action 设备指令: 0x00-->关闭 0x01-->开启 0x02-->暂停 0x03-->继续 // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: 成功:success 失败:异常信息 }) ``` ### 8.7 设备控制(关机、重启) #### API ```JavaScript function peripheraModeControl(dataType, cmd, param, completion) ``` #### 参数 - dataType 数据类型 peripheraModeControlKey 获取设备电量信息的key - peripheraModeControlKey Key - cmd 操作指令 peripheralParamCmd2 获取设备电量信息的 cmd - peripheralParamCmd2 cmd 指令2 - param 设备控制指令(关机、重启) - 0x03 关机 - 0x04 重启 - completion - 这是一个回调函数,包含状态码及其它信息, 没有则为空。 #### 使用举例 ```JavaScript appControlAPI.peripheraModeControl(peripheraModeControlKey, peripheralParamCmd2, param, (state, res) => { // param 设备控制指令 0x03-->关机 0x04-->重启 // state 状态: 0 --> 成功 1 --> 失败 // res 返回信息: 成功:success 失败:异常信息 }) ``` # 三、常量定义 ```JavaScript // MARK: - 常量 /// 时间前缀 const secondForThirtyYear = 946684800 /// 当地GMT时间(秒) const secondFromGMT = (new Date()).getTimezoneOffset() * 60 /// 深睡标志 const deepSleepFlag = 0xF1 /// 浅睡标志 const lightSleepFlag = 0xF2 /// 眼动标志 const remSleepFlag = 0xF3 /// 清醒标志 const awakeSleepFlag = 0xF4 // MARK: - 错误分类 // 成功 const succeed = 0 // 失败 const failed = 1 // 超时 const timeout = 2 // 不可用 const unavailable = 3 // 数据错误 const dataError = 4 // crc错误 const crcError = 5 // 没有记录 const noRecord = 6 // 类型不支持 const typeNotSupport = 7 // 参数错误 const parameterError = 8 // 闹钟不存在 const alarmNotExist = 9 // 闹钟已存在 const alarmAlreadyExist = 10 // 闹钟数量达到限制 const alarmCountLimit = 11 // MARK: - 重复星期 const repeatMonday = 1 << 0 const repeatTuesday = 1 << 1 const repeatWednesday = 1 << 2 const repeatThursday = 1 << 3 const repeatFriday = 1 << 4 const repeatSaturday = 1 << 5 const repeatSunday = 1 << 6 const repeatEnable = 1 << 7 // MARK: - 设置分组 const YCSettingCommandID = 0x01 // MARK: - 查询分组 const YCQueryCommandID = 0x02 const setTime = 0x00 const setAlarmClock = 0x01 const setGoal = 0x02 const setUserInfo = 0x03 const setUnit = 0x04 const setSedentaryReminder = 0x05 const setAntiLost = 0x06 const setWearingPosition = 0x08 const setHeartRateAlarm = 0x0B const setHeartRateMonitoringMode = 0x0C const setFindPhone = 0x0D const setReset = 0x0E const setDoNotDisturb = 0x0F const setLanguage = 0x12 const setWristBrightScreen = 0x13 const setDisplayBrightness = 0x14 const setSkinColor = 0x15 const setTheme = 0x19 const setTemperatureAlarm = 0x1F const setTemperatureMonitoringMode = 0x20 // MARK: - 查询分组 const queryBasicInfo = 0x00 const querySupportFunction = 0x01 const queryMacAddress = 0x02 const queryModel = 0x03 const queryTheme = 0x09 const queryElectrodeLocation = 0x0A const queryMCU = 0x1b const queryRealTimeTemperature = 0x0e // MARK: - App控制分组 const YCAppControlCommandID = 0x03 const appControlFindDevice = 0x00 const appControlBloodPressureCalibration = 0x03 const appControlRealTimeDataUpload = 0x09 const appControlWaveUploadControl = 0x0B const appControlSportControl = 0x0C const appControlSystemOperator = 0x16 const appControlTodayWeather = 0x12 const appControlTomorrowWeather = 0x13 const appControlBloodGlucoseCalibration = 0x31 const appControlUricAcidCalibration = 0x37 const appControlBloodFatCalibration = 0x38 // MARK: - 同步设备健康数据的分组 const YCHealthDataCommandID = 0x05 const queryHealthDataStep = 0x02 const queryHealthDataSleep = 0x04 const queryHealthDataHeartRate = 0x06 const queryHealthDataBloodPressure = 0x08 const queryHealthDataCombinedData = 0x09 const queryHealthDataInvasiveMeasurement = 0x2F const queryHealthDataHistoryBody = 0x33 const replyHealthDataStep = 0x11 const replyHealthDataSleep = 0x13 const replyHealthDataHeartRate = 0x15 const replyHealthDataBloodPressure = 0x17 const replyHealthDataCombinedData = 0x18 const replyHealthDataInvasiveMeasurement = 0x30 const deleteHealthDataStep = 0x40 const deleteHealthDataSleep = 0x41 const deleteHealthDataHeartRate = 0x42 const deleteHealthDataBloodPressure = 0x43 const deleteHealthDataCombinedData = 0x44 const deleteHealthDataInvasiveMeasurement = 0x4C const healthDataBblockConfirm = 0x80 // MARK: - 设备控制分组 const YCDeviceControlCommandID = 0x04 // 手环返回 APP 启动单次测量结果 const measureStatus = 0x0E const measureECGStatus = 0x0B // MARK: - 实时上传 const YCRealTimeDataCommandID = 0x06 const realStepDataUpload = 0x00 const realHeartRateDataUpload = 0x01 const realBloodOxygenUpload = 0x02 const realBloodPressureUpload = 0x03 const realHrvUpload = 0x04 // MARK: - 闹钟类型 const alarmTypeWakeUp = 0 const alarmTypeSleep = 1 const alarmTypeExercise = 2 const alarmTypeMedicine = 3 const alarmTypeAppointment = 4 const alarmTypeParty = 5 const alarmTypeMeeting = 6 const alarmTypeCustom = 7 // MARK: - 实时数据上传类型 // 步数 const realTimeDataTypeStep = 0 // 心率 const realTimeDataTypeHeartRate = 1 // 血氧 (保留) const realTimeDataTypeBloodOxygen = 2 // 血压 const realTimeDataTypeBloodPressure = 3 // hrv (保留) const realTimeDataTypeHrv = 4 const startHrv = 0x03 // 呼吸率 (保留) const realTimeDataTypeRespirationRate = 5 // 运动模式数据 (保留) const realTimeDataTypeseSportMode = 6 // 运动组合数据 (保留) const realTimeDataTypeCombinedData = 7 // ECG const queryHealthDataECG = 0x00 // MARK: - 接收实时数据类型 const receivedRealTimeStep = 0x0 const receivedRealTimeHeartRate = 0x01 const receivedRealTimeBloodOxygen = 0x02 const receivedRealTimeBloodPressure = 0x03 const receivedRealTimePPG = 0x04 const receivedRealTimeECG = 0x05 const receivedRealTimeHrv = 0x06 const receivedRealTimePressure = 0x10 const receivedRealTimeMonitoringMode = 0x0D // 接收监测数据(包含运动数据) // MARK: - 天气类型 const weatherTypeUnknow = 0 const weatherTypeSunny = 1 const weatherTypeCloudy = 2 const weatherTypeWind = 3 const weatherTypeRain = 4 const weatherTypeSnow = 5 const weatherTypeFoggy = 6 // MARK: - 血糖校准模式 const bloodGlucoseCalibrationModeBeforeMeal = 0 // 餐前 const bloodGlucoseCalibrationModeAfterMeal = 1 // 餐后 // MARK: - 波形上传控制 const waveUploadStateOff = 0 // 关闭 const waveUploadStateUploadWithOutSerialnumber = 1 // 开始上传且上传包不带序号 const waveUploadStateUploadSerialnumber = 2 // 开始上传且上传包带8位序号 const waveUploadDataTypePPG = 0 // 光电波形 const waveUploadDataTypeECG = 1 // 心电波形 const waveUploadDataTypeMultiAxisSensor = 2 // 多轴传感器波形 const waveUploadDataTypeAmbientLight = 3 // 环境光 //采集指令 const YCCollectDataTypeDataCommandID = 0x07 const YCCollectDataKeyQuery = 0 const YCCollectDataKeyRetrieveIndex = 1 const YCCollectDataKeyRetrieveTimeStamp = 2 const YCCollectDataKeyReceiveData = 0x10 const YCCollectDataKeyReceiveCheckInfo = 0x20 const YCCollectDataKeyDeleteIndex = 0x30 const YCCollectDataKeyDeleteTimeStamp = 0x31 const YCCollectDataEcg = 0 const YCCollectDataPpg = 1 // 心电电极指令key const electrodeKey = 0x14 // MARK: - 饮食建议 // 指令 const YCAppDistributeHealthInfoCommandID = 0x0B const startSendHealthInfoSummary = 0x00 const sendHealthInfoDetailData = 0x01 const sendHealthInfoCheckInfo = 0x02 // 健康内容类型 const YCDistributeHealthInfoTypeHealthAdvice = 0x01 // 健康建议 const YCDistributeHealthInfoTypeNutritiousMeals = 0x02 // 营养膳食 const YCDistributeHealthInfoTypeWorkOut = 0x03 // 运动健身 const YCDistributeHealthInfoTypeMentalSleep = 0x04 // 心理睡眠 const YCDistributeHealthInfoTypeTraditionalChineseMedicine = 0x05 // 中医养生 const YCDistributeHealthInfoTypeHealthFoodData = 0x06 // 食材数据 // 测量控制 // 控制类型 const stop = 0x00 //关闭 const start = 0x01 // 单次测量 const continuous = 0x02 // 连续测量、检测 // 功能类型 const measureHrData = 0x00 // 心率 const measureBpData = 0x01 // 血压 const measureBoData = 0x02 // 血氧 const measureBrData = 0x03 // 呼吸率 const measureTempData = 0x04 // 体温 const measureBsData = 0x05 // 血糖 const measureUaData = 0x06 // 尿酸 const measureBkData = 0x07 // 血酮 const measureEdaData = 0x08 // EDA const measureHfData = 0x09 // 血脂 const measureHrvData = 0x0A // hrv const measurePpgData = 0x0B // ppg const measurePressData = 0x0C // 压力 // 外设指令 const peripheralID = 0x0F // 外设模块通用Command ID const count = 0x00 // 上传次数 const deviceId1 = 0x01 //设备ID1 const deviceId2 = 0x02 //设备ID2 const peripheralParamP = 0x50 // 字母P十六进制 const peripheralParamE = 0x45 // 字母E十六进制 const peripheralParamR = 0x52 // 字母R十六进制 const peripheralParamCmd1 = 0x01 // 操作指令 cmd 1 const peripheralParamCmd2 = 0x02 // 操作指令 cmd 2 const queryDeviceIdKey = 0x01 // 获取设备ID Key const queryElectricityInformationKey = 0x03 // 获取电量信息 Key const queryDeviceStatusKey = 0x51 // 获取设备状态 Key const queryDeviceGearPositionKey = 0x51 // 获取设备支持档位数 Key const setDeviceOperatingModeKey = 0x50 // 设置运行模式 key const deviceControlKey = 0x04 // 设备控制 Key const peripheraModeControlKey = 0x04 // 关机、重启 Key ``` # 四、杰理表盘、OTA - 杰理官方文档https://doc.zh-jieli.com/Apps/Wechat/health/zh-cn/master/Development/health/interface_desc.html#id9 - sdk使用说明 1.请尽量保证lib文件的不被修改。 2.小程序代码上传时,不要选择上传代码时自动压缩脚本文件,会导致sdk找不到类,在"微信开发者工具"-》"详情"-》"本地设置"-》取消勾选"上传代码时自动压缩脚本文件"。 3.目前图片裁剪仅支持放大缩小偏移,暂不支持翻转,如需实现,请自己参考demo或网上参考实现。 ## 初始化整体流程 1. 导入分包模块 2. 开始杰理认证 3. 导入相关API、属性值 4. 开始OTA ### 1、配置分包 在app.json中配置分包配置 :subpackages 字段声明项目的分包结构。 ```JavaScript // 注意pages中如果要添加页面,不能添加 tabBar 页面, tabBar必须在主包内. "subPackages": [ { "root": "lib", // 分包根目录 "pages": [], // 由于全是js文件没有页面,所以为空,用户可自行决定是否需要将页面放入分包 "entry": "index.js" // js入口 } ], ``` ### 2、开始杰理认证 ```JavaScript require('../../lib/index',(mod)=>{ JlModel = mod // 设备已连接,开始认证(注意不能重复多次认证) if(app.globalData.isConnectedBluetooth){ JlModel && JlModel.startJLAuth() } }, ({ errMsg, mod }) => { console.error(`path: ${mod}, ${errMsg}`) }) ``` ### 3、导入相关API ```JavaScript // 表盘相关API var RCSPOpSystemInfo; var RCSPOpWatchDial; require('../../../lib/index',(mod)=>{ JlModel = mod // 导入管理模块 JlModel.getBtManager().then(({ systemInfo, watchDial }) => { console.log("模块导入成功", systemInfo, watchDial); RCSPOpSystemInfo = systemInfo; RCSPOpWatchDial = watchDial; }).catch(error => { console.error("模块导入失败:", error); }); }, ({ errMsg, mod }) => { console.error(`path: ${mod}, ${errMsg}`) }) // 固件相关API require('../../../lib/index',(mod)=>{ JlModel = mod JlModel.startOTA(otaConfig, { onStartOTA: () => { console.log("开始升级 ") }, onNeedReconnect: (reConnectMsg) => { console.log("升级回连 " + reConnectMsg) }, onProgress: (type, progress) => { console.log("进度 " + progress) if (type == JlModel.UpgradeType.UPGRADE_TYPE_CHECK_FILE) { console.log("读取文件...) } if (type == JlModel.UpgradeType.UPGRADE_TYPE_FIRMWARE) { console.log("升级中...) } }, onStopOTA: () => { wx.showToast({title: '升级成功'}) }, onCancelOTA: () => { wx.showToast({title: '取消升级'}) }, onError: (error, message ) => { wx.showToast({title: '升级失败:'+error}) } }) }, ({ errMsg, mod }) => { console.error(`path: ${mod}, ${errMsg}`) }) ``` ## 1、表盘相关 ### 1.1 导入表盘模块 ```JavaScript // 表盘相关API var RCSPOpSystemInfo; var RCSPOpWatchDial; require('../../../lib/index',(mod)=>{ JlModel = mod // 导入管理模块 JlModel.getBtManager().then(({ systemInfo, watchDial }) => { console.log("模块导入成功", systemInfo, watchDial); RCSPOpSystemInfo = systemInfo; RCSPOpWatchDial = watchDial; }).catch(error => { console.error("模块导入失败:", error); }); }, ({ errMsg, mod }) => { console.error(`path: ${mod}, ${errMsg}`) }) ``` ### 1.2 获取手表Flash资源文件列表 #### API ```JavaScript function getWatchResourseFileList(); ``` #### 参数 - 无 #### 使用示例 ```JavaScript // 获取手表Flash资源文件列表默认是过滤了部分系统资源文件(例如:JL,FONT,SIDEBAR)。 // 可自定义修改过滤列表覆盖原有过滤列表。 const ignoreFileList: Array = ["JL","FONT","SIDEBAR"]; RCSPOpWatchDial.setIgnoreFileList(ignoreFileList) RCSPOpWatchDial.getWatchResourseFileList().then((res) => { //资源文件列表 const watchResourceList = res //表盘文件名字过滤前缀 const watchFilt = "WATCH" //表盘背景文件名字过滤前缀 const bgpFilt = "BGP" for (let index = 0; index < watchResourceList.length; index++) { const element = watchResourceList[index]; if (element.getName()?.toUpperCase().includes(watchFilt)) { //表盘文件 } else if(element.getName()?.toUpperCase().includes(bgpFilt)) { //表盘背景文件 } } }).catch( error => { //失败 }) ``` ### 1.3 设置正在使用的表盘 #### API ```JavaScript function getUsingDial(); ``` #### 参数 - 无 #### 使用示例 ```JavaScript // 需要先进行获取手表Flash资源文件列表(目录浏览),才可以获取到对应的正在使用表盘。 RCSPOpWatchDial?.getUsingDial().then((res) => { //正在使用的表盘 const usingDial = res }).catch((error) => { //失败 console.error("当前使用表盘,失败:", error); }) ``` ### 1.4 添加手表Flash资源文件 #### API ```JavaScript function addWatchResourseFile(fileData, fileName, lastModifyTime, refreshDirectory, callback); ``` #### 参数 - fileData 文件数据:表盘资源 - fileName 表盘名称:英文或数字 - lastModifyTime 更新时间,文件更新判断依据 - refreshDirectory 添加完成后是否刷新目录 - callback 传输回调 #### 使用示例 ```Plaintext //传输回调 const transferCallback = { onError: (code) => { //传输失败,code }, onStart: () => { //开始传输 }, onProgress: (progress) => { //正在传输,进度 }, onSuccess: () => { //传输成功 }, onCancel: (_code) => { //传输取消 } } const data;//文件数据 const fileName;//文件名,英文或数字 const lastModifyTime;//更新时间,文件覆盖更新判断依据 const refreshDirectory = true;//添加完成后,是否刷新目录 RCSPOpWatchDial?.addWatchResourseFile(data, fileName, lastModifyTime, refreshDirectory, transferCallback).then((res) => { if (res instanceof OPDirectoryBrowse.File) { //传输成功且刷新目录 //传输表盘完成后,设置为当前使用的表盘 //RCSPOpWatchDial?.setUsingDial(res) } else if (res == undefined) { //传输完成后,目录浏览找不到该文件 //传输完成后找不到该文件,可能是文件名不符合标准,太长或者带中文 } else { //传输成功且不刷新目录 //res是目录浏览的相对路径 } }).catch((_error) => { //失败 }) ``` ### 1.5 下载表盘 #### API ```JavaScript wx.downloadFile(url, success, fail); ``` #### 参数 - url 表盘文件路径,后台表盘接口返回的fileName数据 - success 成功回调 - fail 失败回调 #### 使用示例 ```JavaScript // 后台表盘接口返回的fileName const url = item.fileName // 下载到本地返回本地临时路径 const downloadTask = wx.downloadFile({ url: url, success: function (res) { if (res.statusCode === 200) { // 下载成功 const localPath = res.tempFilePath // 获取文件管理器 const fs = wx.getFileSystemManager() // 获取文件信息 fs.getFileInfo({ filePath: localPath, success: (res) => { // 打开文件 let fd = fs.openSync({ filePath: localPath }) let uint8 = new Uint8Array(res.size) // 读取文件 fs.read({ fd: fd, arrayBuffer: uint8.buffer, length: res.size, success: (_res) => { // 读取文件成功,处理数据,完成后开始传输数据添加至设备 that.startTransferDialFile() } }, complete: (_res) => { // 读取文件失败 fs.close({ fd }) } }) } }) } }, fail: function (err) { // 下载失败 } }); ``` ### 1.6 切换表盘 #### API ```JavaScript function setUsingDial(file); ``` #### 参数 - file 需要切换的表盘 #### 使用示例 ```JavaScript //目标表盘 const file; RCSPOpWatchDial?.setUsingDial(file).then((res) => { //设置成功 }).catch((error) => { //失败 }) ``` ### 1.7 移除表盘 #### API ```JavaScript function deleteDial(file); ``` #### 参数 - file 需要移除的表盘 #### 使用示例 ```JavaScript //目标表盘 const file; RCSPOpWatchDial?.deleteDial(file).then(()=>{ //删除成功 }).catch((error)=>{ //失败 }) ``` ### 1.8 表盘操作事件回调 #### API ```JavaScript // 注册回调 function registerEventCallback(callback) // 注销回调 function unregisterEventCallback(callback) // 移除全部回调 function removeAllEventCallback() ``` #### 参数 - callback 回调 #### 使用示例 ```JavaScript // 表盘事件通知,如:当前使用表盘变化,手表Flash资源文件列表发生变化 const callback = { onEvent: (_event) => { switch (_event.type) { case 'NONE': break; case 'UseDialChange'://当前表盘变化 //当前使用的表盘 const usingDail = _event.UseDialChange?.dial break; case 'WatchResourseFileListChange'://手表Flash资源文件列表变化 //资源文件列表 const watchResourceList = _event.WatchResourseFileListChange?.fileList break; default: break; } } } //注册回调 RCSPOpWatchDial?.registerEventCallback(callback) //注销回调 RCSPOpWatchDial?.unregisterEventCallback(callback) //移除全部回调 RCSPOpWatchDial?.removeAllEventCallback() ``` ## 2.固件OTA ### API ```JavaScript JlModel.startOTA(otaConfig,callback) ``` ### 参数 - otaConfig ota配置信息 - callback 回调 ### 使用示例 ```JavaScript // 配置信息 const otaConfig = new JlModel.OTAConfig() otaConfig.isSupportNewRebootWay = true otaConfig.updateFileData = this.upgradeData // 固件数据 console.log("upgradeData size:" + this.upgradeData.length); JlModel.startOTA(otaConfig, { onStartOTA: () => { this.setData({ isShowProgress: true, mStatus: 0 }) // setTimeout(()=>{ // }) }, onNeedReconnect: (reConnectMsg) => { this.setData({ mValue: 0, mStatus: 2 }) }, onProgress: (type, progress) => { console.log("onProgress " + progress) this.setData({ progress: progress }) if (type == JlModel.UpgradeType.UPGRADE_TYPE_CHECK_FILE) { this.setData({ mValue: progress, mStatus: 0,modalTitle:'读取文件...' }) } if (type == JlModel.UpgradeType.UPGRADE_TYPE_FIRMWARE) { this.setData({ mValue: progress, mStatus: 1,modalTitle:'升级中...' }) } }, onStopOTA: () => { this.hideModal() this.setData({ mValue: 0, mOtaResult: 0, mStatus: 3 }) wx.showToast({title: '升级成功'}) wx.reLaunch({ url: '/pages/scan/index' }) }, onCancelOTA: () => { this.hideModal() this.setData({ mValue: 0, mOtaResult: 1, mStatus: 4 }) // wx.showToast({title: '升级'}) }, onError: (error, message ) => { this.hideModal() this.setData({ mValue: 0, mOtaResult: 1, mStatus: 4, mFailReason: message }) wx.showToast({title: '升级失败:'+error}) } }) ``` # 五、相关后台API 地址:https://apifox.com/apidoc/shared-5d65be12-1bc5-4c56-85e6-cd92b4b52c63 注意:需要登录获取 token 才能获取到表盘信息,登录需要添加小程序对应请求头、需要联系我们添加其他小程序登录权限