Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## Unreleased
* Windows: Harden BLE connection lifetime, asynchronous callbacks, and notification subscription handling
* Android: instantly close the GATT client on disconnect
* Add Descriptor Read and Write apis

## 2.1.1
* Android: Fix BluetoothDevice null-safety compile error under Kotlin 2.x
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,16 @@ await characteristic.write([0x01, 0x02, 0x03]);
await characteristic.write([0x01, 0x02, 0x03], withResponse: false);
```

To read or write a descriptor of this characteristic

```dart
Uint8List value = await characteristic.descriptor('2901').read();
```

```dart
await characteristic.descriptor('2901').write([0x01, 0x02, 0x03]);
```

## Subscriptions

Get `BleCharacteristic` using `bleDevice.getCharacteristic`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1714,8 +1714,10 @@ interface UniversalBlePlatformChannel {
fun setNotifiable(deviceId: String, service: String, characteristic: String, bleInputProperty: BleInputProperty, callback: (Result<Unit>) -> Unit)
fun discoverServices(deviceId: String, withDescriptors: Boolean, callback: (Result<List<UniversalBleService>>) -> Unit)
fun readValue(deviceId: String, service: String, characteristic: String, callback: (Result<ByteArray>) -> Unit)
fun readDescriptorValue(deviceId: String, service: String, characteristic: String, descriptor: String, callback: (Result<ByteArray>) -> Unit)
fun requestMtu(deviceId: String, expectedMtu: Long, callback: (Result<Long>) -> Unit)
fun writeValue(deviceId: String, service: String, characteristic: String, value: ByteArray, bleOutputProperty: BleOutputProperty, callback: (Result<Unit>) -> Unit)
fun writeDescriptorValue(deviceId: String, service: String, characteristic: String, descriptor: String, value: ByteArray, callback: (Result<Unit>) -> Unit)
fun isPaired(deviceId: String, callback: (Result<Boolean>) -> Unit)
fun pair(deviceId: String, callback: (Result<Boolean>) -> Unit)
fun unPair(deviceId: String)
Expand Down Expand Up @@ -1977,6 +1979,29 @@ interface UniversalBlePlatformChannel {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.readDescriptorValue$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val deviceIdArg = args[0] as String
val serviceArg = args[1] as String
val characteristicArg = args[2] as String
val descriptorArg = args[3] as String
api.readDescriptorValue(deviceIdArg, serviceArg, characteristicArg, descriptorArg) { result: Result<ByteArray> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(UniversalBlePigeonUtils.wrapError(error))
} else {
val data = result.getOrNull()
reply.reply(UniversalBlePigeonUtils.wrapResult(data))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.requestMtu$separatedMessageChannelSuffix", codec)
if (api != null) {
Expand Down Expand Up @@ -2021,6 +2046,29 @@ interface UniversalBlePlatformChannel {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.writeDescriptorValue$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val deviceIdArg = args[0] as String
val serviceArg = args[1] as String
val characteristicArg = args[2] as String
val descriptorArg = args[3] as String
val valueArg = args[4] as ByteArray
api.writeDescriptorValue(deviceIdArg, serviceArg, characteristicArg, descriptorArg, valueArg) { result: Result<Unit> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(UniversalBlePigeonUtils.wrapError(error))
} else {
reply.reply(UniversalBlePigeonUtils.wrapResult(null))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.universal_ble.UniversalBlePlatformChannel.isPaired$separatedMessageChannelSuffix", codec)
if (api != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -462,4 +462,20 @@ class SubscriptionResultFuture(
class RssiResultFuture(
val deviceId: String,
val result: (Result<Long>) -> Unit,
)

class ReadDescriptorResultFuture(
val deviceId: String,
val descriptorId: String,
val characteristicId: String,
val serviceId: String,
val result: (Result<ByteArray>) -> Unit,
)

class WriteDescriptorResultFuture(
val deviceId: String,
val descriptorId: String,
val characteristicId: String,
val serviceId: String,
val result: (Result<Unit>) -> Unit,
)
Loading
Loading