ブルートゥース低エネルギー心拍数サーバー
GATTサービスのセットアップとアドバタイズ方法を示す例。この例では Qt Bluetooth周辺(スレーブ)機能に関連する Low Energy クラスの使用を示しています。
Bluetooth Low Energy Heart Rate Server は、Bluetooth GATT サーバーを開発する方法を示すコマンドライン・アプリケーションです。 Qt Bluetooth API.このアプリケーションでは、サービスの設定、広告、特性値の変更に関するクライアントへの通知について説明します。
この例では、以下の Qt クラスを使用しています:
- QLowEnergyAdvertisingData
- QLowEnergyAdvertisingParameters
- QLowEnergyServiceData
- QLowEnergyCharacteristicData
- QLowEnergyDescriptorData
- QLowEnergyController
- QLowEnergyService
このサンプルはサーバーアプリケーションを実装しており、グラフィカルユーザーインターフェースを持ちません。つまり、このサンプルはサーバーアプリケーションを実装しており、グラフィカルユーザーインターフェイスはありません。
Bluetooth許可のチェック
アプリケーションがサービスを作成し、広告を開始する前に、アプリケーションがBluetoothの使用許可を持っているかどうかをチェックする必要があります。
auto permissionStatus = app.checkPermission(QBluetoothPermission{});
ブルートゥース使用許可のリクエスト
Bluetoothの許可ステータスが未確定の場合、Bluetoothの使用許可をリクエストする必要があります。
if(permissionStatus==Qt::PermissionStatus::Undetermined) { となります。 qInfo("Requesting Bluetooth permission ..."); app.requestPermission(QBluetoothPermission{}, [&permissionStatus](constQPermissionパーミッション qApp->exit(); permissionStatus=permission.status(); });// ここで、許可リクエストが解決されるのを待つ。app.exec(); }
広告データとパラメータの設定
広告プロセスを設定するには、2つのクラスを使用する:
- QLowEnergyAdvertisingData はブロードキャストされる情報を指定する。
- QLowEnergyAdvertisingParameters は、広告間隔の設定や接続を許可するデバイスの制御など、特定の局面で使用されます。
この例では、デフォルトのパラメータを使用する。
QLowEnergyAdvertisingData に含まれる情報は、現在スキャン中の他のデバイスにも見える。この情報を使って、接続を確立するかどうかを決めることができます。この例では、当社が提供するサービスのタイプ、当社のデバイスを人間に適切に説明する名前、およびデバイスの送信パワー・レベルを含めています。後者は、潜在的な顧客にとって役に立つことが多い。なぜなら、顧客は、受信した信号強度と広告された信号強度を比較することで、当社のデバイスがどの程度離れているかを知ることができるからだ。
注: 広告データのスペースは非常に限られているので(合計31バイトのみ)、デバイス名のような可変長のデータはできるだけ短くする必要があります。
QLowEnergyAdvertisingData advertisingData; advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral); advertisingData.setIncludePowerLevel(true); advertisingData.setLocalName("HeartRateServer"); advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid::ServiceClassUuid::HeartRate);
サービスデータの設定
次に、提供したいサービスの種類を設定する。ここでは、Bluetooth仕様で定義されているHeart Rate サービスを最小限の形、つまりHeart Rate Measurement 特性のみで構成される形で使用する。この特性は、Notify プロパティをサポートする必要があり(その他はサポートしない)、Client Characteristic Configuration 記述子を持つ必要があります。この記述子は、クライアントが特性値の変更について通知を受けるために登録することを可能にします。心拍数の初期値は、いずれにせよ読み取ることができないので、ゼロに設定する(クライアントが値を取得できる唯一の方法は、通知を介することである)。
QLowEnergyCharacteristicData charData; charData.setUuid(QBluetoothUuid::CharacteristicType::HeartRateMeasurement); charData.setValue(QByteArray(2, 0)); charData.setProperties(QLowEnergyCharacteristic::Notify); const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration, QByteArray(2, 0)); charData.addDescriptor(clientConfig); QLowEnergyServiceData serviceData; serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::HeartRate); serviceData.addCharacteristic(charData);
広告と着信接続のリスニング
これですべてのデータがセットアップされたので、広告を開始できる。まず、peripheral role にQLowEnergyController オブジェクトを作成し、それを使って(静的な)QLowEnergyServiceData から(動的な)QLowEnergyService オブジェクトを作成する。そして、QLowEnergyController::startAdvertising ()を呼び出す。QLowEnergyAdvertisingData 最初の引数は実際の広告データとして機能し、2番目の引数はスキャン応答データとして機能する。最初の引数は実際の広告データとして機能し、2番目の引数はスキャン応答データとして機能する。これらは異なる情報を転送することもできるが、ここではその必要はない。また、QLowEnergyAdvertisingParameters のデフォルトで構築されたインスタンスも渡す。なぜなら、デフォルトの広告パラメータでよいからである。クライアントが広告されたサービ スに興味を持ったら、デバイスへの接続を確立することができる。接続が確立されると、デバイスは広告を停止し、QLowEnergyController::connected()シグナルが発信される。
注意: クライアントが切断すると、広告は自動的に再開されない。そのようにしたい場合は、QLowEnergyController::disconnected ()シグナルに接続し、それぞれのスロットでQLowEnergyController::startAdvertising ()を呼び出す必要がある。
boolerrorOccurred= false;conststd::unique_ptr<QLowEnergyController> leController(QLowEnergyController::createPeripheral());autoerrorHandler= [&leController, &errorOccurred](QLowEnergyController::Error errorCode) { エラーコード qWarning().noquote().nospace() << errorCode << " occurred: " << leController->errorString();if(errorCode!= QLowEnergyController:RemoteHostClosedError){。 qWarning("Heartrate-server quitting due to the error."); errorOccurred= true; QCoreApplication::quit(); } };QObject::connect(leController.get(), &QLowEnergyController::errorOccurred,errorHandler); std::unique_ptr<QLowEnergyService> service(leController->addService(serviceData)); leController->startAdvertising(QLowEnergyAdvertisingParameters(),advertisingData,advertisingData);if(errorOccurred)return -1;
心拍数の提供
ここまではいい。しかし、クライアントはどうやって実際に心拍数を取得するのだろうか?これは、上記のコード・スニペットでQLowEnergyController から受け取ったQLowEnergyService オブジェクトの各特性の値を定期的に更新することで実現する。通常、心拍数のソースは何らかのセンサーになるはずだが、この例では60から100の間で振動する値を作るだけだ。以下のコード・スニペットで最も重要なのは、QLowEnergyService::writeCharacteristic への呼び出しです。現在クライアントが接続しており、前述のClient Characteristic Configuration
に書き込むことで通知を有効にしている場合、新しい値について通知を受けることができます。
QTimer heartbeatTimer; quint8 currentHeartRate = 60; enum ValueChange { ValueUp, ValueDown } valueChange = ValueUp; const auto heartbeatProvider = [&service, ¤tHeartRate, &valueChange]() { QByteArray value; value.append(char(0)); // Flags that specify the format of the value. value.append(char(currentHeartRate)); // Actual value. QLowEnergyCharacteristic characteristic = service->characteristic(QBluetoothUuid::CharacteristicType::HeartRateMeasurement); Q_ASSERT(characteristic.isValid()); service->writeCharacteristic(characteristic, value); // Potentially causes notification. if (currentHeartRate == 60) valueChange = ValueUp; else if (currentHeartRate == 100) valueChange = ValueDown; if (valueChange == ValueUp) ++currentHeartRate; else --currentHeartRate; }; QObject::connect(&heartbeatTimer, &QTimer::timeout, heartbeatProvider); heartbeatTimer.start(1000);
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.