我想连接到蓝牙设备并以最快的方式将值写入特征。目前我的代码给出了不好的结果:
1) BLE 扫描 - 如您所见,我对要连接的设备的 MAC 地址进行了硬编码。我还获得了 connectGatt 方法调用的时间戳。
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
if(device.getAddress().equals("F1:9F:EE:6B:AB:83")) {
mConnectedGatt = device.connectGatt(this, false, mGattCallback);
start = System.currentTimeMillis()/1000;
};
}
2) onConnectionChanged - 我得到另一个时间戳并减去它们以了解连接操作持续了多少时间
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
end = System.currentTimeMillis()/1000;
Log.d("QWERTY", "TIME " + (end - start));
if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) {
Log.d("QWERTY","Success");
gatt.discoverServices();
} else if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.d("QWERTY","Disconnected");
} else if (status != BluetoothGatt.GATT_SUCCESS) {
Log.d("QWERTY","Connection error");
gatt.disconnect();
}
}
这是我的主要问题。 device.connectGatt 和 onConnectionStateChange 之间的时间需要 3 - 8 秒,这对我来说太长了。如果是 1 秒左右我会很高兴。 写入特性在 onServicesDiscovered 监听器中花费的时间不到一秒,因此这不是问题。
问题 1):有什么办法可以加快连接时间吗?
问题 2):有什么方法可以将与设备的蓝牙连接存储在缓存中,这样它在第一次连接时会持续很长时间,并且在以后的调用过程中会更快?
问题 3):还有什么其他建议可以让它运行得更快吗?也许我的方法不好。
最佳答案
1) 是的,您的外设必须在连接时提供更好的连接间隔参数。发现服务/特性后,如果需要,您可以随时再次减慢它们的速度,以节省持久连接的电池电量。
2)绑定(bind)可能有助于将来的连接。
3) 如果您有很多服务/特性,那么需要更长的时间来发现它们并在较低层堆栈中生成句柄表。对于 iOS,您应该发送 20ms (32) 的最小连接间隔和 40ms (64) 的最大连接间隔,但您可以使用 10ms-20ms 进行破解,您将获得大约 18-19ms 的间隔。 在 Android 上,这可能过于激进,可能会导致三星拒绝。所以尝试[20;40ms]
关于android - 蓝牙 LE 连接时间/缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24370184/