Проблема с записью характеристик gatt на устройство BLE

Я пытаюсь написать пользовательскую характеристику для устройства BLE, используя пример проекта Google< /а> .

На DeviceControlActivity и пока я перебираю выбранные BluetoothGattService, я пытаюсь установить характеристику для одного из них. На данный момент я просто выбираю случайным образом для тестирования.

private void displayGattServices(List<BluetoothGattService> gattServices) {
    ...

    // Loops through available GATT Services.
    for (BluetoothGattService gattService : gattServices) {
        uuid = gattService.getUuid().toString();
        if(uuid.equals("00001800-0000-1000-8000-00805f9b34fb") && !firstTime){
            firstTime = true;
            BluetoothGattCharacteristic customChar = new BluetoothGattCharacteristic(MY_CHARACTERISTIC,
            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE,
            BluetoothGattCharacteristic.PERMISSION_READ |BluetoothGattCharacteristic.PERMISSION_WRITE);

            byte[] val = new byte[20];
            val[0] = 71;
            val[1] = 97;
            val[2] = 108;
            val[3] = 97;
            val[4] = 120;
            val[5] = 121;
            val[6] = 32;
            val[7] = 70;
            val[8] = 105;
            val[9] = 116;
            val[10] = -30;
            val[11] = -109;
            val[12] = -108;
            val[13] = 32;
            val[14] = 40;
            val[15] = 70;
            val[16] = 57;
            val[17] = 66;
            val[18] = 57;
            val[19] = 41;
            customChar.setValue(val);
            boolean isAdded = gattService.addCharacteristic(customChar);
            Log.d(TAG,"CARAC ADDED? "+isAdded);
        }

    ...
}

Этот вызов addCharacteristic возвращает true, что, согласно документам, означает, что операция записи прошла успешно, однако, когда я повторно сканирую сервисы (без выполнения приведенного выше кода), я не могу найти BluetoothGattCharacteristic, также когда я пытаюсь прочитать значение указанной характеристики, я получаю статус 135. Согласно этот пост означает GATT_ILLEGAL_PARAMETER

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

Возможно ли, что устройство, на которое я пытаюсь записать, не поддерживает запись? или сам сервис?

РЕДАКТИРОВАТЬ:

Следуя предложению в комментарии, я безуспешно пытался изменить существующую характеристику, используя приведенный ниже код (я думаю, что характеристика была создана с использованием флага только для чтения?)

for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
            ...
            uuid = gattCharacteristic.getUuid().toString();
            // UUID for device name
            if(uuid.equals("00002a00-0000-1000-8000-00805f9b34fb") && !firstTime){
                firstTime = true;
                gattCharacteristic.setValue("Hello");
               boolean isAdded = mBluetoothLeService.writeCharacteristic(gattCharacteristic);
                Log.d(TAG,"CARAC ADDED? "+isAdded); // returns false
            }

Я также пытался настроить GattServer и создать новую службу с новой характеристикой, но тоже безуспешно. Вот код (это партус Kotlin):

mBluetoothGattServer = mBluetoothManager?.openGattServer(this@MainActivity,gattCallback)
        mBluetoothGattServer?.connect(result.device,false)

val gattCallback = object: BluetoothGattServerCallback() {
    override fun onConnectionStateChange(device: BluetoothDevice?, status: Int, newState: Int) {
        super.onConnectionStateChange(device, status, newState)
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            val service = BluetoothGattService(UUID.fromString("f000aa01-0451-4000-b000-000000000000"), BluetoothGattService.SERVICE_TYPE_PRIMARY)
            val characteristic = BluetoothGattCharacteristic(UUID.fromString("00002a00-0000-1000-8000-00805f9b34fb"), 
                    BluetoothGattCharacteristic.PROPERTY_READ or BluetoothGattCharacteristic.PROPERTY_WRITE or BluetoothGattCharacteristic.PROPERTY_NOTIFY, 
                    BluetoothGattCharacteristic.PERMISSION_READ or BluetoothGattCharacteristic.PERMISSION_WRITE)
            characteristic.addDescriptor(BluetoothGattDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"), BluetoothGattCharacteristic.PERMISSION_WRITE))
            service.addCharacteristic(characteristic)
            mBluetoothGattServer?.addService(service)
         }
    }
    // Not sure if this is needed but it never triggers.
    override fun onCharacteristicWriteRequest(device: BluetoothDevice?, requestId: Int, characteristic: BluetoothGattCharacteristic?, preparedWrite: Boolean, responseNeeded: Boolean, offset: Int, value: ByteArray?) {
        super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value)
        mBluetoothGattServer?.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, "Hello".toByteArray())
    }

person 113408    schedule 23.09.2019    source источник
comment
Если вы хотите писать как клиент GATT, вы должны найти характеристику в сервисе, установить значение и затем вызвать writeCharacteristic. Вызовы new и add следует использовать только в том случае, если вы хотите построить сервер GATT.   -  person Emil    schedule 23.09.2019
comment
@Emil Эмиль, я попробовал твои предложения, но оба не сработали. Я обновляю вопрос фрагментами кода   -  person 113408    schedule 24.09.2019