「Qtの基礎 - Bluetooth Low Energy」の版間の差分
(→概要) |
|||
45行目: | 45行目: | ||
<u>ソフトウェアの要件 (データ量、通信頻度、電力消費等) に応じて適切な方式を選択する必要がある。</u><br> | <u>ソフトウェアの要件 (データ量、通信頻度、電力消費等) に応じて適切な方式を選択する必要がある。</u><br> | ||
<u>また、多くのモダンなBluetoothデバイスはBLEを採用する傾向にあり、特に省電力性が重要な場合はBLEが推奨される。</u><br> | <u>また、多くのモダンなBluetoothデバイスはBLEを採用する傾向にあり、特に省電力性が重要な場合はBLEが推奨される。</u><br> | ||
<br> | |||
<u>※開発時の注意</u><br> | |||
<u>BLEはClassic Bluetoothと基本的な手順は同じであるが、BLEは独自のアーキテクチャと概念を持っており、より細かな制御と状態管理が必要となる。</u><br> | |||
<u>特に、省電力性を重視する場合は、以下に示す特徴を理解して実装することが重要となる。</u><br> | |||
* 状態管理 | |||
*: BLEは状態遷移が多いため、適切な状態管理が重要となる。 | |||
*: 各操作のタイミングと順序に注意が必要である。 | |||
* エラーハンドリング | |||
** 接続切断 | |||
** タイムアウト | |||
** 権限の問題 (特に、モバイル環境) | |||
* パフォーマンス考慮 | |||
** データサイズの制限 (MTU) | |||
** 通信頻度の最適化 | |||
** バッテリー消費の管理 | |||
* プラットフォーム固有の考慮 | |||
** OSごとの権限設定 | |||
** バックグラウンド動作の制限 | |||
** スキャンフィルタの設定 | |||
<br><br> | <br><br> | ||
2024年11月18日 (月) 06:02時点における版
概要
QtのBluetoothサポートは、Qt Bluetoothモジュールを通じて提供されている。
Qt Bluetoothモジュールは、クロスプラットフォームなBluetooth通信機能を実現するための包括的なAPIセットとなっている。
主要なコンポーネントとして、Classic BluetoothとBluetooth Low Energy (BLE) の両方をサポートしている。
- Classic Bluetooth
- 従来型の高帯域幅通信
- BLE
- 省電力デバイスとの通信
デバイスの検出と管理において、Qt Bluetoothモジュールは以下に示す機能を提供している。
- デバイススキャンと検出
- サービスディスカバリ
- ペアリング管理
- 接続の確立と維持
上記の機能は相互に関連しており、アプリケーションでは以下に示すような流れで使用される。
- まず、デバイススキャンを行い、周囲のデバイスを探索する。
- 目的のデバイスが存在する場合、サービスディスカバリでそのデバイスの機能を確認する。
- 次に、必要に応じてペアリングを実行する。
- 最後に、接続を確立してデータ通信を開始する。
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が推奨される。
※開発時の注意
BLEはClassic Bluetoothと基本的な手順は同じであるが、BLEは独自のアーキテクチャと概念を持っており、より細かな制御と状態管理が必要となる。
特に、省電力性を重視する場合は、以下に示す特徴を理解して実装することが重要となる。
- 状態管理
- BLEは状態遷移が多いため、適切な状態管理が重要となる。
- 各操作のタイミングと順序に注意が必要である。
- エラーハンドリング
- 接続切断
- タイムアウト
- 権限の問題 (特に、モバイル環境)
- パフォーマンス考慮
- データサイズの制限 (MTU)
- 通信頻度の最適化
- バッテリー消費の管理
- プラットフォーム固有の考慮
- OSごとの権限設定
- バックグラウンド動作の制限
- スキャンフィルタの設定
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
クラスでより複雑なサービス階層を管理する。
キャラクタリスティックとディスクリプタの概念が追加されている。