Qtの基礎 - Bluetooth Low Energy

提供:MochiuWiki : SUSE, EC, PCB
2024年11月17日 (日) 10:38時点におけるWiki (トーク | 投稿記録)による版 (→‎サービスディスカバリ)
ナビゲーションに移動 検索に移動

概要

QtのBluetoothサポートは、Qt Bluetoothモジュールを通じて提供されている。
Qt Bluetoothモジュールは、クロスプラットフォームなBluetooth通信機能を実現するための包括的なAPIセットとなっている。

主要なコンポーネントとして、Classic BluetoothとBluetooth Low Energy (BLE) の両方をサポートしている。

  • Classic Bluetooth
    従来型の高帯域幅通信
  • BLE
    省電力デバイスとの通信


デバイスの検出と管理において、Qt Bluetoothモジュールは以下に示す機能を提供している。

  • デバイススキャンと検出
  • サービスディスカバリ
  • ペアリング管理
  • 接続の確立と維持


上記の機能は相互に関連しており、アプリケーションでは以下に示すような流れで使用される。

  1. まず、デバイススキャンを行い、周囲のデバイスを探索する。
  2. 目的のデバイスが存在する場合、サービスディスカバリでそのデバイスの機能を確認する。
  3. 次に、必要に応じてペアリングを実行する。
  4. 最後に、接続を確立してデータ通信を開始する。


Classic Bluetoothでの通信では、RFCOMMプロトコルを使用したシリアルポート型の通信が可能である。
これは QBluetoothSocketクラスを通じて実装されており、TCP/IPソケットに似た使い方ができる。

BLEについては、GATT (Generic Attribute Profile) プロトコルをベースとしたサービスとキャラクタリスティックの概念を使用する。
QLowEnergyControllerクラスがBLE通信の中心的な役割を果たしており、デバイスとの接続やデータのやり取りを管理する。

セキュリティ面においては、ペアリング、セキュアな接続の確立、暗号化等の機能が組み込まれている。
また、プラットフォーム固有のセキュリティ要件にも対応している。

実装する場合の注意点として、OSごとの権限設定や制限事項への対応が必要となる。
特に、モバイルプラットフォームでは適切な権限の設定が重要である。
また、Bluetooth機能の有無やステータスの確認も必要である。

エラーハンドリングについては、接続の切断、タイムアウト、デバイスが見つからない場合等、様々な状況に対応する必要がある。

Qt Bluetoothモジュールは、これらの状況を適切に検出して、シグナル / スロットメカニズムを通じて通知する仕組みを提供している。

※Bluetooth Low Energyを使用する場合の注意

  • サービスUUIDおよびキャラクタリスティックUUIDの理解が重要である。
  • データサイズの制限を考慮する必要がある。(一般的に20[byte]程度)
  • 非同期処理が基本となるため、シグナル/スロットの適切な設計が重要である。


ソフトウェアの要件 (データ量、通信頻度、電力消費等) に応じて適切な方式を選択する必要がある。
また、多くのモダンなBluetoothデバイスはBLEを採用する傾向にあり、特に省電力性が重要な場合はBLEが推奨される。


Bluetooth Low Energy (BLE) の特徴

BLEは、QLowEnergyControllerクラスを使用した通信である。

GATT (Generic Attribute Profile) プロトコルを使用しており、サービス、キャラクタリスティック、ディスクリプタという階層構造を持つ。

BLEは、Classic Bluetoothとは異なるアーキテクチャと通信モデルを採用しているため、別のAPIとクラスを使用する必要がある。
BLEで使用するQtクラスを、以下に示す。

  • QLowEnergyControllerクラス
    BLEデバイスとの接続を管理する。
  • QLowEnergyServiceクラス
    BLEサービスを表現する。
  • QLowEnergyCharacteristicクラス
    データの読み書きを行う最小単位


BLEでは、短いデータパケットの断続的な送受信する。
また、Notify / Indicateによる省電力なデータ更新を行う。


デバイススキャンと検出

デバイススキャンは、周囲のBluetooth対応デバイスを探索するプロセスである。
このプロセスでは、アクティブに電波を送信して応答を待つアクティブスキャン、他のデバイスからのアドバタイズメントを受信するパッシブスキャンの2種類がある。

  • アクティブスキャン
  • パッシブスキャン


BLEデバイスのスキャン中は、アドバタイズメントと呼ばれる特別なブロードキャストパケットを発信する。
このアドバタイズメントパケットには、以下に示す情報が含まれる。

  • デバイス名
  • メーカー固有データ
  • 提供するサービスのUUID
  • 電波強度 (RSSI)
  • その他のカスタムデータ


また、スキャン時間や範囲を設定可能であり、バッテリー消費とスキャン精度のバランスを取ることができる。

BLEでは、同様のQBluetoothDeviceDiscoveryAgentを使用するが、LowEnergyDiscoveryTimeoutの設定が必要となる。
また、フィルタリングでBLEデバイスのみを検出する。


サービスディスカバリ

特定のBluetoothデバイスが提供するサービスを探索するプロセスである。

BLEでは、GATT (Generic Attribute Profile) という階層構造を持つ。

  • サービス
    デバイスの機能をグループ化 (例: 心拍計測、温度センサ等)
  • キャラクタリスティック
    実際のデータ値や操作 (例: 心拍値、温度値、設定値等)
  • ディスクリプタ
    キャラクタリスティックの追加情報 (単位や説明等)


サービスディスカバリでは、これらの階層構造を探索して、利用可能な機能を特定する。
標準的なサービスには決められたUUIDが割り当てられている。(例: 心拍サービス、電池残量サービス等)

BLEでは、QLowEnergyServiceクラスでより複雑なサービス階層を管理する。
キャラクタリスティックとディスクリプタの概念が追加されている。