ThingConnect デバイスの操作

提供: IoT
移動先: 案内検索

Go Up to ThingConnect


アプリケーションで Bluetooth LE デバイスを使用するには、以下の手順に従う必要があります。

デバイスとの接続

アプリケーションで Bluetooth LE デバイスと接続するには、次の手順に従います。

  1. TBluetoothDeviceDiscoveryManager コンポーネントをドロップします。
  2. Bluetooth LE デバイスに対応するコンポーネントをドロップします。
  3. [オブジェクト インスペクタ]で、その Bluetooth LE コンポーネントの DiscoveryManager プロパティを TBluetoothDeviceDiscoveryManager に設定します。
  4. 適切な検出メカニズムを TBluetoothDeviceDiscoveryManagerDiscoveryMethod プロパティに設定します。
  5. 実際のデバイスに接続するには、TBluetoothDeviceDiscoveryManager のメソッド DiscoverDevices を呼び出す必要があります。
    Delphi の場合:
      FDiscoveryManager.DiscoverDevices;
    
    C++ の場合:
      FDiscoveryManager->DiscoverDevices();
    
  6. デバイスへの接続後、対応するコンポーネントの OnDeviceConnected イベントが呼び出されます。
  7. 次のユニットをアプリケーションの uses 句 に追加します。
    • Iot.Family.BluetoothLE.GattTypes
    • カスタムの Types ユニット(コンポーネントでカスタム データ型を定義している場合)

検出メカニズム メソッドを設定する

アプリケーションで Bluetooth LE デバイスの検出メカニズム メソッドを設定するには、次のいずれかを行います。

  • [オブジェクト インスペクタ]DiscoveryMethod プロパティを使用する。
  • DiscoverDevices メソッドを呼び出す前に、コードで次のように検出メカニズムを設定する。
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
  • メモ: 32 ビット Windows および 64 ビット Windows プラットフォームのアプリケーションの場合は、検出メソッド型として Connect を設定する必要があります。
警告: 一部のデバイスでは、アドバタイズされるデータで自分の名前やサービスをブロードキャストしません。その場合は、代わりに検出メソッド Connect を使用し、接続先のデバイスの名前を手動で設定する必要があります。

検出メカニズム メソッド ScanResponseAllDevices を使用する

検出メカニズム メソッド ScanResponseAllDevices を使用して指定のデバイスに接続する場合は、DiscoveredDevice の名前をリストから取得する必要があります。

  1. 検出されたデバイスのリストを取得するように OnGenericHeartRateMonitor1DeviceListDiscovered イベントのハンドラを実装します。以下のサンプル コードでは、検出されたデバイスが TListBox に追加されます。
    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. ConnectDevice メソッドを使用して、選択した DiscoveredDevice に接続します。この項目は TListBox から取得されます。
    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);
    }
    

プロパティ データの読み取り

プロパティのデータ値を読み取るには、Refresh 系メソッドを呼び出すと共に、イベントのイベント ハンドラを実装する必要があります。

たとえば、BatteryLevel プロパティのデータ値を読み取るには、次のコードを追加します。

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

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++ の場合:

  • .h ファイルに次の #include 文を追加します。
#include <Iot.Family.BluetoothLE.GattTypes.hpp>
#include <Iot.Device.ZephyrHeartRateMonitorTypes.hpp>
  • .cpp ファイルに次のコードを追加します。
void __fastcall TForm1::ZephyrHeartRateMonitor1BatteryLevelUpdate (TObject *Sender, BYTE Value) {
	BateryLevel = IntToStr(Value) + "%";
}

キャラクタリスティックのサブスクライブ

キャラクタリスティックをサブスクライブするには、そのキャラクタリスティックの Subscribe 系メソッドを呼び出す必要があります。

たとえば、Heart Rate Measurement(心拍数測定値)キャラクタリスティックをサブスクライブするには、次のコードを追加します。

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

データ更新の受信

サブスクライブしているキャラクタリスティックからのデータ更新の受信を開始するには、イベントのイベント ハンドラを実装する必要があります。

たとえば、心拍数測定値の更新を受信するには、OnHeartRateMeasurementUpdate イベントのイベント ハンドラを次のように実装します。

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++ の場合:

.h ファイルに次のコードを追加します。

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

.cpp ファイルに次のコードを追加します。

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);
}

キャラクタリスティックのサブスクライブ解除

キャラクタリスティックのサブスクライブを解除するには、そのキャラクタリスティックの Unsubscribe 系メソッドを呼び出す必要があります。

たとえば、Heart Rate Measurement(心拍数測定値)キャラクタリスティックのサブスクライブを解除するには、次のコードを追加します。

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

キャラクタリスティックへの書き込み

キャラクタリスティックに書き込むには、それに対応する、コンポーネントのプロパティを設定する必要があります。それには、そのキャラクタリスティックの Create メソッドを使用し、必要な値を引数に渡します。その後、それらの値をキャラクタリスティックに設定します。

たとえば、IoT 電球の色を更新するには、そのコンポーネントの ControlCharacter プロパティを設定する必要があります。このプロパティに書き込むには、次のコードを追加します。

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;
}

エラー処理

デバイスに接続している間は、次のように、処理しなければならないさまざまなエラーが発生する可能性があります。

エラー コンポーネント 説明
OnDiscoveryError TBluetoothDeviceDiscoveryManager マネージャが、指定された種類の近くのデバイスを検出できません。
OnDiscoveryError Bluetooth LE コンポーネント コンポーネントがデバイスを検出できません。

関連項目