Describe the bug
On web platform, when requestDevice is used like this:
const peripheral = await BleClient.requestDevice({
namePrefix : "abc"
});
It works fine. But after manufacturerData filter is added:
const peripheral = await BleClient.requestDevice({
namePrefix : "abc",
manufacturerData: [{
companyIdentifier : 0x02FF,
dataPrefix : new Uint8Array([0x00]),
mask : new Uint8Array([0x00])
}]
});
the namePrefix is ignored, at least for devices which have the requested manufacturerData.
I believe there's a bug here:
https://github.com/steinerjakob/bluetooth-le/blob/c6453910e383212a9aca3aa11a92e7e644332b99/src/web.ts#L381
private getFilters(options?: RequestBleDeviceOptions): BluetoothLEScanFilter[] {
const filters: BluetoothLEScanFilter[] = [];
for (const service of options?.services ?? []) {
filters.push({
services: [service],
name: options?.name,
namePrefix: options?.namePrefix,
});
}
if ((options?.name || options?.namePrefix) && filters.length === 0) {
filters.push({
name: options.name,
namePrefix: options.namePrefix,
});
}
for (const manufacturerData of options?.manufacturerData ?? []) {
filters.push({
manufacturerData: [manufacturerData],
// !!!! my note: missing name and namePrefix here !!!!!
});
}
return filters;
}
I think the filter for manufacturerData should also contain the fields name and namePrefix, the same as the services filter does.
My theory is that filters are applied in OR fashion. It's not very clear from the documentation. I think that currently, requestDevice will find all devices which have these manufacturerData OR this namePrefix, which effectively ignores namePrefix for devices with the requested manufacturerData.
Expected behavior
Both nameFilter and manufacturerData filters should be applied in an "AND" fashion. This is how it works - to my knowledge - on iOS and Android.
Plugin version:
- @capacitor-community/bluetooth-le: 7.1.1
Desktop (please complete the following information):
- OS: MacOS Sonoma 14.7.6
- Browser: Chrome
- Version 139.0.7258.139 (Official Build) (arm64)
Additional context
Introduced in #752 I believe.
Describe the bug
On web platform, when
requestDeviceis used like this:It works fine. But after
manufacturerDatafilter is added:the
namePrefixis ignored, at least for devices which have the requestedmanufacturerData.I believe there's a bug here:
https://github.com/steinerjakob/bluetooth-le/blob/c6453910e383212a9aca3aa11a92e7e644332b99/src/web.ts#L381
I think the filter for
manufacturerDatashould also contain the fieldsnameandnamePrefix, the same as theservicesfilter does.My theory is that
filtersare applied in OR fashion. It's not very clear from the documentation. I think that currently,requestDevicewill find all devices which have thesemanufacturerDataOR thisnamePrefix, which effectively ignoresnamePrefixfor devices with the requestedmanufacturerData.Expected behavior
Both
nameFilterandmanufacturerDatafilters should be applied in an "AND" fashion. This is how it works - to my knowledge - on iOS and Android.Plugin version:
Desktop (please complete the following information):
Additional context
Introduced in #752 I believe.