Android では、セントラル ロールとしての Bluetooth Low Energy(BLE)に対する組み込みプラットフォームのサポートが提供されており、アプリでデバイスの検出、サービスのクエリ、情報の送信に使用できる API が用意されています。
一般的なユースケースは次のとおりです。
- 近くにあるデバイス間で少量のデータを転送する。
- 近接センサーと連携して、ユーザーの現在地に基づいてカスタマイズされたエクスペリエンスを提供します。
従来の Bluetooth とは対照的に、BLE は消費電力を大幅に削減できるように設計されています。これにより、近接センサー、心拍数モニター、フィットネス デバイスなど、電力要件が厳しい BLE デバイスとアプリが通信できるようになります。
注意: ユーザーが BLE を使用してデバイスを別のデバイスとペア設定すると、2 つのデバイス間で通信されるデータは、ユーザーのデバイス上のすべてのアプリからアクセス可能になります。
そのため、アプリが機密データをキャプチャする場合は、アプリレイヤ セキュリティを実装して、そのデータのプライバシーを保護する必要があります。
基本情報
BLE 対応デバイス間でデータを送信するには、まず通信チャネルを形成する必要があります。Bluetooth LE API を使用するには、マニフェスト ファイルで複数の権限を宣言する必要があります。アプリが Bluetooth を使用する権限を取得したら、BluetoothAdapter
にアクセスして、デバイスで Bluetooth を使用できるかどうかを判断する必要があります。Bluetooth を使用できる場合は、デバイスが近くの BLE デバイスをスキャンします。デバイスが検出されると、BLE デバイスの GATT サーバーに接続して BLE デバイスの機能が検出されます。接続が確立されると、利用可能なサービスと特性に基づいて、接続されたデバイスとデータを転送できます。
主な用語と概念
BLE の主要な用語とコンセプトは次のとおりです。
- Generic Attribute Profile(GATT)
- GATT プロファイルは、BLE リンクを介して「属性」と呼ばれる短いデータの送受信に関する一般的な仕様です。現在の BLE アプリ プロファイルはすべて GATT をベースにしています。詳しくは、GitHub の Android BluetoothLeGatt サンプルをご覧ください。
- プロフィール
- Bluetooth SIG は、BLE デバイス用の多くのプロファイルを定義しています。プロファイルは、特定のアプリでデバイスがどのように動作するかを指定します。デバイスに複数のプロファイルを実装できます。たとえば、デバイスに心拍数モニターとバッテリー レベル検出機能を搭載できます。
- 属性プロトコル(ATT)
- GATT は、属性プロトコル(ATT)上に構築されています。これは GATT/ATT とも呼ばれます。ATT は、BLE デバイスで動作するように最適化されています。そのため、可能な限り少ないバイト数で処理します。各属性は、Universally Unique Identifier(UUID)によって一意に識別されます。UUID は、情報を一意に識別するために使用される、標準化された 128 ビット形式の文字列 ID です。ATT によって転送される属性は、特性とサービスとしてフォーマットされます。
- 特性
- 特性には、単一の値と、特性の値を記述する 0 ~ n 個の記述子が含まれます。特性は、クラスに似た型と考えることができます。
- 記述子
- 記述子は、特徴値を記述する定義済み属性です。たとえば、記述子には、人間が読み取り可能な説明、特性値の許容範囲、特性値に固有の測定単位を指定できます。
- サービス
- サービスは特性の集合です。たとえば、「心拍数モニター」というサービスに「心拍数測定」などの特性を含めることができます。既存の GATT ベースのプロファイルとサービスのリストは、bluetooth.org で確認できます。
役割と責任
デバイスが BLE デバイスと通信する際の役割と責任は、次の 2 つの方法で分類されます。
セントラルとペリフェラルこれは BLE 接続自体に適用されます。つまり、中心的な役割のデバイスがスキャンしてアドバタイズを探し、ペリフェラル ロールのデバイスがアドバタイズします。ペリフェラル ロールのみをサポートする 2 つのデバイスは相互に通信できません。また、セントラル ロールのみをサポートする 2 つのデバイスも相互に通信できません。
GATT サーバー対 GATT クライアント。これにより、2 つのデバイスが接続を確立した後に相互に通信する方法が決まります。クライアント ロールのデバイスがデータのリクエストを送信し、サーバー ロールのデバイスがリクエストを処理します。
セントラル ペリフェラルとサーバー クライアントのロール分割の違いを理解するには、Android スマートフォンと、センサーデータをスマートフォンに報告する BLE 対応のアクティビティ トラッカーがある場合の例を考えてみましょう。
スマートフォン(中央デバイス)が BLE デバイスをアクティブにスキャンします。アクティビティ トラッカー(ペリフェラル デバイス)がアドバタイズし、接続リクエストを受信するのを待ちます。
スマートフォンとアクティビティ トラッカーが接続を確立すると、GATT メタデータの相互転送が開始されます。この場合、スマートフォンで実行されているアプリがデータのリクエストを送信するため、GATT クライアントとして機能します。アクティビティ トラッカーはこれらのリクエストを処理するため、GATT サーバーとして機能します。
アプリの別の設計では、スマートフォンが GATT サーバーとして機能する場合があります。詳細については、BluetoothGattServer
をご覧ください。