Bluetooth LE の使用

提供: RAD Studio
移動先: 案内検索

Bluetooth の使用 への移動


Bluetooth コア仕様では、バージョン 4.0 以降、Bluetooth Low Energy(Bluetooth LE)などの異なる種類の "Bluetooth" プロトコルが定義されているため、元の Bluetooth プロトコルは現在 "クラシック Bluetooth"(従来の Bluetooth)と呼ばれています。

Bluetooth LE(ブランド名は Bluetooth Smart)は、転送データ量と消費電力が少ないデバイスのための新しい環境を提供します。

アプリケーションに標準サービスの Bluetooth LE サポートを実装するには:

プラットフォーム サポート

プラットフォーム Bluetooth LE
クライアント サーバー

Windows(*)

10 以上

10 以上(**)

macOS

10.7 以上

10.9 以上

iOS

5 以上

6 以上

Android

4.3 以上

5 以上

メモ: Windows Server は Bluetooth をサポートしていません(「Windows での Bluetooth の汎用サポート」を参照)。
メモ: WinRT Bluetooth API は、メーカー固有データ用のフィールドを使用して BLE 広告データをサポートしていますが、GATT サーバー機能は完全には実装されていません。
注意: Windows 10 より前の Windows プラットフォーム上で稼働するアプリケーションでは、Bluetooth LE をサポートしていません。

GATT(汎用属性プロファイル)プロファイル

プロファイルは、アプリケーションでの標準サービスの使用方法を高レベルで定義したものです。たとえば、健康管理アプリケーションに使用される Heart Rate(心拍数)プロファイルがあります。心拍数センサを備えたサーバー デバイスから標準の Heart Rate サービスが公開されているため、Bluetooth LE クライアントでは、そのサービスを検出しデータ(たとえば拍動数/分など)の収集を開始します。

GATT プロファイルは、サービスとキャラクタリスティックを組み合わせたものです。

GATT プロファイルの公式ページは Bluetooth 開発者向けポータルの[GATT Specifications|Profiles]ページです。

TBluetoothLE コンポーネントの配置

新しい TBluetoothLE コンポーネントを使用すると、サーバー アプリケーションとクライアント アプリケーションに RTL の Bluetooth LE 機能を実装できます。

TBluetoothLE では、System.Bluetooth ユニットをアプリケーションに組み込み、TBluetoothLEManager.Current を内部的に呼び出して TBluetoothLEManager のインスタンスを取得します。TBluetoothLEManager は Bluetooth LE による通信の主要クラスです。

メモ: TBluetoothLEManager.Current は、常に TBluetoothLEManager の同じインスタンスを返します。TBluetoothLEManager のインスタンスは複数必要はありません。

デバイスの検出

BluetoothLE の動作はクラシック Bluetooth とは異なり、デバイスをペアにする必要はありません。Bluetooth LE クライアントでは Bluetooth LE サーバーを検出する必要があります。

メモ:
  • Windows 10 より前の Windows プラットフォーム上で稼働するアプリケーションでは、BluetoothLE サーバーを発見する前に、デバイスをペアリングする必要があります。 詳細については、「Windows Bluetooth FAQ」を参照してください。
  • Windows 10+ に対する WinRT API プラットフォームでは、それらをペアリングする必要なく、デバイスをスキャンすることができます。

DiscoverDevices メソッドを使用すると、Bluetooth LE サーバーを検出できます。

procedure DoScan;
const 
  HeartRateService: TBluetoothUUID = '{0000180D-0000-1000-8000-00805F9B34FB}';
begin
  BluetoothLE1.DiscoverDevices(2500) // The parameter is the timeout in milliseconds. 
  BluetoothLE1.DiscoverDevices(2500, [HRService]) // It only exposes devices with the Heart Rate service to the BluetoothLE client.
end;

この時間の経過後、OnEndDiscoverDevices イベントが発生します。デバイスをいったん検出したら、以下に説明するように、標準プロファイルからのサービスやキャラクタリスティックの取得を開始できます。

スキャン フィルタの使用

RTL では、新しい BLE 低消費電力チップを利用した BLE スキャン フィルタ実装を提供しています。

カスタマイズした非依存のスキャン フィルタを使用して、具体的な BLE デバイスをスキャンすることができます。手順は以下のとおりです。

procedure DoScanWithFilter;
const 
  HeartRateService: TGUID = '{0000180D-0000-1000-8000-00805F9B34FB}';
var
  ABLEAdvertisedDataFilter: TBluetoothLEScanFilter;
  ABLEAdvertisedDataFilterList: TBluetoothLEScanFilterList;
begin
  ABLEAdvertisedDataFilter:= TBluetoothLEScanFilter.Create;
  ABLEAdvertisedDataFilterList:= TBluetoothLEScanFilterList.Create;
  ABLEAdvertisedDataFilter.ServiceUUID:= HeartRateService; 
  ABLEAdvertisedDataFilterList.Add(ABLEAdvertisedDataFilter);

  BluetoothLE1.CurrentManager.StartDiscovery(2500,ABLEAdvertisedDataFilterList);
end;

サービスとキャラクタリスティック

サービスの検出と取得

サービスは他のサービスとの関係とキャラクタリスティックの集まりで、デバイスの構成要素の動作をカプセル化したものです。

GATT プロファイルには、番号で識別される標準サービスが 1 つ以上含まれています。たとえば、Heart Rate サービスには "0x180D" という公式番号が割り当てられています。

標準サービスの公式ページは Bluetooth 開発者向けポータルの[GATT Specifications|Services]ページです。

サービスを取得するには、完全な UUID を使用する必要があります。これは、標準サービスの割り当て番号と Bluetooth の基本番号を連結したものです。たとえば、Heart Rate サービスの完全な識別子は 0000180D-0000-1000-8000-00805F9B34FB です。

DiscoverServices メソッドを使用すると、特定のデバイスに対するサービスを検知することができます。サービスが検知されると、OnServicesDiscovered イベントが発生します。

サービスを検出したら、それらを取得する必要があります。GetServices メソッドを使用すると、デバイスから提供されるサービスのリストを取得でき、GetService メソッドを使用すると、デバイスから提供される特定のサービスを取得できます。

キャラクタリスティックの検出と取得

1 つのサービスには、その特定のサービスの情報を提供するキャラクタリスティックが 1 つ以上含まれています。それぞれのキャラクタリスティックは公式番号で識別されます。たとえば、Heart Rate サービスには、心拍数を測定するためのキャラクタリスティック Heart Rate Measurement(UUID は 00002A37-0000-1000-8000-00805F9B34FB)と、センサの位置を特定するための別のキャラクタリスティック Body Sensor Location(UUID は 00002A38-0000-1000-8000-00805F9B34FB)があります。

GetCharacteristics メソッドを使用すると、特定のサービスのキャラクタリスティック リストを取得でき、GetCharacteristic メソッドを使用すると、特定のキャラクタリスティックの情報を取得できます。

キャラクタリスティックの読み取り、書き込み、サブスクライブ

GetCharacteristic を使っていったんキャラクタリスティックを取得したら、含まれている情報の読み取りや(可能な場合は)書き込みを行うことができます。キャラクタリスティックの読み取り後に OnCharacteristicRead イベントのハンドラが呼び出されます。

キャラクタリスティックの現在値を取得するには、ReadCharacteristic メソッドを使用します。WriteCharacteristic メソッドを使用すると、サーバー上で可能な場合には、キャラクタリスティックの値を書き込むことができます。

また、キャラクタリスティックをサブスクライブして、それが変更されるたびに情報を取得することもできます。たとえば、心拍数センサの監視を開始するには、GetCharacteristic を使って現在値を読み取ったあと、SubscribeToCharacteristic メソッドを使用して、値の変更時に情報を取得できるようにすることができます。監視を停止するには、UnSubscribeToCharacteristic メソッドを使用します。

受信したデータの処理

クライアント デバイスでは、サーバーからデータ列を受信します。このデータを判読可能な情報に変換するには、GATT プロファイルの仕様に従います。たとえば、Heart Rate Measurement キャラクタリスティックのデータ パッケージの詳細については、Heart Rate Measurement のデータ パッケージ構造に関する公式ページを参照できます。

たとえば、Heart Rate Measurement キャラクタリスティックの第 1 バイトには、Bluetooth LE パッケージで転送されるデータに関する情報を表すフラグが格納されています。Flags フィールドのビット 0 では Heart Rate 値の形式(UINT8 または UINT16)が定義されています。その形式に応じて、データ パッケージの第 2 バイトまたは第 2 および第 3 バイトを抽出して、bpm(拍動数/分)を取得する必要があります。

Bluetooth LE サーバー

標準サービスを公開するサーバーを作成するには:

  1. プロジェクトに TBluetoothLE コンポーネントを配置します。
  2. GetGattServer メソッドを使用して、Bluetooth LE サービスを公開します。
  3. TBluetoothGattServer クラスの CreateService メソッドを使用して、標準の UUID でこのサービスを作成します。
  4. TBluetoothGattServer クラスの CreateCharacteristic メソッドを使用して、標準の UUID でこのサービスのキャラクタリスティックを作成します。
  5. AddService メソッドを使用して、このサービスを GATT サーバーに追加します。
  6. サーバーがクライアント デバイスから読み取り要求を受信すると、OnCharacteristicReadRequest イベントのハンドラが呼び出されます。
  7. サーバーがクライアント デバイスから書き込み要求を受信すると、OnCharacteristicWriteRequest イベントのハンドラが呼び出されます。

非標準プロファイル

GATT プロファイルを使用せずに Bluetooth LE 技術を使用して、サーバー アプリケーションおよびクライアント アプリケーションを作成できます。つまり、サーバー デバイスとクライアント デバイスの間でプライベート通信を行うための独自のサービスおよびキャラクタリスティックを作成できます。

非標準プロファイルを使用するには 128 ビットの UUID が必要で、それをランダムに生成しなければなりません。

GATT サーバーとして動作する Bluetooth LE デバイスはどれも皆、Device Name キャラクタリスティックと Appearance キャラクタリスティックを持つ公式の Generic Access サービスを実装する必要があります。詳細については、公式 Web サイトで Generic Access サービスを参照してください。

iOS におけるバックグラウンド実行のサポート

iOS アプリケーションで、一部のサービスをバックグラウンドで継続して実行する必要がある場合には、最終的なアプリケーションを配置する前に、[バージョン情報]ページで UIBackgroundModesProject キーの値を指定してください。

メモ: Bluetooth イベントが発生したときにアプリケーションを起こす必要があるなら、以下の文字列値を UIBackgroundModesProject キーに追加します:
  • bluetooth-central: アプリケーションが中心の役割である場合。
  • bluetooth-peripherical: アプリケーションが周辺機器の役割である場合。

詳細は、「Core Bluetooth Background Processing for iOS Apps」(iOS アプリケーション向けの Core Bluetooth のバックグラウンド処理)を参照してください。

関連項目