所以我正在开发一个通过BLE连接到EEG board的应用程序。 我的应用程序正在构建Google BLE Gatt Sample,用于接收前面提到的电路板的EEG样本。 这些样本以100个数据包/秒的速度传输,因为这是根据它们的限制,然后才会出现重大数据包丢失。
在我们用于测试的平板电脑(华为Mediapad T3 10)上遇到一些数据包丢失(大约6%)之后,我想找到导致此问题的原因。 我删除了用于处理数据的每一段代码,只留下代码来计算和跟踪丢失的数据包的数量:
private static void updatePacketsCount(int packetID){
// Update last packet ID and dropped packets
totalPackets++;
int packets_dropped;
if (last_id == -1){
last_id = packetID;
return;
}
// ID loops every 101 packets
if (packetID > last_id){
packets_dropped = packetID - last_id - 1;
} else{
packets_dropped = packetID + 101 - last_id - 1;
}
last_id = packetID;
if (packets_dropped > 0){
if (packets_dropped==100)
return;
Log.e(TAG, "Warning: dropped " + packets_dropped + " packets.");
lostPackets = lostPackets + packets_dropped;
}
}
在取出可能的CPU密集型代码后,我仍然遇到相同的数据包丢失,因此我总共测试了4台设备
使用蓝牙v4.1的Android 5.0.2上的Redmi Note 3(MTK):
A / GanglionBluetoothLeService:丢失:64509%的损失中的0 = 0.0
带有蓝牙v4.0的Android 6.0上的Doogee X5max pro
E / GanglionBluetoothLeService:丢失:损失的63550%中的3596 = 5.658536585365853使用蓝牙v4.0的Android 7.0上的华为Mediapad T3 10
E / GanglionBluetoothLeService:丢失:损失42640%中的2689 = 6.306285178236398
采用蓝牙v4.0的Android 5.1.1上的Teclast X98 Plus II
A / GanglionBluetoothLeService:丢失:损失65388%中的808 = 1.235700740196978所有设备都放在靠近电路板约20厘米的桌子上。
现在我的实际问题是,这是硬件还是软件问题?与具有4.0的设备相比,具有蓝牙4.1的设备似乎按预期执行? 或者这可能是由于CPU延迟/性能不佳?有人建议使用Android NDK来获得更好的结果,但我想知道这是否会比官方Google示例代码提供更好的改进。
修改 eeg板正在运行固件https://github.com/OpenBCI/OpenBCI_Ganglion_Library 发送数据如下所示:
void OpenBCI_Ganglion::sendCompressedPacket19() {
radioBuffer[0] = ringBufferLevel + 100;
for (int i = 0; i < 19; i++) {
radioBuffer[i+1] = compression_ring[ringBufferLevel][i];
}
ringBufferLevel++;
if (BLEconnected) {
SimbleeBLE.send(radioBuffer, 20);
}
}