Hello, I'm developing app communicating with custom Bluetooth LE devices. We have already an Android app in production and the Bluetooth LE devices are working. Developing now iOS application I faced a strange behaviour, not sure exactly where is the trick.
I define profiles for the ProfileManager and using the example like this:
func activate() {
let serviceUUID = CBUUID(string: NetGuard.DeviceInformationService.uuid)
let readUUID = CBUUID(string: NetGuard.Read.uuid)
let writeUUID = CBUUID(string: NetGuard.Write.uuid)
let dataUpdateFuture = self.manager.whenStateChanges().flatMap { [unowned self] state -> FutureStream<Peripheral> in
switch state {
case .poweredOn:
return self.manager.startScanning(forServiceUUIDs: [serviceUUID], capacity: 10)
case .poweredOff:
throw AppError.poweredOff
case .unauthorized, .unsupported:
throw AppError.invalidState
case .resetting:
throw AppError.resetting
case .unknown:
throw AppError.unknown
}
}.flatMap { [unowned self] peripheral -> FutureStream<Void> in
self.manager.stopScanning()
self.peripheral = peripheral
return peripheral.connect(connectionTimeout: 10.0)
}.flatMap { [unowned self] () -> Future<Void> in
guard let peripheral = self.peripheral else {
throw AppError.unlikely
}
return peripheral.discoverServices([serviceUUID])
}.flatMap { [unowned self] () -> Future<Void> in
guard let peripheral = self.peripheral, let service = peripheral.services(withUUID: serviceUUID)?.first else {
throw AppError.serviceNotFound
}
return service.discoverCharacteristics([readUUID, writeUUID])
}.flatMap { [unowned self] () -> Future<Void> in
guard let peripheral = self.peripheral, let service = peripheral.services(withUUID: serviceUUID)?.first else {
throw AppError.serviceNotFound
}
guard let readChar = service.characteristics(withUUID: readUUID)?.first else {
throw AppError.dataCharactertisticNotFound
}
guard let writeChar = service.characteristics(withUUID: writeUUID)?.first else {
throw AppError.enabledCharactertisticNotFound
}
self.pingerReadCharacteristic = readChar
self.pingerWriteCharacteristic = writeChar
return writeChar.write(data: Data(bytes: Array(">".utf8)))
}.flatMap { [unowned self] _ -> Future<[Void]> in
return [self.pingerReadCharacteristic].compactMap { $0 }.map { $0.read(timeout: 10.0) }.sequence()
}.flatMap { [unowned self] _ -> Future<Void> in
guard let readChar = self.pingerReadCharacteristic else {
throw AppError.dataCharactertisticNotFound
}
return readChar.startNotifying()
}.flatMap { [unowned self] () -> FutureStream<Data?> in
guard let readChar = self.pingerReadCharacteristic else {
throw AppError.dataCharactertisticNotFound
}
return readChar.receiveNotificationUpdates(capacity: 10)
}
dataUpdateFuture.onSuccess { data in
print("DATA:", data)
}
}
It looks like writing to the input characteristic and after that enable notifying on the output characteristic doesn't report the result data. Also I change some Futures on the chain and I saw that the read was also successful, but again no data arrived.
On Android I checked that before writing and waiting for a response we first set the notification on the characteristic.
So can you give me some guidelines how can I rearrange the Futures in order to be able after connect and configure the notification on the input characteristic then to write on the output characteristic and wait for the data.
Hello, I'm developing app communicating with custom Bluetooth LE devices. We have already an Android app in production and the Bluetooth LE devices are working. Developing now iOS application I faced a strange behaviour, not sure exactly where is the trick.
I define profiles for the
ProfileManager
and using the example like this:It looks like writing to the input characteristic and after that enable notifying on the output characteristic doesn't report the result data. Also I change some Futures on the chain and I saw that the read was also successful, but again no data arrived.
On Android I checked that before writing and waiting for a response we first set the notification on the characteristic.
So can you give me some guidelines how can I rearrange the Futures in order to be able after connect and configure the notification on the input characteristic then to write on the output characteristic and wait for the data.
Thanks.