Мы работаем над связью Bluetooth Low Energy между двумя приложениями Android.Один является периферийным / серверным, один центральным / клиентским.Сервер отправит указание клиентам, если данные изменились.Однако мы не нашли способа убедиться, что данные действительно были подтверждены на стороне клиента.Как мы можем выяснить, если клиент получил и подтвердил данные, чтобы соответственно отреагировать на них на стороне сервера?
В соответствии с документацией Android существует обратный вызов onNotificationSent для BleutoothGattServer.https://developer.android.com/reference/android/bluetooth/BluetoothGattServerCallback#onNotificationSent(android.bluetooth.BluetoothDevice,%20int)
Однако при отладке и выполнении некоторых тестов кажется, что этот метод действительно вызывается, только если отправлено уведомление.Нет никакой гарантии, что сообщение было фактически получено или подтверждено.
Итак, вот как мы настраиваем характеристики для GattServer
BluetoothGattService service = new BluetoothGattService(SERVICE_LOGIN_UUID,
BluetoothGattService.SERVICE_TYPE_PRIMARY);
// Write characteristic
BluetoothGattCharacteristic writeCharacteristic = new BluetoothGattCharacteristic(CHARACTERISTIC_LOGIN_UUID,
BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_READ| BluetoothGattCharacteristic.PROPERTY_INDICATE,
// Somehow this is not necessary, the client can still enable notifications
// | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_WRITE | BluetoothGattCharacteristic.PERMISSION_READ);
service.addCharacteristic(writeCharacteristic);
mGattServer.addService(service);
, а затем мы уведомляем клиентов, вызывая этот
mHandler.post(() -> {
BluetoothGattService service = mGattServer.getService(SERVICE_LOGIN_UUID);
BluetoothGattCharacteristic characteristic = service.getCharacteristic(uuid);
log("Notifying characteristic " + characteristic.getUuid().toString()
+ ", new value: " + StringUtils.byteArrayInHexFormat(value));
characteristic.setValue(value);
boolean confirm = BluetoothUtils.requiresConfirmation(characteristic);
for(BluetoothDevice device : mDevices) {
mGattServer.notifyCharacteristicChanged(device, characteristic, confirm);
}
});
* ПОЖАЛУЙСТА, ИГНОРИРУЙТЕ ДЛЯ ПЕТЛИЗДЕСЬ ДЛЯ МОМЕНТА
Это вызовет вызов onNotificationSent, но не поможет узнать, был ли он подтвержден или нет.
Дайте мне знать, если вам нужны другие части кода.
Спасибо всем вам уже, много поздравлений