Hallo,
wir haben hier ein kleines Gerät welches per Bluetooth LE mit einem Windows 10 Rechner verbunden wird. Mir ist aufgefallen das in den Windows Einstellungen der Zustand der Batterie des Gerätes angezeigt wird. Da habe ich mich gefragt ob ich nicht in einer eigenen Software das auch machen kann. Um evtl. in der Software darauf reagieren zu können. Bisher hatte ich mich noch überhaupt nicht mit dem Thema Bluetooth und Delphi beschäftigt.
Ich habe dann nach etwas Recherche und viel probieren es zumindest hinbekommen das Gerät zu identifizieren, jedoch bekomme ich die Info zum Batteriezustand nicht.
Unter anderem habe ich diese Webseite
https://www.andreasjakl.com/read-bat...th-le-devices/ gefunden, auf der Schritt für Schritt das ganze erklärt wird. Leider nicht in Delphi sondern einer anderen Sprache. Und irgendwie hapert es mit dem Auslesen des Wertes.
In einer Testanwendung habe ich auf das Formular eine TBluetoothLE Komponente gepackt und 'Enabled' auf 'True' gesetzt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
BATService: TBluetoothUUID = '{0000180F-0000-1000-8000-00805F9B34FB}';
BATLevel: TBluetoothUUID = '{00002A19-0000-1000-8000-00805F9B34FB}';
var
Index: Integer;
Idx: Integer;
i: Integer;
begin
if BluetoothLE1.DiscoverDevices(4000) then
begin
Memo2.Lines.Add('Anzahl Geräte: '+BluetoothLE1.CurrentManager.AllDiscoveredDevices.Count.ToString);
if BluetoothLE1.CurrentManager.AllDiscoveredDevices.Count > 0 then
begin
for Index := 0 to BluetoothLE1.CurrentManager.AllDiscoveredDevices.Count-1 do
begin
with BluetoothLE1.CurrentManager.AllDiscoveredDevices.Items[Index] do
begin
//Das gewünschte Gerät "auswählen"
if Copy(DeviceName,1,4) = 'BLE_' then
begin
Memo2.Lines.Add('Identifier: '+Identifier);
Memo2.Lines.Add('DeviceName: '+DeviceName);
Memo2.Lines.Add('Paired: '+BoolToStr(Paired, True));
Memo2.Lines.Add('IsConnected: '+BoolToStr(IsConnected, True));
Memo2.Lines.Add(EmptyStr);
//Wenn Gerät verbunden ist, Batteriezustand ermitteln...
if IsConnected then
begin
if DiscoverServices then
begin
for Idx := 0 to Services.Count-1 do
begin
//Battery Service
if Services.Items[Idx].UUID = BATService then
begin
Memo2.Lines.Add('UUID: '+Services.Items[Idx].UUIDName+' ('+Services.Items[Idx].UUID.ToString+')');
Memo2.Lines.Add('Characteristics.Count: '+Services.Items[Idx].Characteristics.Count.ToString);
for i := 0 to Services.Items[Idx].Characteristics.Count-1 do
begin
Memo2.Lines.Add('Characteristic UUID:'+Services.Items[Idx].Characteristics.Items[i].UUIDName+' ('+Services.Items[Idx].Characteristics.Items[i].UUID.ToString+')');
//Battery Level
if Services.Items[Idx].Characteristics.Items[i].UUID = BATLevel then
begin
with Services.Items[Idx].Characteristics.Items[i] do
begin
if TBluetoothProperty.Read in Properties then
begin
Memo2.Lines.Add('Value.Count: '+Length(Value).ToString); //!!! Value ist leer es enthält keine Bytes !!!
end;{if}
end;{with}
end;{if}
end;{for}
Memo2.Lines.Add(EmptyStr);
end;{if}
end;{if}
end
else
ShowMessage('DiscoverServices failed');
end;{if IsConnected}
end;{if}
end;{with}
end;{for}
end
else
ShowMessage('No devices found!');
end
else
ShowMessage('Discover failed');
end;