# doc **Repository Path**: jimonik/doc ## Basic Information - **Project Name**: doc - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-04 - **Last Updated**: 2025-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 蓝牙通信协议与原始数据帧说明 ## 传输通道 - 服务 UUID:`FFF0`(主服务),写特征:`FFF6`,通知特征:`FFF7`(lib/constant.dart:9–12) - 广播识别:使用 Manufacturer Specific Data 过滤器(制造商ID `4660`)解析前 6 字节为设备地址,格式为 `AA:BB:CC:DD:EE:FF`(lib/constant.dart:12–18,lib/app/utils/ble_util.dart:53–73) - 写/读:写命令到 `FFF6`,通过订阅 `FFF7` 接收通知回包(lib/app/controllers/smart_device_controller.dart:150–168) ## 指令包格式(下行) - 总长:固定 16 字节(lib/app/controllers/ring_smart_device_controller.dart:106–163) - 结构: - `byte[0]`:命令(`RingCommandEnum.value`) - `byte[1..14]`:载荷 `payload`,可包含可选日期域与填充零 - `byte[15]`:CRC(前 15 字节求和后与 `0xFF` 按位与,lib/app/controllers/ring_smart_device_controller.dart:155–161) - 可选日期域:若传入 `date`,在载荷区追加 2 字节保留 + 6 字节时间(年、月、日、时、分、秒),时间字节由 `getTimeValue` 生成(lib/app/controllers/ring_smart_device_controller.dart:134–151,165–176) - BCD 时间设置:`setTime` 载荷使用 BCD 编码(lib/app/controllers/ring_smart_device_controller.dart:212–227,lib/app/utils/ble_util.dart:9–15) ## 命令集(RingCommandEnum) - 设备信息: - `getName=0x3E`,`setName=0x3D`,`getVersion=0x27`(lib/app/models/enum/ring_command_enum.dart:2–4,27–31) - `getBatteryLevel=0x13`(lib/app/models/enum/ring_command_enum.dart:4) - 时间与用户: - `setTime=0x01`,`getTime=0x41`(lib/app/models/enum/ring_command_enum.dart:5–6) - `setUserInfo=0x02`,`getUserInfo=0x42`(lib/app/models/enum/ring_command_enum.dart:7–8) - 数据同步: - `getTemperature=0x62`,`getHeartRate=0x55`,`getHrv=0x56`,`getSpo=0x66`,`getStep=0x52`,`getSleep=0x53`(lib/app/models/enum/ring_command_enum.dart:12–17) - 主动测量与血糖: - `measure=0x28`,`watchMeasure=0x09`(心率/血氧会话,lib/app/models/enum/ring_command_enum.dart:24–26) - `measuringBloodSugar=0x78`,`watchBloodSugar=0x3A`(血糖 PPG,lib/app/models/enum/ring_command_enum.dart:20–22) - 设备控制:`reset=0x12`,`ota=0x47`(lib/app/models/enum/ring_command_enum.dart:9,31) ### 详细读取控制(DetailedCommandEnum) - `latest=0`(读最近)、`fixed=1`(从指定时间起)、`continues=2`(继续)、`remove=99`(删除)(lib/app/models/enum/detailed_command_enum.dart:1–12) - 同步流程:首次使用 `fixed` + 日期,回包累计 50 帧后自动下发 `continues`(lib/app/controllers/ring_smart_device_controller.dart:1199–1221) ### 主动测量类型/状态 - 测量类型:心率 `0x02`,血氧 `0x03`(lib/app/models/enum/ring_measure_type_enum.dart:1–6) - 会话状态:`on=0x01`,`off=0x00`(lib/app/models/enum/ring_measure_status_enum.dart:1–4) ## 响应帧结构(上行原始字节) - 子帧长度:按数据类型固定为 `10/11/15/25/34/130/132` 字节(lib/app/controllers/ring_smart_device_controller.dart:1183,1249–1266) - 时间字段:子帧的 `byte[3..8]` 为 BCD 时间(`YY,MM,DD,hh,mm,ss`),解析函数 `defaultRingFormatDate`(lib/app/utils/ble_util.dart:37–39) - 结束判定:内容长度为 0、最后字节为 `0xFF`、或倒数第二字节等于 `getSleep` 值(lib/app/controllers/ring_smart_device_controller.dart:1238–1241) ### 心率同步帧(10B) - 布局:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,HR]` - 字段:`HR=byte[9]`(lib/app/controllers/ring_smart_device_controller.dart:313) ### 血氧同步帧(10B) - 布局:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,SpO2]` - 字段:`SpO2=byte[9]`(lib/app/controllers/ring_smart_device_controller.dart:453) ### 体温同步帧(11B) - 布局:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,T_low,T_high]` - 字段:`Temperature=([9]+[10]*256)*0.1`(lib/app/controllers/ring_smart_device_controller.dart:636–639) ### HRV 同步帧(15B) - 布局:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,HRV,VA,HR,Stress,Systolic,Diastolic]` - 字段:`HRV=[9]`,`VascularAging=[10]`,`HeartRate=[11]`,`Stress=[12]`,`Systolic=[13]`,`Diastolic=[14]`(lib/app/controllers/ring_smart_device_controller.dart:577–582) ### 步数与运动同步帧(25B) - 布局:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,StepL,StepH,CalL,CalH,DistL,DistH,S0..S9]` - 字段: - `TotalSteps=[9]+[10]*256` - `Calories=([11]+[12]*256)/100` - `Distance=([13]+[14]*256)/100` - `PerMinuteSteps=[15..24]`(10 项) - 引用:lib/app/controllers/ring_smart_device_controller.dart:523–532 ### 睡眠同步帧(34B/130/132B) - 常规 34B:`[H0,H1,H2,YY,MM,DD,hh,mm,ss,Len,Q0..Q{Len-1},...]` - 整包 130/132B:直接解析,单位长度设为 `1`,否则为 `5`(lib/app/controllers/ring_smart_device_controller.dart:671–686,1243–1251) ### 主动测量会话帧(心率/血氧,25B) - 字段(小端 4 字节合成,除单字节项): - `Step=[1..4]` - `Calories=[5..8]/100` - `Distance=[9..12]`(两位小数处理后 `/100`) - `ExerciseMinutes=[13..16]/60` - `ExerciseTime=[17..20]` - `HeartRate=[21]` - `Temperature=([22]+[23])*0.1` - `SpO2=[24]` - 引用:lib/app/controllers/ring_smart_device_controller.dart:880–941 ### 血糖 PPG 原始帧(153B) - 布局:`[H0,H1,H2, B0,B1,B2, B3,B4,B5, ...]` - 载荷:从 `byte[3]` 起,每 3 字节一组,组合为 24 位整数(大端:`b0<<16 | b1<<8 | b2`)(lib/app/controllers/ring_smart_device_controller.dart:775–789) - 时间戳:应用侧生成,不在帧内(lib/app/controllers/ring_smart_device_controller.dart:789) ## 同步流程 - 首次读取:`fixed(1)` + 参考时间(作为 16 字节包中的日期域),设备返回该时间之后的数据(lib/app/controllers/ring_smart_device_controller.dart:1199–1221) - 连续读取:每累计 50 帧自动发 `continues(2)` 取下一段(lib/app/controllers/ring_smart_device_controller.dart:1215–1218) - 结束:遇结束标志或无数据停止(lib/app/controllers/ring_smart_device_controller.dart:1238–1241) ## 通用解析规则 - BCD 时间解析:`[3..8]` → 年以当前世纪为基底拼接两位年(lib/app/utils/ble_util.dart:17–35,37–39) - 多字节小端合成:`val = Σ (byte[i] & 0xFF) * 256^i`(工具函数 `getUnsignedValue`,lib/app/controllers/ring_smart_device_controller.dart:611–613) - 距离/卡路里缩放:原始整数 `/100` 后存储为小数(lib/app/controllers/ring_smart_device_controller.dart:525–538) - 温度缩放:两字节合成后 `*0.1`(lib/app/controllers/ring_smart_device_controller.dart:636–639) ## 上传数据包格式(统一包装) - 单条上传包:`{ data: json(p), type: type.value, timestamp: p.ts, device_id }` - 批量上传:每次 50 条,带重试与日志(lib/app/controllers/ring_smart_device_controller.dart:416–434,1369–1426,1428–1450) ## 设备基础信息回包示例 - 名称:ASCII 字节位于 `data[1..14]`,过滤零与非 ASCII(lib/app/controllers/ring_smart_device_controller.dart:183–188) - 版本:`data[1..4]` 每字节转十六进制并以 `.` 连接(lib/app/controllers/ring_smart_device_controller.dart:191–198) - 电量:`data[1]`(百分比,lib/app/controllers/ring_smart_device_controller.dart:247–258) - 时间:`data[1..6]` BCD → `DateTime`(lib/app/controllers/ring_smart_device_controller.dart:229–244, lib/app/utils/ble_util.dart:17–35) --- > 以上协议与帧结构均依据当前代码实现推导与验证,具体设备固件可能存在扩展或差异。如需补充示例帧(十六进制)或画出位图表格,请告知。