我正在研究连接到BLE设备并在其中进行一些处理的Android应用。
我总共有5个步骤:
在onConnectionStateChange()中,
requestMtu()
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
Log.e("Connect", (System.currentTimeMillis() - startTime) + " ms");
deviceConnected = true;
gatt.requestMtu(185);
break;
在onMtuChanged()中,
discoverServices()
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
Log.e("Mtu Change", (System.currentTimeMillis() - startTime) + " ms");
if (status == BluetoothGatt.GATT_SUCCESS) {
gatt.discoverServices();
}
}
在onServicesDiscovered()中,
writeDescriptor()
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status) {
gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_BALANCED);
Log.e("Service Discover", (System.currentTimeMillis() - startTime) + " ms");
try {
BluetoothGattService service = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
BluetoothGattCharacteristic notifyChar = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
if (notifyChar != null) {
gatt.setCharacteristicNotification(notifyChar, true);
BluetoothGattDescriptor descriptor = notifyChar.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
descriptor.setValue(new byte[]{0x01, 0x00});
gatt.writeDescriptor(descriptor);
gatt.readCharacteristic(notifyChar);
}
} catch (Exception e) {
showToast("Service Disc. EXCEPTION");
e.printStackTrace();
}
}
在onDescriptorWrite()中,
writeCharacteristic()
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
Log.e("Descriptor Write", (System.currentTimeMillis() - startTime) + " ms");
if (status == 0) {
BluetoothGattCharacteristic characteristic = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
characteristic.setValue(myVal);
gatt.writeCharacteristic(characteristic);
Log.e(TAG, "TagID Sent");
}
}
在onCharacteristicWrite()中,
哔哔声
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
final int status) {
Log.e("Characteristic Write", (System.currentTimeMillis() - startTime) + " ms");
if(status == 0){
beep();
}
}
我注意到每个步骤的停机时间,以下是读数(5次发生的平均值)
因此,首先我认为设置mtu大小会花费太多时间,然后我删除了步骤2-requestMtu()),直接调用了DiscoverService()方法,令人惊讶的是,服务发现(步骤3))花费了大约1400毫秒的时间
我做了另一个实验,再次在步骤2)中调用了requestMtu方法,现在第二次调用只花了10到25毫秒。
最后,我了解到成功连接之后的任何第一步都需要更长的时间。
我不知道原因,请您帮助我了解一下,我也想减少这段时间来使整个过程更快。
是否有可能这样做?
谢谢。
答案 0 :(得分:0)
实际上需要时间的是服务发现,该服务发现总是在设备已连接时完成(即使您不调用discoverServices)。任何命令都会延迟到完成为止。为了加快速度,您应该尝试缩小外设的GATT db。您也可以尝试在连接后直接从外围设备发送MTU请求,以使服务发现使用更少的数据包。
顺便说一句,发送写描述符请求后,您不能立即读取特征。您始终需要等待GATT操作完成才能发送新的操作。