174 lines
4.6 KiB
Markdown
174 lines
4.6 KiB
Markdown
# 蓝牙数据流处理指南
|
||
|
||
## 🎯 数据流处理架构
|
||
|
||
### 数据流向
|
||
```
|
||
蓝牙设备 → 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数据了!🚀
|