SDK_APP/BLUETOOTH_DATA_FLOW_GUIDE.md

174 lines
4.6 KiB
Markdown
Raw Normal View History

2025-09-02 18:30:21 +08:00
# 蓝牙数据流处理指南
## 🎯 数据流处理架构
### 数据流向
```
蓝牙设备 → 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<Float>) {
binding.ecgRhythmView.updateData(processedData)
binding.ecgWaveformView.updateData(processedData)
}
```
## 🎉 预期效果
### 连接成功时:
- ✅ 蓝牙设备连接成功
- ✅ 数据通道建立
- ✅ 开始接收ECG数据
### 数据处理时:
- ✅ 实时数据解析
- ✅ 信号滤波处理
- ✅ 通道映射完成
### 图表显示时:
- ✅ ECG图表可见
- ✅ 实时波形显示
- ✅ 双视图同步更新
- ✅ 平滑的动画效果
### 性能优化:
- ✅ 后台数据处理
- ✅ UI线程不阻塞
- ✅ 数据缓冲机制
- ✅ 实时回调更新
## ⚠️ 注意事项
### 1. 数据格式
- **Nordic UART Service**: 原始字节流
- **数据解析**: 自动协议解析
- **通道映射**: 8通道 → 12通道
### 2. 性能考虑
- **后台处理**: 避免UI阻塞
- **数据缓冲**: 优化内存使用
- **更新频率**: 平衡实时性和性能
### 3. 错误处理
- **连接失败**: 自动重试机制
- **数据异常**: 错误日志记录
- **UI异常**: 异常捕获处理
现在你的应用已经完全支持蓝牙数据流处理可以实时接收、处理和显示ECG数据了🚀