PhilipsHue / flutter_reactive_ble

Flutter library that handles BLE operations for multiple devices.
https://developers.meethue.com/
Other
657 stars 323 forks source link

Supported Devices #862

Open phildharmadr opened 2 months ago

phildharmadr commented 2 months ago

Describe the bug We have a functioning app that works across iPhone7, iPhone7 plus, iPhone 12, iPhone14, Pixel 5, Pixel 8, Samsung Galaxy S22 and operates with our BLE device.

Recently we ran into a Samsung Galaxy S20 with SDK33, Android 13 and we are unable to connect to our BLE device.

Is there a list of supported devices and OS versions?

pmagnuson commented 2 months ago

the log capture below shows a little bit of information about this failure. [log] entries are from the application logging (with timestamp) I/Bluetooth entries are from the verbose logging on the ble library.

From the application perspective

For this application and device, this error only occurs on the Galaxy S20 and not other iOS or Android devices that have been tested.

[log] 08:46:27.091: TabProvider: startDiscovery
I/flutter (22327): REACTIVE_BLE: Scan for devices with services:[0eaa6289-88f3-4817-985e-f0b869ad5e05, 8d53dc1d-1db7-4cd3-868b-8a527460aa84], scanMode: ScanMode.balanced, requireLocationServicesEnabled: true
[log] 08:46:27.116: TabSessionCountProvider: user brieS366tsh0CCMkYCu1b0Crpbf1 usageCount 188
I/BLASTBufferQueue(22327): update, w= 1080 h= 2400 mName = ViewRootImpl@c62eca9[MainActivity] mNativeObject= 0xb4000075eb9dce70 sc.mNativeObject= 0xb40000757ba34f70 format= -3 caller= android.view.ViewRootImpl.updateBlastSurfaceIfNeeded:2898 android.view.ViewRootImpl.relayoutWindow:9847 android.view.ViewRootImpl.performTraversals:3884 android.view.ViewRootImpl.doTraversal:3116 android.view.ViewRootImpl$TraversalRunnable.run:10885 android.view.Choreographer$CallbackRecord.run:1301
[log] 08:46:27.117: DatabaseService: checkUserDebugLevel not found
[log] 08:46:27.117: DatabaseService: getUserInfo logLevel FINER
[log] 08:46:27.117: cloudLogging: updateUserLogLevel FINER
[log] 08:46:27.117: DatabaseService: getUserInfo brieS366tsh0CCMkYCu1b0Crpbf1 {image: https://lh3.googleusercontent.com/a/ACg8ocL1OkNgDEsG3gtRXbvq6R12OCjPhrSi9gbWZIG6bLaJAjq9=s96-c, SAVETHREAD: thread_qEQP54daRj42QHXnZRIiiFVd, session_count: 188, name: phil magnuson, last_active: Timestamp(seconds=1715265986, nanoseconds=252000000), email: phillmag@gmail.com}
I/BluetoothAdapter(22327): STATE_ON
I/BluetoothAdapter(22327): STATE_ON
I/BluetoothAdapter(22327): STATE_ON
I/BluetoothAdapter(22327): STATE_ON
D/BluetoothLeScanner(22327): Start Scan with callback
D/BluetoothLeScanner(22327): onScannerRegistered() - status=0 scannerId=4 mScannerId=0
I/flutter (22327): REACTIVE_BLE: Received ScanResult(result: Result<DiscoveredDevice, GenericFailure<ScanFailure>?>.success(DiscoveredDevice(id: 76:6C:68:B5:8A:54, name: DharmaDr, serviceData: {}, serviceUuids: [0eaa6289-88f3-4817-985e-f0b869ad5e05], manufacturerData: [], rssi: -73, connectable: Connectable.available)))
[log] 08:46:58.177: TabProvider: discovery 76:6C:68:B5:8A:54 DharmaDr inProgress false
[log] 08:46:58.179: TabProvider: connect start 76:6C:68:B5:8A:54
I/flutter (22327): REACTIVE_BLE: Received ScanResult(result: Result<DiscoveredDevice, GenericFailure<ScanFailure>?>.success(DiscoveredDevice(id: 76:6C:68:B5:8A:54, name: DharmaDr, serviceData: {}, serviceUuids: [0eaa6289-88f3-4817-985e-f0b869ad5e05], manufacturerData: [], rssi: -73, connectable: Connectable.available)))
[log] 08:46:58.247: TabProvider: discovery 76:6C:68:B5:8A:54 DharmaDr inProgress true
I/flutter (22327): REACTIVE_BLE: Connect to device: 76:6C:68:B5:8A:54, servicesWithCharacteristicsToDiscover: null, timeout: 0:00:01.500000
I/BluetoothAdapter(22327): STATE_ON
D/BluetoothGatt(22327): connect() - device: 766C68_4, auto: false
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.connecting, failure: null)
D/BluetoothGatt(22327): registerApp()
D/BluetoothGatt(22327): registerApp() - UUID=54f40e04-01cf-47e5-80de-da66c94a6395
D/BluetoothGatt(22327): onClientRegistered() - status=0 clientIf=6
[log] 08:46:58.725: TabProvider: connect listen 76:6C:68:B5:8A:54 connecting null
D/BluetoothGatt(22327): onClientConnectionState() - status=0 clientIf=6 device=766C68_4
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.connected, failure: null)
[log] 08:46:58.983: TabProvider: connect listen 76:6C:68:B5:8A:54 connected null
[log] 08:46:58.985: AppBle: writeSecureMode
I/flutter (22327): REACTIVE_BLE: Get discovered services for device: 76:6C:68:B5:8A:54
I/flutter (22327): REACTIVE_BLE: Get discovered services for device: 76:6C:68:B5:8A:54
D/BluetoothGatt(22327): discoverServices() - device: 766C68_4
D/BluetoothGatt(22327): onConnectionUpdated() - Device=766C68_4 interval=6 latency=0 timeout=500 status=0
D/BluetoothGatt(22327): onPhyUpdate() - status=0 address=766C68_4 txPhy=2 rxPhy=2
D/BluetoothGatt(22327): onClientConnectionState() - status=0 clientIf=6 device=766C68_4
D/BluetoothGatt(22327): close()
D/BluetoothGatt(22327): unregisterApp() - mClientIf=6
[log] 08:47:04.624: TabProvider: connect listen 76:6C:68:B5:8A:54 disconnected ConnectionError.failedToConnect
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnected, failure: GenericFailure<ConnectionError>(code: ConnectionError.failedToConnect, message: "Disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 0 (GATT_SUCCESS)"))
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnected, failure: GenericFailure<ConnectionError>(code: ConnectionError.failedToConnect, message: "Disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 0 (GATT_SUCCESS)"))
I/flutter (22327): REACTIVE_BLE: Disconnect device: 76:6C:68:B5:8A:54
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnected, failure: GenericFailure<ConnectionError>(code: ConnectionError.failedToConnect, message: "Disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 0 (GATT_SUCCESS)"))
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnecting, failure: null)
E/flutter (22327): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(service_discovery_failure, java.lang.Exception: Disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 0 (GATT_SUCCESS), [com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$discoverServices$1.invoke(ReactiveBleClient.kt:150), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$discoverServices$1.invoke(ReactiveBleClient.kt:142), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient.discoverServices$lambda$5(ReactiveBleClient.kt:142), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient.$r8$lambda$74mYToVtuy5yOEqTNCOq1V3-cL8(Unknown Source:0), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$$ExternalSyntheticLambda7.apply(Unknown Source:2), io.reactivex.internal.operators.observable.ObservableFlatMapSingle$FlatMapSingleObserver.onNext(ObservableFlatMapSingle.java:100), io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246), io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.test(BehaviorSubject.java:569), io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.emitNext(BehaviorSubject.java:564), io.reactivex.subjects.BehaviorSubject.onNext(BehaviorSubject.java:268), com.signify.hue.flutterreactiveble.ble.DeviceConnector$establishConnection$5.invoke(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector$establishConnection$5.invoke(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector.establishConnection$lambda$5(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector.$r8$lambda$d0bWqnSR02eBFn1cc8Jt0mPjL0E(Unknown Source:0), com.signify.hue.flutterreactiveble.ble.DeviceConnector$$ExternalSyntheticLambda5.accept(Unknown Source:2), io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63), io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101), io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101), io.reactivex.internal.operators.observable.ObservableOnErrorReturn$OnErrorReturnObserver.onError(ObservableOnErrorReturn.java:86), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.drain(ObservableSwitchMap.java:211), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.innerError(ObservableSwitchMap.java:320), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapInnerObserver.onError(ObservableSwitchMap.java:381), io.reactivex.internal.observers.BasicFuseableObserver.onError(BasicFuseableObserver.java:100), io.reactivex.internal.operators.observable.ObservableTimeout$TimeoutObserver.onError(ObservableTimeout.java:136), io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.onError(ObservableDoFinally.java:85), io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:70), io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63), io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.onError(ObservableDoFinally.java:85), io.reactivex.internal.observers.DisposableLambdaObserver.onError(DisposableLambdaObserver.java:65), io.reactivex.internal.operators.observable.ObservableDelaySubscriptionOther$DelayObserver$OnComplete.onError(ObservableDelaySubscriptionOther.java:99), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:496), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:334), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:326), io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:575), io.reactivex.internal.operators.obs
E/flutter (22327): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:651:7)
E/flutter (22327): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:334:18)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #2      ReactiveBleMobilePlatform.getDiscoverServices.<anonymous closure> (package:reactive_ble_mobile/src/reactive_ble_mobile_platform.dart:303:15)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #3      FlutterReactiveBle.getDiscoveredServices (package:flutter_reactive_ble/src/reactive_ble.dart:338:32)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #4      FlutterReactiveBle.resolve (package:flutter_reactive_ble/src/reactive_ble.dart:419:22)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #5      FlutterReactiveBle.resolveSingle (package:flutter_reactive_ble/src/reactive_ble.dart:426:19)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #6      FlutterReactiveBle.readCharacteristic (package:flutter_reactive_ble/src/reactive_ble.dart:167:13)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327): #7      TabProvider._leftConnectDevice.<anonymous closure> (package:dharmadr/ble/tab_provider.dart:337:17)
E/flutter (22327): <asynchronous suspension>
E/flutter (22327):
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnected, failure: null)
[log] 08:47:04.643: HomePage: build mode: HomeScreenMode.localOnly  chatID
[log] 08:47:04.637: AppBle: QualifiedCharacteristic(characteristicId: 0eaa6294-88f3-4817-985e-f0b869ad5e05, serviceId: 0eaa6289-88f3-4817-985e-f0b869ad5e05, deviceId: 76:6C:68:B5:8A:54) [254]
[log] 08:47:04.638: AppBle: bleWriteCommandWithResponse PlatformException(service_discovery_failure, java.lang.Exception: Disconnected from MAC='XX:XX:XX:XX:XX:XX' with status 0 (GATT_SUCCESS), [com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$discoverServices$1.invoke(ReactiveBleClient.kt:150), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$discoverServices$1.invoke(ReactiveBleClient.kt:142), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient.discoverServices$lambda$5(ReactiveBleClient.kt:142), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient.$r8$lambda$74mYToVtuy5yOEqTNCOq1V3-cL8(Unknown Source:0), com.signify.hue.flutterreactiveble.ble.ReactiveBleClient$$ExternalSyntheticLambda7.apply(Unknown Source:2), io.reactivex.internal.operators.observable.ObservableFlatMapSingle$FlatMapSingleObserver.onNext(ObservableFlatMapSingle.java:100), io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246), io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.test(BehaviorSubject.java:569), io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.emitNext(BehaviorSubject.java:564), io.reactivex.subjects.BehaviorSubject.onNext(BehaviorSubject.java:268), com.signify.hue.flutterreactiveble.ble.DeviceConnector$establishConnection$5.invoke(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector$establishConnection$5.invoke(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector.establishConnection$lambda$5(DeviceConnector.kt:125), com.signify.hue.flutterreactiveble.ble.DeviceConnector.$r8$lambda$d0bWqnSR02eBFn1cc8Jt0mPjL0E(Unknown Source:0), com.signify.hue.flutterreactiveble.ble.DeviceConnector$$ExternalSyntheticLambda5.accept(Unknown Source:2), io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63), io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101), io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101), io.reactivex.internal.operators.observable.ObservableOnErrorReturn$OnErrorReturnObserver.onError(ObservableOnErrorReturn.java:86), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.drain(ObservableSwitchMap.java:211), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.innerError(ObservableSwitchMap.java:320), io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapInnerObserver.onError(ObservableSwitchMap.java:381), io.reactivex.internal.observers.BasicFuseableObserver.onError(BasicFuseableObserver.java:100), io.reactivex.internal.operators.observable.ObservableTimeout$TimeoutObserver.onError(ObservableTimeout.java:136), io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.onError(ObservableDoFinally.java:85), io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:70), io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63), io.reactivex.internal.operators.observable.ObservableDoFinally$DoFinallyObserver.onError(ObservableDoFinally.java:85), io.reactivex.internal.observers.DisposableLambdaObserver.onError(DisposableLambdaObserver.java:65), io.reactivex.internal.operators.observable.ObservableDelaySubscriptionOther$DelayObserver$OnComplete.onError(ObservableDelaySubscriptionOther.java:99), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:496), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:334), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:326), io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:575), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:496), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:334), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:326), io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:575), io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63), io.reactivex.internal.operators.observable.ObservableError.subscribeActual(ObservableError.java:38), io.reactivex.Observable.subscribe(Observable.java:12284), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:165), io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139), io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246), io.reactivex.internal.operators.observable.ObservableReplay$UnboundedReplayBuffer.replay(ObservableReplay.java:553), io.reactivex.internal.operators.observable.ObservableReplay$ReplayObserver.replay(ObservableReplay.java:401), io.reactivex.internal.operators.observable.ObservableReplay$ReplayObserver.onNext(ObservableReplay.java:366), io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:101), io.reactivex.internal.operators.observable.ObservableElementAt$ElementAtObserver.onNext(ObservableElementAt.java:86), com.jakewharton.rxrelay2.BehaviorRelay$BehaviorDisposable.test(BehaviorRelay.java:364), com.jakewharton.rxrelay2.BehaviorRelay$BehaviorDisposable.emitNext(BehaviorRelay.java:358), com.jakewharton.rxrelay2.BehaviorRelay.accept(BehaviorRelay.java:135), com.polidea.rxandroidble2.internal.connection.DisconnectionRouter.onDisconnectedException(DisconnectionRouter.java:110), com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:81), android.bluetooth.BluetoothGatt$1$5.run(BluetoothGatt.java:363), android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:1003), android.bluetooth.BluetoothGatt.-$$Nest$mrunOrQueueCallback(Unknown Source:0), android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:358), android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:135), android.os.Binder.execTransactInternal(Binder.java:1321), android.os.Binder.execTransact(Binder.java:1280)], null)
[log] 08:47:04.652: TabUIState: build mode: HomeScreenMode.localOnly connected: false chatID:
[log] 08:47:04.667: ContentCards: content length: 2
[log] 08:47:04.677: MenuScreen: build leftIsConnected false
[log] 08:47:04.701: BatteryStatus: connected: false levels: [100, 100]
[log] 08:47:04.706: BatteryStatus: connected: false levels: [100, 100]
I/flutter (22327): REACTIVE_BLE: Received ConnectionStateUpdate(deviceId: 76:6C:68:B5:8A:54, connectionState: DeviceConnectionState.disconnected, failure: null)
I/TRuntime.CctTransportBackend(22327): Making request to: https://firebaselogging-pa.googleapis.com/v1/firelog/legacy/batchlog
D/TrafficStats(22327): tagSocket(6) with statsTag=0xffffffff, statsUid=-1
I/TRuntime.CctTransportBackend(22327): Status Code: 200
pmagnuson commented 1 month ago

This can be closed. We found that the Galaxy S20 did not respond well to request from the device for the 2M PHY.

It would still be very useful to know what devices are used for testing of the library.