具有多种服务的Android BLE Gatt Server-onCharacteristicWriteRequest()没有用于处理的字符

时间:2019-07-02 14:48:53

标签: android kotlin bluetooth-lowenergy gatt bluetooth-gatt

我正在尝试构建具有多个自定义服务和多个特征的BLE Gatt服务器。

首先,我使用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 :(得分:0)

我发现出了什么问题。显然,您不能像我一样一次性添加所有服务。在确认第一个服务之前添加第二个服务会导致将服务设置为null的异常。

最后,我通过仅添加一项服务解决了这一问题。 然后在BleGattServerCallback()的onServiceAdded()回调中,我一个接一个地启动。