Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

Batteriezustand von einem Bluetooth LE Gerät auslesen

  Alt 24. Aug 2022, 13:51
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;
  Mit Zitat antworten Zitat