react-native-ble-plx: [iOS] Scan - BleError: BluetoothLE is in unknown state
Prerequisites
- I am running the latest version
- I checked the documentation and found no answer
- I checked to make sure that this issue has not already been filed
Expected Behavior
When the BleState is PoweredOn, I should be able to startScanDevices() without having BleError: BluetoothLE is in unknown state.
I should be able to scan devices with and without “Remote Debug” enabled.
Current Behavior
When I start scanning my devices, I receive the BleError: BluetoothLE is in unknown state even if I waited that the BleManager State was in ‘PoweredOn’.
This behavior is only present when I enable the “Remote Debug” on iOS. It’s working fine if I’m disable the “Remote Debug”.
It’s really annoying because everybody is developing with the Remote Debug active I guess… Otherwise it’s a bit complicated.
I don’t see anything about this issue in the documentation. It’s just written that we have to wait that the status is PoweredOnon iOS. And that’s done…
I found that it’s not working with the “Remote Debug” active in this issue. I don’t understand why there is no related issue or documentation about that…
Steps to Reproduce
Please provide detailed steps for reproducing the issue.
- Run your app
- Activate Remote Debug
- Wait until State is
PoweredOn - Call
startDevicesScan() - See error…
Context
- Library version: 2.0.1
- Platform: iOS.
- JS logs:
DeviceScanner.js:17 LIB : Wait until bluetooth ready...
DeviceScanner.js:28 Base state PoweredOn
DeviceScanner.js:57 LIB : Start scan...
DeviceScanner.js:70 Scan error : {"message":"BluetoothLE is in unknown state","errorCode":103,"attErrorCode":null,"iosErrorCode":null,"androidErrorCode":null,"reason":null,"name":"BleError"}
DeviceScanner.js:85 LIB : Scan stopped
DeviceScanner.js:22 State change : PoweredOn
- Formatted code sample or link to a repository:
App.js
startScan() {
_deviceScanner.startDevicesScan(
error => {
console.error(error);
_deviceScanner.stopDevicesScan();
},
device => {
console.log(device);
}
);
};
DeviceScanner.js
/**
* Wait until Bluetooth is ready. On iOS the BLE stack is not immediately ready,
* we need to wait for the "PoweredOn" status.
*/
async waitUntilBluetoothReady() {
let {PoweredOn, PoweredOff, Unauthorized, Unsupported} = State;
console.log('LIB : Wait until bluetooth ready...');
return new Promise(async (resolve, reject) => {
this._bleManager.onStateChange(state => {
console.log('State changed : ', state);
if (state === PoweredOn) {
resolve(true);
}
});
// Verify if the state is already poweredOn before the listener was created
let crtState = await this._bleManager.state();
console.log('Base state', crtState);
if (crtState === PoweredOn) {
resolve(true);
}
else if (
crtState === PoweredOff ||
crtState === Unauthorized ||
crtState === Unsupported
) {
reject(new Error('Bluetooth is not available :', crtState));
}
});
}
/**
* Start device scanning only if the BleManager State is ready
*/
async startDevicesScan(
onError: (error: Error) => void,
onDeviceFound: (device: ConnectHubDevice) => void,
) {
this.waitUntilBluetoothReady()
.then(() => {
console.log('LIB : Start scan...');
const scanOptions = {
allowDuplicates: false,
scanMode: ScanMode.LowLatency,
};
this._bleManager.startDeviceScan(
[SERVICE_UUID],
scanOptions,
(error, device) => {
if (error) {
onError(error);
}
if (device) {
onDeviceFound(device);
}
},
);
})
.catch(error => console.log(JSON.stringify(error));
}
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Reactions: 10
- Comments: 16
Is there any progress??
It is important to keep only a single instance of
BleManager. Readme was recently updated to stress this out.In my case, when the BleManager is being created and its log is
_activePromises: {} _activeSubscriptions: {} _errorCodesToMessagesMapping: {0: “Unknown error occurred. This is probably a bug! Check reason property.”, 1: “BleManager was destroyed”, 2: “Operation was cancelled”, 3: “Operation timed out”, 4: “Operation was rejected”, 5: “Invalid UUIDs or IDs were passed: {internalMessage}”, 100: “BluetoothLE is unsupported on this device”, 101: “Device is not authorized to use BluetoothLE”, 102: “BluetoothLE is powered off”, 103: “BluetoothLE is in unknown state”, 104: “BluetoothLE is resetting”, 105: “Bluetooth state change failed”, 200: “Device {deviceID} connection failed”, 201: “Device {deviceID} was disconnected”, 202: “RSSI read failed for device {deviceID}”, 203: “Device {deviceID} is already connected”, 204: “Device {deviceID} not found”, 205: “Device {deviceID} is not connected”, 206: “Device {deviceID} could not change MTU size”, 300: “Services discovery failed for device {deviceID}”, 301: “Included services discovery failed for device {deviceID} and service: {serviceUUID}”, 302: “Service {serviceUUID} for device {deviceID} not found”, 303: “Services not discovered for device {deviceID}”, 400: “Characteristic discovery failed for device {deviceID} and service {serviceUUID}”, 401: “Characteristic {characteristicUUID} write failed for device {deviceID} and service {serviceUUID}”, 402: “Characteristic {characteristicUUID} read failed for device {deviceID} and service {serviceUUID}”, 403: “Characteristic {characteristicUUID} notify change …d for device {deviceID} and service {serviceUUID}”, 404: “Characteristic {characteristicUUID} not found”, 405: “Characteristics not discovered for device {deviceID} and service {serviceUUID}”, 406: “Cannot write to characteristic {characteristicUUID} with invalid data format: {internalMessage}”, 500: “Descriptor {descriptorUUID} discovery failed for d…viceUUID} and characteristic {characteristicUUID}”, 501: “Descriptor {descriptorUUID} write failed for devic…viceUUID} and characteristic {characteristicUUID}”, 502: “Descriptor {descriptorUUID} read failed for device…viceUUID} and characteristic {characteristicUUID}”, 503: “Descriptor {descriptorUUID} not found”, 504: “Descriptors not discovered for device {deviceID}, …viceUUID} and characteristic {characteristicUUID}”, 505: “Cannot write to descriptor {descriptorUUID} with invalid data format: {internalMessage}”, 506: “Cannot write to descriptor {descriptorUUID}. It’s …y iOS and therefore forbidden on Android as well.”, 600: “Cannot start scanning operation”, 601: “Location services are disabled”} _eventEmitter: NativeEventEmitter {_subscriber: EventSubscriptionVendor, _nativeModule: {…}} _uniqueId: 0
and when things went well log is
_activePromises: 9: ƒ (reason) proto: Object _activeSubscriptions: 8: {remove: ƒ} proto: Object _errorCodesToMessagesMapping: {0: “Unknown error occurred. This is probably a bug! Check reason property.”, 1: “BleManager was destroyed”, 2: “Operation was cancelled”, 3: “Operation timed out”, 4: “Operation was rejected”, 5: “Invalid UUIDs or IDs were passed: {internalMessage}”, 100: “BluetoothLE is unsupported on this device”, 101: “Device is not authorized to use BluetoothLE”, 102: “BluetoothLE is powered off”, 103: “BluetoothLE is in unknown state”, 104: “BluetoothLE is resetting”, 105: “Bluetooth state change failed”, 200: “Device {deviceID} connection failed”, 201: “Device {deviceID} was disconnected”, 202: “RSSI read failed for device {deviceID}”, 203: “Device {deviceID} is already connected”, 204: “Device {deviceID} not found”, 205: “Device {deviceID} is not connected”, 206: “Device {deviceID} could not change MTU size”, 300: “Services discovery failed for device {deviceID}”, 301: “Included services discovery failed for device {deviceID} and service: {serviceUUID}”, 302: “Service {serviceUUID} for device {deviceID} not found”, 303: “Services not discovered for device {deviceID}”, 400: “Characteristic discovery failed for device {deviceID} and service {serviceUUID}”, 401: “Characteristic {characteristicUUID} write failed for device {deviceID} and service {serviceUUID}”, 402: “Characteristic {characteristicUUID} read failed for device {deviceID} and service {serviceUUID}”, 403: “Characteristic {characteristicUUID} notify change …d for device {deviceID} and service {serviceUUID}”, 404: “Characteristic {characteristicUUID} not found”, 405: “Characteristics not discovered for device {deviceID} and service {serviceUUID}”, 406: “Cannot write to characteristic {characteristicUUID} with invalid data format: {internalMessage}”, 500: “Descriptor {descriptorUUID} discovery failed for d…viceUUID} and characteristic {characteristicUUID}”, 501: “Descriptor {descriptorUUID} write failed for devic…viceUUID} and characteristic {characteristicUUID}”, 502: “Descriptor {descriptorUUID} read failed for device…viceUUID} and characteristic {characteristicUUID}”, 503: “Descriptor {descriptorUUID} not found”, 504: “Descriptors not discovered for device {deviceID}, …viceUUID} and characteristic {characteristicUUID}”, 505: “Cannot write to descriptor {descriptorUUID} with invalid data format: {internalMessage}”, 506: “Cannot write to descriptor {descriptorUUID}. It’s …y iOS and therefore forbidden on Android as well.”, 600: “Cannot start scanning operation”, 601: “Location services are disabled”} _eventEmitter: NativeEventEmitter {_subscriber: EventSubscriptionVendor, _nativeModule: {…}} _scanEventSubscription: null _uniqueId: 9 proto: Object
it seems the BleManager’s
_activePromisesand_activeSubscriptionsare different. I marked with bold text.P.S. It occurs very frequently in iOS(higher than 13.3.1) not in Andorid.