Arbeiten mit ThingConnect-Geräten

Aus IoT
Wechseln zu: Navigation, Suche

Go Up to ThingConnect


Befolgen Sie die folgenden Anleitungen, um ein Bluetooth LE-Gerät in Ihrer Anwendung zu verwenden.

Verbinden mit den Geräten

Um eine Verbindung mit einem Bluetooth LE-Gerät in Ihrer Anwendung herzustellen, müssen Sie Folgendes ausführen:

  1. Ziehen Sie eine TBluetoothDeviceDiscoveryManager-Komponente auf das Formular.
  2. Ziehen Sie die entsprechende Komponente für das Bluetooth LE-Gerät auf das Formular.
  3. Setzen Sie im Objektinspektor die Eigenschaft DiscoveryManager der Bluetooth LE-Komponente auf den TBluetoothDeviceDiscoveryManager.
  4. Legen Sie den entsprechenden Ermittlungsmechanismus in der Eigenschaft DiscoveryMethod des TBluetoothDeviceDiscoveryManager fest.
  5. Um das Gerät zu verbinden, müssen Sie die Methode DiscoverDevices des TBluetoothDeviceDiscoveryManager aufrufen.
    Delphi:
      FDiscoveryManager.DiscoverDevices;
    
    C++:
      FDiscoveryManager->DiscoverDevices();
    
  6. Nach dem Herstellen der Verbindung mit dem Gerät wird das Ereignis OnDeviceConnected der entsprechenden Komponente aufgerufen.
  7. Fügen Sie die folgenden Units in die uses-Klausel der Anwendung ein:
    • Iot.Family.BluetoothLE.GattTypes
    • Die benutzerdefinierte Unit Types (wenn die Komponente benutzerdefinierte Datentypen definiert).

Festlegen der Ermittlungsmechanismusmethode

Die Ermittlungsmechanismusmethode der Bluetooth LE-Geräte in Ihrer Anwendung können Sie mit einer der beiden folgenden Aktionen festlegen:

  • Verwenden Sie im Objektinspektor die Eigenschaft DiscoveryMethod.
  • Legen Sie den Ermittlungsmechanismus programmseitig durch Aufrufen der Methode DiscoverDevices fest:
Delphi:
  {$IF Defined(WIN32) or Defined(WIN64)}
  FDiscoveryManager.DiscoveryMethod := TDiscoveryMethod.Connect;
  {$ELSE}
  FDiscoveryManager.DiscoveryMethod := TDiscoveryMethod.ScanResponse;
  {$EndIf}
C++:
  #ifdef _Windows
	FDiscoveryManager->DiscoveryMethod = TDiscoveryMethod::Connect;
  #else
	FDiscoveryManager->DiscoveryMethod = TDiscoveryMethod::ScanResponse;
  #endif
  • Hinweis: Bei Anwendungen für 32-Bit-Windows- und 64-Bit-Windows-Plattformen müssen Sie Connect als Ermittlungsmethodentyp festlegen.
Warnung: Einige Geräte senden ihren Namen oder ihre Dienste in den bereitgestellten Daten. Sie müssen stattdessen die Ermittlungsmethode Connect verwenden und den Namen des Geräts, mit dem eine Verbindung hergestellt werden soll, manuell angeben.

Verwenden der Ermittlungsmechanismusmethode ScanResponseAllDevices

Wenn Sie mit der Ermittlungsmechanismusmethode ScanResponseAllDevices die Verbindung mit einem bestimmten Gerät herstellen, müssen Sie den Namen des DiscoveredDevice aus der Liste abrufen.

  1. Implementieren Sie die Ereignisbehandlungsroutine OnGenericHeartRateMonitor1DeviceListDiscovered, um die Liste der ermittelten Geräte abzurufen. In diesem Codebeispiel werden die ermittelten Geräte einer TListBox hinzugefügt.
    Delphi:
    procedure TForm1.GenericHeartRateMonitor1DeviceListDiscovered(const Sender: TObject; const ADiscoveredDeviceCount: Integer);
    var
      I: Integer;
    begin
      for I := 0 to ADiscoveredDeviceCount - 1 do
        ListBox1.Items.Add(GenericHeartRateMonitor1.DiscoveredDevice[I].DeviceName);
    end;
    
    C++:
    void __fastcall TForm1::GenericHeartRateMonitor1DeviceListDiscovered(TObject * const Sender, const int ADiscoveredDeviceCount)
    {
    	for (int I = 0; I < ADiscoveredDeviceCount; I++) {
    		ListBox1->Items->Add() = GenericHeartRateMonitor1->DiscoveredDevice[I]->DeviceName;
    	}
    }
    
  2. Stellen Sie mit der Methode ConnectDevice eine Verbindung mit dem ausgewählten DiscoveredDevice her. Dieser Eintrag wird aus der TListBox abgerufen.
    Delphi:
    procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem);
    begin
      GenericHeartRateMonitor1.ConnectDevice(GenericHeartRateMonitor1.DiscoveredDevice[Item.Index]);
    end;
    
    C++:
    void __fastcall TForm1::ListBox1ItemClick(TCustomListBox * const Sender, TListBoxItem * const Item)
    {
      TBluetoothLEDevice *LDevice;
      LDevice = GenericHeartRateMonitor1->DiscoveredDevice[AItem->Index];
      GenericHeartRateMonitor1->ConnectDevice(LDevice);
    }
    

Lesen von Eigenschaftsdaten

Um den Datenwert einer Eigenschaft zu lesen, müssen Sie die Methode Refresh aufrufen und die Ereignisbehandlungsroutine des Ereignisses implementieren.

Um beispielsweise den Datenwert der Eigenschaft BatteryLevel zu lesen, fügen Sie den folgende Code hinzu:

Delphi:
procedure TForm1.ReadPropertyClick(Sender: TObject);
begin
  ZephyrHeartRateMonitor.RefreshBatteryLevel;
end;
C++:
void __fastcall TForm1::ReadPropertyClick(TObject *Sender) {
	ZephyrHeartRateMonitor1->RefreshBatteryLevel();
}

Implementieren Sie die Ereignisbehandlungsroutine des Ereignisses OnBatteryLevelUpdate:

uses
Iot.Family.BluetoothLE.GattTypes, Iot.Device.ZephyrHeartRateMonitorTypes;

var BatteryLevelText : UnicodeString;

procedure TForm1.ZephyrHeartRateMonitorBatteryLevelUpdate(Sender: TObject; Value: Byte);
begin
  BatteryLevelText := IntToStr(Value) + '%';
end;

C++:

  • Fügen Sie in die .h-Datei die uses-Klausel ein:
#include <Iot.Family.BluetoothLE.GattTypes.hpp>
#include <Iot.Device.ZephyrHeartRateMonitorTypes.hpp>
  • In der .cpp-Datei:
void __fastcall TForm1::ZephyrHeartRateMonitor1BatteryLevelUpdate (TObject *Sender, BYTE Value) {
	BateryLevel = IntToStr(Value) + "%";
}

Abonnieren eines Merkmals

Um ein Merkmal zu abonnieren, müssen Sie die Methode Subscribe des Merkmals aufrufen.

Um beispielsweise das Merkmal Heart Rate Measurement zu abonnieren, fügen Sie den folgenden Code hinzu:

Delphi:
procedure TForm1.HRMSubscribeBtnClick(Sender: TObject);
begin
  ZephyrHeartRateMonitor.SubscribeHeartRateMeasurement;
end;
C++:
void __fastcall TForm1::HRMSubscribeBtnClick(TObject *Sender) {
	FZephyrHeartRateMonitor->SubscribeHeartRateMeasurement();
}

Empfangen von Datenaktualisierungen

Um den Empfang von Datenaktualisierungen von einem abonnierten Merkmal zu starten, müssen Sie die Ereignisbehandlungsroutine des Ereignisses implementieren.

Um beispielsweise Aktualisierungen der Herzfrequenzmessungen zu erhalten, implementieren Sie die Ereignisbehandlungsroutine des Ereignisses OnHeartRateMeasurementUpdate wie folgt:

Delphi:
uses
Iot.Family.BluetoothLE.GattTypes, Iot.Device.ZephyrHeartRateMonitorTypes;

var HRMValueText : UnicodeString;

procedure TForm1.ZephyrHeartRateMonitorHeartRateMeasurementUpdate(Sender: TObject; const Value: TGattHeartRateMeasurement);
begin
  HRMValueText := 'HR: ' + IntToStr(Value.HeartRateMeasurement) + 'bpm RRInterval: ' + IntToStr(Value.RRInterval) + ' EnergyExp: ' + IntToStr(Value.EnergyExpended) + ' Contact: ' + IntToStr(Ord(Value.ContactStatus));
end;
C++:

In der .h-Datei:

#include <Iot.Family.BluetoothLE.GattTypes.hpp>
#include <Iot.Device.ZephyrHeartRateMonitorTypes.hpp>

In der .cpp-Datei:

void __fastcall TForm1::FZephyrHeartRateMonitorHeartRateMeasurementUpdate(TObject *Sender,
		  const TGattHeartRateMeasurement &Value)
{
    TGattHeartRateMeasurement Ghrm = Value;
    HRMValueText = "HR: " + IntToStr(Ghrm.HeartRateMeasurement) + " bpm RRInterval : " + IntToStr(Ghrm.RRInterval) + " EnergyExp : " + IntToStr(Ghrm.EnergyExpended) + " Contact:" + IntToStr((int)Ghrm.ContactStatus);
}

Aufheben des Abonnements eines Merkmals

Um das Abonnement eines Merkmals aufzuheben, müssen Sie die Methode Unsubscribe dieses Merkmals aufrufen.

Um beispielsweise das Abonnement des Merkmals Heart Rate Measurement aufzuheben, fügen Sie den folgenden Code hinzu:

Delphi:
procedure TForm1.HRMUnSubscribeBtnClick(Sender: TObject);
begin
  ZephyrHeartRateMonitor.UnsubscribeHeartRateMeasurement;
end;
C++:
void __fastcall TForm1::HRMUnSubscribeBtnClick(TObject *Sender) {
	FZephyrHeartRateMonitor->UnsubscribeHeartRateMeasurement();
}

Schreiben in ein Merkmal

Um in ein Merkmal zu schreiben, müssen Sie die entsprechende Eigenschaft der Komponente festlegen. Verwenden Sie dazu die Methode Create des Merkmals, übergeben Sie die benötigten Werte, und setzen Sie dann das Merkmal auf die Werte.

Um beispielsweise die Lichtfarbe des Yeelight Blue Light Leuchtmittels zu aktualisieren, müssen Sie die Eigenschaft ControlCharacter der Komponente festlegen. Fügen Sie den folgenden Code hinzu, um in diese Eigenschaft zu schreiben:

Delphi:
procedure TForm1.SetColorClick(Sender: TObject);
var
  LColor: TAlphaColor;
  LControl: TControlCharacter;
  LIntensity: Integer;
begin
  LIntensity := 80;
  LColor := claOrange; //System.UITypes.TAlphaColor
  LControl := TControlCharacter.Create(LColor, LIntensity, TLEDCommand.ColorCommand);
  YeelightBlue1.ControlCharacter := LControl;
end;
C++:
void __fastcall TForm1::SetColorClick(TObject *Sender)
{
  TAlphaColor LColor;
  int LIntensity;
  LIntensity = 80;
  LColor =   TAlphaColor(claGreen); //System.UITypes.TAlphaColor
  TControlCharacter LControl = TControlCharacter(LColor, LIntensity, TLEDCommand::ColorCommand);
  YeelightBlue1->ControlCharacter = LControl;
}

Fehlerbehandlung

Bei der Verbindung zu dem Gerät können verschiedene Fehler auftreten, die Sie behandeln müssen:

Fehler Komponente Beschreibung
OnDiscoveryError TBluetoothDeviceDiscoveryManager Der Manager kann kein Gerät mit diesem Typ finden.
OnDiscoveryError Bluetooth LE-Komponente Die Komponente kann das Gerät nicht finden.

Siehe auch