Я пытаюсь записать пользовательский признак на BLE-устройство, используя Пример проекта Google .
На DeviceControlActivity
, и пока я зацикливаюсь на извлеченных BluetoothGattService
s Я пытаюсь установить характеристику для одного из них.На данный момент я просто выбираю один случайным образом для проверки.
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
Обратите внимание, что байтовый массив буквально скопирован из другой характеристики, поэтому обычно он выполняет свою работу.
Возможно ли, что устройство, на которое я пытаюсь записать, не поддерживает запись?или сам сервис?
РЕДАКТИРОВАТЬ:
Следуя предложению в комментарии, я попытался изменить существующий признак, используя приведенный ниже код, но безуспешно (я думаю, что признак был создан с использованием флага READ only?)
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())
}