「Qtの基礎 - Bluetooth Low Energy」の版間の差分

ナビゲーションに移動 検索に移動
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 <memory>
  #include <QDebug>
  #include <QDebug>
   
   
804行目: 860行目:
   
   
  private:
  private:
     std::unique_ptr<QBluetoothLocalDevice> localDevice;
     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 {
          // ローカルデバイスの初期化
          localDevice = std::make_unique<QBluetoothLocalDevice>(this);
           // シグナルの接続
           // シグナルの接続
           connect(localDevice.get(), &QBluetoothLocalDevice::pairingFinished, this, &BLEPairing::onPairingFinished);
           connect(&localDevice, &QBluetoothLocalDevice::pairingFinished, this, &BLEPairing::onPairingFinished);
           connect(localDevice.get(), &QBluetoothLocalDevice::error, this, &BLEPairing::onError);
           connect(&localDevice, &QBluetoothLocalDevice::error, this, &BLEPairing::onError);
           connect(localDevice.get(), &QBluetoothLocalDevice::pairingDisplayConfirmation, this, &BLEPairing::onPairingDisplayConfirmation);
           connect(&localDevice, &QBluetoothLocalDevice::pairingDisplayConfirmation, this, &BLEPairing::onPairingDisplayConfirmation);
           connect(localDevice.get(), &QBluetoothLocalDevice::pairingDisplayPinCode, this, &BLEPairing::onPairingDisplayPinCode);
           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 (!localDevice->isValid()) {
           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->requestPairing(address, QBluetoothLocalDevice::Paired);
           localDevice.requestPairing(address, QBluetoothLocalDevice::Paired);
       }
       }
       catch (const std::exception &e) {
       catch (const std::exception &e) {
           QString errorMsg = QString("ペアリング開始エラー: %1").arg(e.what());
           emit errorOccurred("ペアリング開始時に予期せぬエラーが発生しました");
          qDebug() << errorMsg;
          emit errorOccurred(errorMsg);
       }
       }
     }
     }
   
   
     // ペアリングを解除
     // 指定したBLEデバイスとのペアリングを解除
     void removePairing(const QBluetoothAddress& address)
     void removePairing(const QBluetoothAddress& address)
     {
     {
       try {
       try {
           if (!localDevice->isValid()) {
           if (!localDevice.isValid()) {
             emit errorOccurred("ローカルBluetoothデバイスが無効");
             emit errorOccurred("ローカルBluetoothデバイスが無効");
             return;
             return;
864行目: 950行目:
   
   
           qDebug() << "ペアリングを解除: " << address.toString();
           qDebug() << "ペアリングを解除: " << address.toString();
           localDevice->requestPairing(address, QBluetoothLocalDevice::Unpaired);
           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->isValid()) {
           if (!localDevice.isValid()) {
             emit errorOccurred("ローカルBluetoothデバイスが無効");
             emit errorOccurred("ローカルBluetoothデバイスが無効");
             return QBluetoothLocalDevice::Unpaired;
             return QBluetoothLocalDevice::Unpaired;
           }
           }
   
   
           return localDevice->pairingStatus(address);
           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 = "Bluetoothデバイスでエラーが発生";
      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)
     {
     {

案内メニュー