IOS-nRF-Toolbox CGM深度解析:连续血糖监测会话控制与实时图表的完整实现原理
IOS-nRF-Toolbox CGM深度解析连续血糖监测会话控制与实时图表的完整实现原理【免费下载链接】IOS-nRF-ToolboxThe nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location.项目地址: https://gitcode.com/gh_mirrors/io/IOS-nRF-ToolboxIOS-nRF-ToolboxnRF Toolbox是 Nordic Semiconductor 出品的蓝牙低功耗BLE容器应用其中内置的 CGMContinuous Glucose Monitor连续血糖监测Profile 是最值得学习的部分它通过 BLE 特征值控制血糖监测会话的启动与停止并将设备上报的实时血糖数据解析后绘制成动态曲线图。本文将带你完整理解 CGM 会话控制与实时图表的实现原理。![nRF Toolbox连续血糖监测应用](https://raw.gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox/raw/4d071a82fd39241cc8a376058c8033fd1ff54597/nRF Toolbox/Images.xcassets/itunes_2.imageset/itunes_2.png?utm_sourcegitcode_repo_files)一、CGM 功能架构一张图看懂数据流先建立一个整体认知。CGM 功能的核心代码集中在nRF Toolbox/Profiles/ContinuousGlucoseMonitor/目录下其数据流可以概括为三步发现与建连扫描到支持 CGM 服务UUID0x2AA8的设备后自动发现服务中的全部特征值会话控制向特定操作控制点Specific Operations Control Point写入操作码启动或停止一次监测会话实时渲染每当测量特征值Measurement的值更新App 解析出血糖浓度与时间刷新最新值标签并追加到曲线图。主控制器ContinuousGlucoseMonitor继承自通用模板PeripheralTableViewController页面由四个 Section 组成在nRF Toolbox/Profiles/ContinuousGlucoseMonitor/ContinuousGlucoseMonitor.swift中注册Section作用对应文件LastGlucoseValue显示最新一次血糖值Sections/LastDataSection.swiftLinearChartSection实时血糖曲线图 All Records 入口Sections/ContinuousGlucoseChartData.swiftTimeSliderSection调节上报时间间隔1~10 分钟Sections/TimeIntervalSection.swiftStartStopSection启动/停止监测会话Sections/StartStopSection.swift二、会话控制原理一次写入开启监测BLE 中的 CGM 服务由多个标准化特征值构成代码在ContinuousGlucoseMonitor.swift的 CBUUID 扩展中集中定义特征值UUID用途Feature0x2AA8服务声明Measurement0x2AA7血糖测量值可通知Session Run Time0x2AAB会话运行时长Session Start Time0x2AAA会话开始时间Specific Operations Control Point0x2AAC会话控制入口可写Status0x2AA9传感器状态会话控制的关键就在控制点特征值上。App 定义了完整的操作码枚举CGMSpecificOperations.swift中的CGMOpCode其中与界面直接相关的是startSession 26启动会话stopStopSession 27停止会话setCommunicationInterval 1设置上报时间间隔界面底部的Start / Stop Session按钮由StartStopSection实现它本质是一个状态开关未启动时显示绿色的 Start Session启动后变为红色的 Stop Session。点击后只是往控制点写入对应操作码并调用reset()清空图表——这是一次写入开启监测的最小化实现。一个细节值得注意didDiscover中发现控制点特征值时会立即写入 startSession 操作码也就是说用户刚连上设备、会话就自动开始了无需手动点击。同时发现Session Start Time特征值时会持续缓存其最新值作为后续所有测量数据的时间基准。三、时间间隔设置一个 Stepper 控制上报频率TimeIntervalSection是一个 1~10 分钟的步进器Stepper。当用户拖动步进器时代码构造了一个 2 字节的控制数据第一个字节是setCommunicationInterval操作码第二个字节是间隔分钟数然后写入控制点特征值。这样设备端的上报节奏就由 App 端完全掌控——间隔越小曲线越细腻间隔越大越省电。这体现了 BLE 健康类传感器按频率换功耗的典型设计思路。四、实时图表实现从字节到曲线的完整链路4.1 解析测量数据每当测量特征值触发值更新事件didUpdateValue回调会执行解析核心逻辑在Models/ContinuousGlucoseMonitorMeasurement.swift中从偏移 2 处读取一个S-Float有符号浮点数作为血糖浓度从偏移 4 处读取UInt16 时间偏移单位分钟用会话开始时间 时间偏移还原出这次测量的真实时间戳。这里有个巧妙的协议设计设备上报的不是绝对时间而是相对会话开始的分钟数。App 只需缓存会话开始时间来自Session Start Time特征值由Models/SessionStartTime.swift解析就能把每个数据点落到正确的时间轴上。4.2 数据驱动图表刷新图表部分采用Section 即数据源的模式。ContinuousGlucoseChartData继承自模板层的ChartDataSection位于nRF Toolbox/Profiles/Template/Sections/ChartDataSection.swift其机制非常简洁每收到一个数据点update(with:)就把它追加到内部数组itemstransform方法将数据点转换为坐标X 轴是距 1970 年的时间戳Y 轴是血糖浓度每次刷新时LinearChartTableViewCell图表单元格拿到全部坐标点重新绘制曲线并设置maxVisibleXRange 300即默认只展示最近 5 分钟的范围。整个过程没有复杂的图表状态管理——数组追加 全量重绘配合tableView.reloadData()就完成了实时曲线的动态更新。对于数据量不大的健康类场景这种简单直接的策略比增量更新更可靠。4.3 All Records历史数据一览点击图表下方的All Records行会推入GlucoseValueList页面Sections/GlucoseValueList/GlucoseValueList.swift把本次会话的全部数据点按日期 浓度mmol/L保留两位小数列表展示。它直接复用图表 Section 中缓存的items数组零额外成本实现了历史回看功能。五、关键文件速查表想深入源码时可以直接按这张表定位功能模块文件路径CGM 主控制器会话控制入口nRF Toolbox/Profiles/ContinuousGlucoseMonitor/ContinuousGlucoseMonitor.swiftCGM 操作码定义nRF Toolbox/Profiles/ContinuousGlucoseMonitor/CGMSpecificOperations.swift测量数据模型S-Float 解析nRF Toolbox/Profiles/ContinuousGlucoseMonitor/Models/ContinuousGlucoseMonitorMeasurement.swift会话开始时间解析nRF Toolbox/Profiles/ContinuousGlucoseMonitor/Models/SessionStartTime.swift图表数据 SectionnRF Toolbox/Profiles/ContinuousGlucoseMonitor/Sections/ContinuousGlucoseChartData.swift启停会话按钮nRF Toolbox/Profiles/ContinuousGlucoseMonitor/Sections/StartStopSection.swift时间间隔步进器nRF Toolbox/Profiles/ContinuousGlucoseMonitor/Sections/TimeIntervalSection.swift历史数据列表nRF Toolbox/Profiles/ContinuousGlucoseMonitor/Sections/GlucoseValueList/GlucoseValueList.swift图表单元格DGCharts 封装nRF Toolbox/Profiles/HeartRateMonitor/Sections/Cells/LinearChartTableViewCell.swift 补充同目录还有记录存取点Record Access Point0x2A52相关的RecordAccess.swift与GlucoseReading.swift用于实现 BGM/CGM 设备存储记录的读取与删除属于进阶协议功能。六、总结nRF Toolbox 的 CGM 实现给了新手三个非常实用的参考会话控制极简一次写入操作码即可启动/停止监测无需复杂的状态机时间基准解耦设备只报相对分钟数App 缓存会话开始时间还原时间戳协议轻量且不易出错图表零状态管理数据数组追加 全量重绘配合表格视图刷新几行代码就得到平滑的实时曲线。如果你正在开发自己的 BLE 健康类应用这套控制点写操作码 特征值通知 数组驱动图表的组合拳几乎可以直接照搬。【免费下载链接】IOS-nRF-ToolboxThe nRF Toolbox is a container app that stores your Nordic Semiconductor apps for Bluetooth Low Energy in one location.项目地址: https://gitcode.com/gh_mirrors/io/IOS-nRF-Toolbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考