Hallo Philipp,
sorry, es kommt immer was dazwischen, aber jetzt ...
Es funktioniert bei mir, ich habe nur die UUID geändert
TBluetoothUUID = '{0000
FFB0-0000-1000-8000-00805F9B34FB}';
statt
TBluetoothUUID = '{0000
1818-0000-1000-8000-00805F9B34FB}';
Ich kann 1,2 Geräte finden und Listen, andere UUID's werden ignoriert.
Geschwindigkeit ist gleich (klar ich muss ja auch das 3500ms OnEndDiscoverDevices abwarten,
aber beim Scannen der Services könnte es dann schneller sein (weil schon vorgefiltert).
Trotzdem muss ich wohl auch beim Filter das Lesen der Services abwarten, bis ich verbinden kann.
Also Defakto wird das Vorfiltern wenig bringen, ausser etwas weniger Traffic beim EndDiscoverDevices.
Ich habe bei mir seit langem die Basis im Verdacht "
00805F9B34FB", weil diese als Grenze zwischen den GATT und den Custom UUID's fungiert.
Oft werden diese Default-Daten von einfachen Geräten nicht "customisiert", und ich finde z.B. zig Geräte mit der gleichen Forerunner UUID im Büro.
Da machen sich viele Hersteller anscheinend nicht die Mühe ein unique ID zu Erzeugen, wohl auch um Registrierungskosten zu Vermeiden.
Die Vermutung ist dass ein GATT Service Profil, wie dein CPS, als 16-Bit "1818" bei BT SIG registriert ist, und dann als 128-Bit wie oben konvertiert und benutzt werden kann.
Technisch ist es dann halt immer die Gleiche UUID, aber so sicher bin ich da nicht.
Meine Geräte entsprechen dann eigentlich keinem vor-registriertem GATT-Serive-Profil,
also z.B. FFB0, s.o., das liegt einfach im oberen, freien Bereich.
Es scheint aber in der Regel trotzdem zu funktionieren, egal ob BT SIG registrierte UUID, oder nicht.
Ich würde da eigentlich Probleme bei meiner UUID erwarten, wenn der Filter nur die registrierten UUIDs akzeptieren würde, das habe ich aber noch nicht gesehen.
Technisch habe ich nie Probleme damit gehabt, die 128Bit UUID wird immer erkannt, egal ob vordefinierte GATT oder nicht.
Manche Geräte geben da einfach keine oder eine falsche GATT Nr. an, das könnte mal zu Konflikten führen.
Ich habe auch Geräte die dann eine freie, Custom-Basis haben, also der 128-String ist komplett custom GUUID, auch das funktioniert ganz normal und ich meine so wäre das eigentlich gedacht.
Dein CPS Filter Profil ist aber als 16-Bit BT SIG registiert.
Wenn der ScanFilter bei registriertem 16-Bit CPS anders arbeitet, als bei nicht-registrierten ...
Dann hätten die Geräte wohl einen Registrierungs-Filter in den Scan-Filter gebaut, deshalb vermute ich das mal nicht.
Dagegen spricht auch dass ich Geräte mit der Basis '{0000
0000-0000-1000-8000-00805F9B34FB}' habe,
die sollten dann auch nicht arbeiten.
Vielleicht findest Du ja etwas in dier Richtung ?
Bin noch am Testen wie zuverlässig das jetzt mit der Erkennung ist, aber im Moment scheint es schnell
und sicher zu reagieren.
Benutzt Du in deiner App die FBluetoothManagerLE.StartDiscovery(, oder über System.Bluetooth.Components.TBluetoothLE.DiscoverS ervice( ?
Das sollte sich zwar gleich verhalten, weil es den gleichen Manager benutzt.
Edit:
Das .Free funktioniert, weil tief im BLE das entweder direkt benutzt oder kopiert wird.
Vielleicht ist da aber je nach
OS Version der Wurm drin ?
Delphi-Quellcode:
bluetoothLEDeviceTypeHelpList:=TBluetoothUUIDsList.create();
bluetoothLEDeviceTypeHelpList.add( TRAINER_SERVICE_WAHOO );
FBluetoothManagerLE.StartDiscovery(2000, bluetoothLEDeviceTypeHelpList);
bluetoothLEDeviceTypeHelpList.Free(); //<=========== .Free ===========
...
function TAndroidBluetoothLEAdapter.DoStartDiscovery(Timeout: Cardinal; const FilterUUIDList: TBluetoothUUIDsList;
const ABluetoothLEScanFilterList: TBluetoothLEScanFilterList): Boolean;
var
LServiceUuids: TJavaObjectArray<JUUID>;
LBluetoothLEScanFilterList: TBluetoothLEScanFilterList;
I: Integer;
begin
FBluetoothLEScanFilterList := nil;
LServiceUUIDs := BluetoothUUIDsListToJavaArrayUUID(FilterUUIDList);
if TOSVersion.Check(5) then
begin
if (FilterUUIDList <> nil) and (FilterUUIDList.Count > 0) then
begin
LBluetoothLEScanFilterList := TBluetoothLEScanFilterList.Create;
for I := 0 to FilterUUIDList.Count - 1 do
begin
LBluetoothLEScanFilterList.Add(TBluetoothLEScanFilter.Create);
LBluetoothLEScanFilterList[I].ServiceUUID := FilterUUIDList[I]; //<=========== Kopie ===========
end;
Result := DoStartDiscoveryRaw(LBluetoothLEScanFilterList);
end
else
Result := DoStartDiscoveryRaw(ABluetoothLEScanFilterList);
end
else
if LServiceUUIDs <> nil then
Result := FJAdapter.startLeScan(LServiceUUIDs, FLeCallback) //<=========== Benutzt mit Kopie ? ===========
else
begin
FBluetoothLEScanFilterList := ABluetoothLEScanFilterList;
Result := FJAdapter.startLeScan(FLeCallback);
end;
...
...
...
end;