BluetoothGattCharacteristic.value возвращает имя устройства - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь получить значение датчика выше BLE.Я могу подключиться к датчику, и вызывается onCharacteristicRead, но вызов BluetoothGattCharacteristc.value или .getStringValue (0) и т. Д. Всегда возвращает имя устройства датчика вместо значения характеристики.

Я могу получить доступ к значению датчика с помощьюПриложение BLE на моем телефоне, поэтому я знаю, что датчик отправляет правильное значение.

BluetoothGattCallback:

private val gattCallback = object : BluetoothGattCallback() {

    override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            bluetoothGatt?.discoverServices()
        }
    }

    override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            for (service: BluetoothGattService in bluetoothGatt!!.services) {
                Log.i(TAG, service.uuid.toString())
                Log.i(TAG, service.characteristics.size.toString())
                for (characteristic: BluetoothGattCharacteristic in service.characteristics) {

                    //Read
                    bluetoothGatt?.readCharacteristic(characteristic)

                    if(characteristic.uuid == CHARACTERISTIC_UUID){
                        //Notify
                        Log.i(TAG, characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID).uuid.toString())
                        bluetoothGatt?.setCharacteristicNotification(characteristic, true)
                        val descriptor = characteristic
                            .getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID).apply {
                                value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                            }
                        bluetoothGatt?.writeDescriptor(descriptor)
                    }
                }
            }
        }
    }

    override fun onCharacteristicRead(
        gatt: BluetoothGatt?,
        characteristic: BluetoothGattCharacteristic?,
        status: Int
    ) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            Log.i(TAG, characteristic!!.getStringValue(0)) // Returns device name
            Log.i(TAG, String(characteristic.value))       // Returns device name
        } else {
            Log.w(TAG, "GATT failure")
        }
    }

    override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?) {
        Log.i(TAG, String(characteristic!!.value))
    }
}

onCharacteristicRead вызывается, но возвращаются неправильные значения.onCharacteristicChanged никогда не вызывается, хотя значения датчиков постоянно обновляются.Что я сделал не так?

1 Ответ

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

Это изменение решило проблему:

override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        for (service: BluetoothGattService in bluetoothGatt!!.services) {
            for (characteristic: BluetoothGattCharacteristic in service.characteristics) {

                if(characteristic.uuid == CHARACTERISTIC_UUID){
                    //Read
                    bluetoothGatt?.readCharacteristic(characteristic)

                    //Notify
                    Log.i(TAG, characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID).uuid.toString())
                    bluetoothGatt?.setCharacteristicNotification(characteristic, true)
                    val descriptor = characteristic
                        .getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_UUID).apply {
                            value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                        }
                    bluetoothGatt?.writeDescriptor(descriptor)
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...