don/cordova-plugin-ble-central

Problem with bluno

Closed this issue · 19 comments

I am facing a strange behavior on ANDROID (13):
If i scan for all devices using scan with option, i see many devices(example my esp32 project based on NimBLE) but not my BLUNO beetle.
If use a third party app the devices are all visible also Bluno beetle! I can connect and read all the advertisement data and the names.
The same if i ask android to scan: i see all the devices!
What am i doing wrong?

Hi @eccessivo75

What is the scan command you're using? Are you seeing any errors logged in adb?

Hi and thank you for your answer:
command is : ble.startScan([], onScanSuccess, onScanFailure);
No errors in the console log.
This is part of the code:
`app.startScan = function()
{
app.disconnect();
app.devices = {};

var htmlString =		
'<img src="img/loader2.gif"width="30" height="30" ' +
'style="display:inline; vertical-align:middle">' +

'

Scanning...

';
$('#scanResultView').append($(htmlString));

$('#scanResultView').show();

function onScanSuccess(device)
{
    console.log(JSON.stringify(device));
	if (device.name != null)
	{
		app.devices[device.address] = device;

		console.log(
			'Found: ' + device.name + ', ' +
			device.address + ', ' + device.rssi);

		var htmlString = 			
			'<div class="deviceContainer"><ons-button modifier="large outline" onclick="app.connectTo(\'' +
			device.address + '\')">'+device.name+'</ons-button></div>'

		$('#scanResultView').append($(htmlString));
	}
}

function onScanFailure(errorCode)
{
	// Show an error message to the user
	app.disconnect('Failed to scan for devices.');

	// Write debug information to console.
	console.log('Error ' + errorCode);
}	

ble.startScan([], onScanSuccess, onScanFailure);
$('#startView').hide();
};`

I can add a weird behavior: if i use the app "ble serial" on my phone (iphone12) , i can see and clone Bluno.
If i start advertising from the clone , that clone is visible from ble central.. while the original still no

You've got a filter there to only report devices that have a name... are you certain that the Bluno device is named? Do you get any console logs of the stringified device there?

You are coorect about names .
For debug purpose i am stringify the device data before any parsing on the names.
What i get is a list of a variable number of stations (4 to 7 ), The most without names but only the id . The most are not connectable devices. i try take a screen shot.

Does the Bluno device has a specific service UUID you can use to scan for just that kind of device?

i scan for a specific local name (HEFMXV1.1). Also i am able to connect the clone.
IMG_8115

@eccessivo75 I wonder if this applies to what you're seeing here: #979 (comment)

I try it now it will take some minutes because i am using cordova with monaca cloud service. What i miss is how to exclude this permission android:usesPermissionFlags="neverForLocation" since i can't edit android manifest from my config.xml or i get compilation errors.
It was my normal policy in the past but after the upgrade to cordova CLI 12 it is simply not possible.
Anyway when i start scanning i get a pop up asking for the run time permissions ...

For your first test, I'd just open the cordova app in Android studio and modify it directly to see what happens 🙂

Thank you but i have to improve my confidence with android studio...
About the problem it seems really to be what you mentioned but i am still having the same problem.
Opening the ApK in android studio i can see that in thefile manifest.xml there is no mention of neverForLocation.
I think that the problem could be that i am not using the @slim version of the lib

I really feel like stupid:
If i type the suggested command cordova plugin add cordova-plugin-ble-central@slim i get this error:
Cannot find plugin.xml for plugin "cordova-plugin-ble-central". Please try adding it again.
I can install other third party plugins

@eccessivo75 have you tried removing the plugin first? I'm not getting this problem when I try the same on a clean project?

Thank you, yes i first removed it and then installed. i copy below the text from my command prompt :
C:\hefmx113>cordova plugin list
cordova-custom-config 5.1.1 "cordova-custom-config"
cordova-plugin-ble-central 1.7.2 "BLE"
cordova.plugins.diagnostic 7.1.4 "Diagnostic"

C:\hefmx113>cordova plugin remove cordova-plugin-ble-central
Uninstalling cordova-plugin-ble-central from android
Subproject Path: CordovaLib
Subproject Path: app
Removing "cordova-plugin-ble-central"
Removing cordova-plugin-ble-central from package.json

i can confirm the same here. I will investigate further

Actually i am not able to get rid of this. So frustrating.
I was able to use the slim version of the plugin and follow all the steps to solve as mentioned in #979.
i edit the xml, compilation goes fine, at run time i am requested with a pop up to approve the runtime permission and i consent.
but, if i include in the xml permission neverforlocation i can see many BT station but not Bluno . As mentioned in #979 i omitted neverforlocation but ,this time scan result are completely empty! In both cases cordova diagnostic shows CONNECT and SCAN permissions as granted. Ideas?

Hi , i am now able to see the device after i added a runtime request for access fine location using diagnostic plugin. Bless to @peitschie for any help provided. I will share any further consideration here

@eccessivo75 nice detective work! It's still strange that all this was needed. What phone model and Android version was this on, out of interest?

@peitschie thank you! it's a galaxy tab s7 fe model sm-t733
Android 13 updated on 29 nov
For me has been more painful to work it out since i am using Monaca cloud service.
@peitschie pointed me in the right direction : #979 was the reason why i was not able to see bluno.
So for the one that are struggling as i was here is (not maybe the perfect) solution:
I installed the cordova-plugin-ble-central@slim. Monaca is not able to install the slim version by its own, so you have to download it (maybe there is a direct link... i used instead cordova CLI on my computer), created a zip archive, then uploaded the archive as a custom plugin in monaca plugin manager.
in config.xml add:

<config-file target="AndroidManifest.xml" parent="/manifest">
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
        <uses-permission android:name="android.permission.BLUETOOTH_SCAN"  />
        <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    </config-file>

Then you need to ask the runtime permission for the fine location. I used, cordova diagnostic plugin and inside my "app.js" file in the device ready event handler at the very first place i added:

cordova.plugins.diagnostic.requestRuntimePermission(function(status){
    switch(status){
        case cordova.plugins.diagnostic.permissionStatus.GRANTED:
            console.log("Permission granted to use the bt");
            break;
        case cordova.plugins.diagnostic.permissionStatus.NOT_REQUESTED:
            console.log("Permission to use the bt has not been requested yet");
            break;
        case cordova.plugins.diagnostic.permissionStatus.DENIED_ONCe:
            console.log("Permission denied to use the bt - ask again?");
            break;
        case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
            console.log("Permission permanently denied to use the bt!");
            break;
    }
}, function(error){
    console.error("The following error occurred: "+error);
}, cordova.plugins.diagnostic.permission.ACCESS_FINE_LOCATION);