Как узнать, подтвержден ли индикатор BLE в Android - PullRequest
0 голосов
/ 08 февраля 2019

Мы работаем над связью 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, но не поможет узнать, был ли он подтвержден или нет.

Дайте мне знать, если вам нужны другие части кода.

Спасибо всем вам уже, много поздравлений

1 Ответ

0 голосов
/ 13 февраля 2019

К сожалению, в Android подтверждение отправляется / принимается за кулисами, т. Е. Нет механизма, где вы могли бы использовать это в своем приложении.Пожалуйста, взгляните на следующую ссылку: -

Обработка показаний вместо уведомлений в Android BLE

Если вы действительно хотите, чтобы какой-либо механизм уровня приложения доказывал, что данныебыл получен, вы можете реализовать другую (дополнительную) характеристику на стороне вашего сервера.Когда данные получены на центральной стороне, они могут просто записать в эту характеристику, чтобы доказать, что они имеют.Это имеет тот недостаток, что делает ваше приложение более сложным, но, возможно, более надежным.Причиной этого является то, что вы вручную отправляете подтверждения с уровня приложения, гарантируя, что все работает должным образом, в то время как автоматическая отправка ACK с уровня основной полосы частот не является доказательством того, что все работает на 100% успешно (например, данные не выполнялись).сделать его из основной полосы в приложение, или ваше приложение зависло и т. д.).

Надеюсь, это поможет.

...