Ребята, я пытаюсь построить абстракцию службы BLE, которая выставляет характеристические запросы записи и чтения c как поток, используя потоковый API Kotlin. Моя проблема заключается в том, что я не могу придумать способ «связать» объект BluetoothGattServerCallback
, который нужно передать при открытии сервера с потоками, которые я хочу вернуть.
class BleRxClient(private val context: Context) {
private val bluetoothManager: BluetoothManager =
context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
private val callbacks = GattServerCallbacks()
private val server: BluetoothGattServer = bluetoothManager.openGattServer(context, callbacks)
suspend fun writeRequests() = flow {
// ?????
}
internal class GattServerCallbacks : BluetoothGattServerCallback() {
override fun onDescriptorReadRequest(
device: BluetoothDevice?,
requestId: Int,
offset: Int,
descriptor: BluetoothGattDescriptor?
) {
// ????
}
override fun onCharacteristicWriteRequest(
device: BluetoothDevice?,
requestId: Int,
characteristic: BluetoothGattCharacteristic?,
preparedWrite: Boolean,
responseNeeded: Boolean,
offset: Int,
value: ByteArray?
) {
// ????
}
override fun onCharacteristicReadRequest(
device: BluetoothDevice?,
requestId: Int,
offset: Int,
characteristic: BluetoothGattCharacteristic?
) {
// ???
}
override fun onDescriptorWriteRequest(
device: BluetoothDevice?,
requestId: Int,
descriptor: BluetoothGattDescriptor?,
preparedWrite: Boolean,
responseNeeded: Boolean,
offset: Int,
value: ByteArray?
) {
// ????
}
}
}
Я искал с в этом конкретном сценарии не удалось найти пути для соединения API-интерфейса потока с API-интерфейсами на основе обратного вызова. Я знаю о примитиве callbackFlow
, но, поскольку я пропускаю обратные вызовы при открытии сервера, это будет означать, что каждый раз нужно открывать новый сервер. Спасибо!