# 蓝牙数据流处理指南 ## 🎯 数据流处理架构 ### 数据流向 ``` 蓝牙设备 → BluetoothManager → MainActivity → DataManager → ECG图表显示 ``` ### 处理流程 1. **蓝牙数据接收**: `BluetoothManager.onCharacteristicChanged` 2. **数据传递**: `MainActivity.onDataReceived` 3. **数据解析**: `DataManager.onBleNotify` 4. **信号处理**: `DataManager.processStreamingData` 5. **图表更新**: `MainActivity.onProcessedDataAvailable` ## 🔧 已完成的修改 ### 1. BluetoothManager ✅ - **Nordic UART Service (NUS)** 协议支持 - **自动UUID匹配**: `6e400001-b5a3-f393-e0a9-68716563686f` - **数据接收**: `onCharacteristicChanged` 回调 - **状态管理**: 连接状态、错误处理 ### 2. MainActivity ✅ - **蓝牙回调实现**: `BluetoothManager.BluetoothCallback` - **数据接收处理**: `onDataReceived` 方法 - **实时数据回调**: `DataManager.RealTimeDataCallback` - **图表更新**: `onProcessedDataAvailable` 方法 ### 3. DataManager ✅ - **蓝牙数据处理**: `onBleNotify` 方法 - **流式数据处理**: `processStreamingData` 方法 - **信号处理**: 高通滤波 → 低通滤波 → 陷波滤波 - **实时回调**: `onProcessedDataAvailable` 回调 ### 4. ECG图表 ✅ - **实时更新**: `ECGRhythmView` 和 `ECGWaveformView` - **数据缓冲**: 性能优化的数据缓冲机制 - **双视图显示**: 10秒节奏视图 + 2.5秒波形视图 ## 📱 测试步骤 ### 第一步:连接蓝牙设备 1. **点击"连接蓝牙"按钮** 2. **等待扫描完成** 3. **选择你的ECG设备** 4. **等待连接成功** ### 第二步:验证数据接收 1. **观察状态信息**: ``` 蓝牙状态: 设备已连接 蓝牙状态: 服务发现成功 蓝牙状态: 发现服务: 6e400001-b5a3-f393-e0a9-68716563686f 蓝牙状态: 发现特征: 6e400002-b5a3-f393-e0a9-68716563686f 蓝牙状态: 数据通道已建立,开始接收数据 ``` 2. **检查数据接收**: ``` 接收到蓝牙数据: X 字节 解析出 X 个数据包 ``` ### 第三步:验证图表显示 1. **ECG图表变为可见** 2. **实时波形开始显示** 3. **双视图同步更新**: - **节奏视图**: 10秒显示窗口 - **波形视图**: 2.5秒显示窗口 ### 第四步:验证信号处理 1. **观察处理进度**: ``` === 实时流式处理 === 处理进度: XX% 总样本数: XXX 已处理样本: XXX 实时曲线图已更新 ✓ ``` 2. **检查滤波效果**: - 信号应该更加平滑 - 噪声应该被有效抑制 - 波形应该清晰可见 ## 🔍 关键代码位置 ### 1. 蓝牙数据接收 ```kotlin // BluetoothManager.kt - 第468行 override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) { val data = characteristic.value callback?.onDataReceived(data) } ``` ### 2. 数据传递处理 ```kotlin // MainActivity.kt - 第656行 override fun onDataReceived(data: ByteArray) { Thread { dataManager.onBleNotify(data) runOnUiThread { binding.ecgChartContainer.visibility = View.VISIBLE } }.start() } ``` ### 3. 数据解析处理 ```kotlin // DataManager.kt - 第73行 fun onBleNotify(chunk: ByteArray) { ensureParser() nativeCallback.streamParserAppend(parserHandle, chunk) val packets = nativeCallback.streamParserDrainPackets(parserHandle) processStreamingData(packets) } ``` ### 4. 图表更新 ```kotlin // MainActivity.kt - 第558行 override fun onProcessedDataAvailable(channelIndex: Int, processedData: List) { binding.ecgRhythmView.updateData(processedData) binding.ecgWaveformView.updateData(processedData) } ``` ## 🎉 预期效果 ### 连接成功时: - ✅ 蓝牙设备连接成功 - ✅ 数据通道建立 - ✅ 开始接收ECG数据 ### 数据处理时: - ✅ 实时数据解析 - ✅ 信号滤波处理 - ✅ 通道映射完成 ### 图表显示时: - ✅ ECG图表可见 - ✅ 实时波形显示 - ✅ 双视图同步更新 - ✅ 平滑的动画效果 ### 性能优化: - ✅ 后台数据处理 - ✅ UI线程不阻塞 - ✅ 数据缓冲机制 - ✅ 实时回调更新 ## ⚠️ 注意事项 ### 1. 数据格式 - **Nordic UART Service**: 原始字节流 - **数据解析**: 自动协议解析 - **通道映射**: 8通道 → 12通道 ### 2. 性能考虑 - **后台处理**: 避免UI阻塞 - **数据缓冲**: 优化内存使用 - **更新频率**: 平衡实时性和性能 ### 3. 错误处理 - **连接失败**: 自动重试机制 - **数据异常**: 错误日志记录 - **UI异常**: 异常捕获处理 现在你的应用已经完全支持蓝牙数据流处理,可以实时接收、处理和显示ECG数据了!🚀