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