Android BLE Gatt Server с несколькими службами - onCharacteristicWriteRequest () без символа для дескриптора - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь создать BLE Gatt Server с несколькими пользовательскими службами и несколькими характеристиками.

Для начала я использовал пример Google: https://github.com/androidthings/sample-bluetooth-le-gattserver/tree/master/kotlin

Это было прямо и работало очень хорошо. Я изменил UUID так, чтобы они соответствовали моим, и я мог без проблем получать уведомления и писать в символы.

Здесь я определяю сервисы и символы:

fun createTimeService(): BluetoothGattService {
        val service = BluetoothGattService(TIME_SERVICE,
                BluetoothGattService.SERVICE_TYPE_PRIMARY)

        // Current Time characteristic
        val currentTime = BluetoothGattCharacteristic(CURRENT_TIME,
                //Read-only characteristic, supports notifications
                BluetoothGattCharacteristic.PROPERTY_READ or BluetoothGattCharacteristic.PROPERTY_NOTIFY,
                BluetoothGattCharacteristic.PERMISSION_READ)
        val configDescriptor = BluetoothGattDescriptor(CLIENT_CONFIG,
                //Read/write descriptor
                BluetoothGattDescriptor.PERMISSION_READ or BluetoothGattDescriptor.PERMISSION_WRITE)
        currentTime.addDescriptor(configDescriptor)

        // Local Time Information characteristic
        val localTime = BluetoothGattCharacteristic(LOCAL_TIME_INFO,
                BluetoothGattCharacteristic.PROPERTY_WRITE,
                BluetoothGattCharacteristic.PERMISSION_WRITE)

        service.addCharacteristic(currentTime)
        service.addCharacteristic(localTime)

        return service
    }

    fun createSerialService(): BluetoothGattService {
        val service = BluetoothGattService(serialPortServiceID,
                BluetoothGattService.SERVICE_TYPE_PRIMARY)

        val serialData = BluetoothGattCharacteristic(serialDataCharacteristicID,
        BluetoothGattCharacteristic.PROPERTY_WRITE,
        BluetoothGattCharacteristic.PERMISSION_WRITE)

        service.addCharacteristic(serialData)

        return service
    }

И вот я применяю их к моему серверу:

 private fun startServer() {
        bluetoothGattServer = bluetoothManager.openGattServer(this, gattServerCallback)

        bluetoothGattServer?.addService(TimeProfile.createTimeService())
                ?: Log.w(TAG, "Unable to create GATT server")

        bluetoothGattServer?.addService(TimeProfile.createSerialService())
                ?: Log.w(TAG, "Unable to create GATT server")

        // Initialize the local UI
        updateLocalUi(System.currentTimeMillis())
    }

Я ожидаю, что все будет работать, как раньше, после добавления второго сервиса. Но теперь, если я пытаюсь написать / подписаться на любую из характеристик (не имеет значения, в каком сервисе), я просто получаю это:

W/BluetoothGattServer: onCharacteristicWriteRequest() no char for handle 42
W/BluetoothGattServer: onDescriptorWriteRequest() no desc for handle 43

1 Ответ

0 голосов
/ 03 июля 2019

Я нашел, что пошло не так. Очевидно, вы не можете просто добавить все сервисы одновременно, как я. Добавление второго сервиса до того, как первый был подтвержден, приводит к исключению, устанавливающему сервисы в нуль.

В конце концов, я решил эту проблему, добавив сначала только один сервис. Затем в обратном вызове onServiceAdded () функции BleGattServerCallback () я начал один за другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...