SDK_APP/BLUETOOTH_DATA_FLOW_GUIDE.md

4.6 KiB
Raw Blame History

蓝牙数据流处理指南

🎯 数据流处理架构

数据流向

蓝牙设备 → 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图表

  • 实时更新: ECGRhythmViewECGWaveformView
  • 数据缓冲: 性能优化的数据缓冲机制
  • 双视图显示: 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. 蓝牙数据接收

// 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数据了🚀