Я работаю над приложением Android, которое подключается к BLE-устройству и выполняет там некоторые процессы.
У меня всего 5 шагов:
После сканирования и connectGatt ()
В 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");
}
}
In 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),
- Успешное соединение (т. Е. OnConnectionStateChange ()): от 500 до 525 мс
- MtuChange (т. Е. OnMtuChanged ()): от 1400 до 1450 мс
- Обнаружение службы (т. Е. OnServicesDiscovered ()): От 10 до 25 мс
- Запись дескриптора (т.е. onDescriptorWrite ()): от 10 до 25 мс
- Характеристическая запись (т. Е. OnCharacteristicWrite): от 10 до 25 мс
Итак, сначала я подумал, что установка размера mtu занимает слишком много времени, затем я удалил шаг 2 - requestMtu ()) и напрямую вызвал метод DiscoverService (), что удивительно, обнаружение службы (шаг 3)) заняло около 1400 мс времени.
Я снова провел другой эксперимент, названный методом requestMtu на шаге 2), теперь второй вызов занял всего 10-25 мс.
Наконец, я понял, что любой первый шаг после успешного подключения занимает больше временивремя.
Я не знаю, почемуп, не могли бы вы помочь мне понять, а также, я хочу сократить это время, чтобы ускорить весь процесс.
Есть ли возможность сделать это?
Заранее спасибо.