12,925
回編集
(→使用例) |
(→使用例) |
||
792行目: | 792行目: | ||
<br> | <br> | ||
==== 使用例 ==== | ==== 使用例 ==== | ||
===== ローカルデバイスの初期化 ===== | |||
BLEデバイスを利用するため、QBluetoothLocalDeviceクラスを使用して初期化する。<br> | |||
初期化時にBLEデバイスが有効かどうかの確認を行う。<br> | |||
<br> | |||
* QBluetoothLocalDeviceクラス | |||
* QBluetoothAddressクラス | |||
<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <QBluetoothLocalDevice> | |||
#include <QBluetoothAddress> | |||
QBluetoothLocalDevice localDevice; | |||
if (!localDevice.isValid()) { | |||
qDebug() << "Bluetoothデバイスが利用できません"; | |||
return; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
===== ペアリング状態の変化を監視 ===== | |||
ペアリングの結果を受信すため、<code>QBluetoothLocalDevice::pairingFinished</code>シグナルに接続する。<br> | |||
これにより、ペアリング成功 / 失敗の通知を受け取ることができる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
connect(&localDevice, &QBluetoothLocalDevice::pairingFinished, [](const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing) { | |||
if (pairing == QBluetoothLocalDevice::Paired) { | |||
qDebug() << "ペアリング成功:" << address.toString(); | |||
} | |||
else { | |||
qDebug() << "ペアリング失敗:" << address.toString(); | |||
} | |||
}); | |||
</syntaxhighlight> | |||
<br> | |||
===== PINコード確認のシグナル (必要な場合のみ) ===== | |||
PINコードが必要なデバイスは、<code>BluetoothLocalDevice::pairingDisplayConfirmation</code>シグナルに接続する。<br> | |||
これにより、PINコードの確認が必要な場合に通知を受け取ることができる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
connect(&localDevice, &QBluetoothLocalDevice::pairingDisplayConfirmation, [](const QBluetoothAddress &address, QString pin) { | |||
qDebug() << "PINコード確認: " << address.toString() << pin; | |||
}); | |||
</syntaxhighlight> | |||
<br> | |||
===== ペアリング要求 ===== | |||
ペアリングを開始するため、ペアリングするデバイスのBluetoothアドレスを指定して、<code>QBluetoothLocalDevice::requestPairing</code>メソッドを実行する。<br> | |||
<br> | |||
ペアリングの結果は、<code>QBluetoothLocalDevice::pairingFinished</code>シグナルで受信して、成功 / 失敗に応じた処理を行う。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
QBluetoothAddress targetAddress("XX:XX:XX:XX:XX:XX"); // 接続先アドレス | |||
localDevice.requestPairing(targetAddress, QBluetoothLocalDevice::Paired); | |||
</syntaxhighlight> | |||
<br> | |||
===== 組み合わせ ==== | |||
<syntaxhighlight lang="c++"> | |||
// BLEデバイスとのペアリング操作を管理するクラス | |||
// ペアリングの開始と解除, ペアリング状態の監視, PINコード認証 | |||
#include <QObject> | #include <QObject> | ||
#include <QBluetoothLocalDevice> | #include <QBluetoothLocalDevice> | ||
#include <QBluetoothAddress> | #include <QBluetoothAddress> | ||
#include <QDebug> | #include <QDebug> | ||
804行目: | 860行目: | ||
private: | private: | ||
QBluetoothLocalDevice localDevice; // ローカルのBLEデバイスを管理するオブジェクト | |||
// ペアリング状態を表す文字列 | |||
QString getPairingStatusString(QBluetoothLocalDevice::Pairing status) | QString getPairingStatusString(QBluetoothLocalDevice::Pairing status) | ||
{ | { | ||
814行目: | 871行目: | ||
default: return "不明な状態"; | default: return "不明な状態"; | ||
} | } | ||
} | |||
// BLEデバイスが使用可能な状態かどうかを確認 | |||
bool isDeviceReady() const | |||
{ | |||
if (!localDevice || !localDevice->isValid()) return false; | |||
return localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff; | |||
} | |||
// BLEデバイスのホストモードを設定 | |||
void setHostMode(QBluetoothLocalDevice::HostMode mode) | |||
{ | |||
if (isDeviceReady()) localDevice.setHostMode(mode); | |||
} | |||
// ホスト側においてBLEが利用可能かどうかを確認 | |||
bool isBluetoothAvailable() const | |||
{ | |||
return QBluetoothLocalDevice::allDevices().count() > 0; | |||
} | } | ||
public: | public: | ||
explicit BLEPairing(QObject* parent = nullptr) : QObject(parent) | explicit BLEPairing(QObject *parent = nullptr) : QObject(parent) | ||
{ | { | ||
try { | try { | ||
// シグナルの接続 | // シグナルの接続 | ||
connect(localDevice | connect(&localDevice, &QBluetoothLocalDevice::pairingFinished, this, &BLEPairing::onPairingFinished); | ||
connect(localDevice | connect(&localDevice, &QBluetoothLocalDevice::error, this, &BLEPairing::onError); | ||
connect(localDevice | connect(&localDevice, &QBluetoothLocalDevice::pairingDisplayConfirmation, this, &BLEPairing::onPairingDisplayConfirmation); | ||
connect(localDevice | connect(&localDevice, &QBluetoothLocalDevice::pairingDisplayPinCode, this, &BLEPairing::onPairingDisplayPinCode); | ||
} | } | ||
catch (const std::exception &e) { | catch (const std::exception &e) { | ||
835行目: | 908行目: | ||
} | } | ||
// | ~BLEPairing() | ||
{ | |||
if (localDevice) { | |||
disconnect(&localDevice); // 全ての接続を解除 | |||
} | |||
} | |||
// 指定したデバイスとのペアリングを開始 | |||
// 30秒のタイムアウトを設定 (失敗時はエラーを通知) | |||
void requestPairing(const QBluetoothAddress &address) | void requestPairing(const QBluetoothAddress &address) | ||
{ | { | ||
try { | try { | ||
if (! | if (!isDeviceReady()) { | ||
emit errorOccurred("ローカルBluetoothデバイスが無効です"); | emit errorOccurred("ローカルBluetoothデバイスが無効です"); | ||
return; | return; | ||
} | } | ||
// タイムアウトの設定 | |||
QTimer::singleShot(30000, this, [this, address]() { | |||
if (getPairingStatus(address) != QBluetoothLocalDevice::Paired) { | |||
emit errorOccurred("ペアリングがタイムアウトしました"); | |||
} | |||
}); | |||
qDebug() << "ペアリングを開始: " << address.toString(); | qDebug() << "ペアリングを開始: " << address.toString(); | ||
localDevice | localDevice.requestPairing(address, QBluetoothLocalDevice::Paired); | ||
} | } | ||
catch (const std::exception &e) { | catch (const std::exception &e) { | ||
emit errorOccurred("ペアリング開始時に予期せぬエラーが発生しました"); | |||
} | } | ||
} | } | ||
// | // 指定したBLEデバイスとのペアリングを解除 | ||
void removePairing(const QBluetoothAddress& address) | void removePairing(const QBluetoothAddress& address) | ||
{ | { | ||
try { | try { | ||
if (!localDevice | if (!localDevice.isValid()) { | ||
emit errorOccurred("ローカルBluetoothデバイスが無効"); | emit errorOccurred("ローカルBluetoothデバイスが無効"); | ||
return; | return; | ||
864行目: | 950行目: | ||
qDebug() << "ペアリングを解除: " << address.toString(); | qDebug() << "ペアリングを解除: " << address.toString(); | ||
localDevice | localDevice.requestPairing(address, QBluetoothLocalDevice::Unpaired); | ||
} | } | ||
catch (const std::exception &e) { | catch (const std::exception &e) { | ||
873行目: | 959行目: | ||
} | } | ||
// | // 指定したBLEデバイスとのペアリング状態を確認 | ||
QBluetoothLocalDevice::Pairing getPairingStatus(const QBluetoothAddress &address) | QBluetoothLocalDevice::Pairing getPairingStatus(const QBluetoothAddress &address) | ||
{ | { | ||
try { | try { | ||
if (!localDevice | if (!localDevice.isValid()) { | ||
emit errorOccurred("ローカルBluetoothデバイスが無効"); | emit errorOccurred("ローカルBluetoothデバイスが無効"); | ||
return QBluetoothLocalDevice::Unpaired; | return QBluetoothLocalDevice::Unpaired; | ||
} | } | ||
return localDevice | return localDevice.pairingStatus(address); | ||
} | } | ||
catch (const std::exception &e) { | catch (const std::exception &e) { | ||
893行目: | 979行目: | ||
signals: | signals: | ||
void pairingComplete(const QBluetoothAddress& address, bool success); | void pairingComplete(const QBluetoothAddress& address, bool success); // ペアリング完了通知 | ||
void pairingConfirmationRequired(const QBluetoothAddress& address, QString pin); | void pairingConfirmationRequired(const QBluetoothAddress& address, QString pin); // PIN確認要求通知 | ||
void errorOccurred(const QString& error); | void errorOccurred(const QString& error); // エラー通知 | ||
private slots: | private slots: | ||
// ペアリング完了時 | |||
void onPairingFinished(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing) | void onPairingFinished(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing) | ||
{ | { | ||
905行目: | 992行目: | ||
} | } | ||
// BLEエラー発生時 | |||
void onError() | void onError() | ||
{ | { | ||
QString errorMsg = " | QBluetoothLocalDevice::Error error = localDevice->error(); | ||
qDebug() << errorMsg; | QString errorMsg; | ||
switch (error) { | |||
case QBluetoothLocalDevice::NoError: | |||
errorMsg = "エラーなし"; | |||
break; | |||
case QBluetoothLocalDevice::PairingError: | |||
errorMsg = "ペアリングエラー"; | |||
break; | |||
case QBluetoothLocalDevice::UnknownError: | |||
default: | |||
errorMsg = "不明なエラー"; | |||
break; | |||
} | |||
qDebug() << "Bluetoothエラー: " << errorMsg; | |||
emit errorOccurred(errorMsg); | emit errorOccurred(errorMsg); | ||
} | } | ||
// ペアリング時のPIN確認要求処理 | |||
void onPairingDisplayConfirmation(const QBluetoothAddress &address, QString pin) | void onPairingDisplayConfirmation(const QBluetoothAddress &address, QString pin) | ||
{ | { | ||
920行目: | 1,024行目: | ||
} | } | ||
// PINコード表示要求時 | |||
void onPairingDisplayPinCode(const QBluetoothAddress &address, QString pin) | void onPairingDisplayPinCode(const QBluetoothAddress &address, QString pin) | ||
{ | { |