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

ナビゲーションに移動 検索に移動
381行目: 381行目:
<br>
<br>
Classic Bluetoothでは、<code>QBluetoothServiceInfo</code>クラスを使用して、単純なサービス情報を管理する。<br>
Classic Bluetoothでは、<code>QBluetoothServiceInfo</code>クラスを使用して、単純なサービス情報を管理する。<br>
<br>
==== Bluetoothサービスディスカバリの準備 ====
<code>QBluetoothServiceDiscoveryAgent</code>クラスのインスタンスを生成する。<br>
<br>
以下に示すシグナルを接続する。
* QBluetoothServiceDiscoveryAgent::serviceDiscovered
*: 発見したサービスを通知する。
* QBluetoothServiceDiscoveryAgent::finished
*: 探索完了を通知する。
* QBluetoothServiceDiscoveryAgent::error
*: エラー発生時の通知
<br>
<br>
<syntaxhighlight lang="c++">
#include <QBluetoothServiceDiscoveryAgent>
#include <QDebug>
QBluetoothServiceDiscoveryAgent discoveryAgent;
// シグナルとスロットの接続
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, [](const QBluetoothServiceInfo &info) {
    qDebug() << "サービス発見";
});
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, []() {
    qDebug() << "探索完了";
});
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::error, [](QBluetoothServiceDiscoveryAgent::Error error) {
    qDebug() << "エラー発生";
});
</syntaxhighlight>
<br>
==== サービスディスカバリの開始 ====
<code>QBluetoothAddress</code>クラスを使用して、対象デバイスのBluetoothアドレスを指定する。<br>
<br>
<code>QBluetoothServiceDiscoveryAgent::setRemoteAddress</code>メソッドを実行して、探索対象のデバイスを設定する。<br>
<code>QBluetoothServiceDiscoveryAgent::start</code>メソッドを実行して、ディスカバリを開始する。<br>
<br>
<syntaxhighlight lang="c++">
#include <QBluetoothAddress>
// デバイスのBluetoothアドレスを設定
QBluetoothAddress address("XX:XX:XX:XX:XX:XX");
discoveryAgent.setRemoteAddress(address);
// ディスカバリ開始
discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
</syntaxhighlight>
<br>
==== サービスの発見時 ====
<code>QBluetoothServiceDiscoveryAgent::serviceDiscovered</code>シグナルで通知された<code>QBluetoothServiceInfo</code>クラスから必要な情報を取得する。<br>
<br>
QBluetoothServiceInfoクラスでは、以下に示す情報が取得できる。<br>
<br>
これらの情報は、Bluetoothデバイスとの接続やサービスの詳細な把握に役立つ。<br>
ただし、全ての情報が必ず使用可能とは限らないため、デバイスやサービスの種類によっては取得できる情報が異なることに注意する。<br>
<br>
* サービスの基本情報
** serviceDescription()
**: サービスの説明文
** serviceName()
**: サービス名
** serviceProvider()
**: サービスプロバイダ名
** serviceUuid()
**: サービスのUUID
** serviceAvailability()
**: サービスの可用性 (0x00~0xFF)
*: <br>
* プロトコル関連
** protocolServiceMultiplexer()
**: プロトコルサービス多重化子 (PSM) 値
** serverChannel()
**: RFCOMMサーバチャンネル番号
** socketProtocol()
**: 使用されているソケットプロトコル (RFCOMM / L2CAP)
*: <br>
* サービスクラス情報
** serviceClassUuids()
**: サービスクラスのUUIDリスト
** serviceProvider()
**: サービスプロバイダ情報
*: <br>
* 接続関連
** device()
**: サービスを提供しているデバイス情報
** isComplete()
**: サービス情報が完全かどうか
** isRegistered()
**: サービスが登録されているかどうか
** isValid()
**: サービス情報が有効かどうか
*: <br>
* 属性関連
** attributes()
**: 全ての属性のリスト
** contains(quint16 attributeId)
**: 特定の属性の存在確認
** attribute(quint16 attributeId)
**: 特定の属性値の取得
*: <br>
* プロファイル関連
** majorServiceClass()
**: メジャーサービスクラス (オーディオ、電話等)
** minorServiceClass()
**: マイナーサービスクラス (詳細なサービス種別)
<br>
<syntaxhighlight lang="c++">
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, [](const QBluetoothServiceInfo &info) {
    // サービス名を取得
    QString name = info.serviceName();
    // UUIDを取得
    QBluetoothUuid uuid = info.serviceUuid();
    // プロトコルを取得
    int protocol = info.protocolServiceMultiplexer();
    qDebug() << "サービス名: " << name;
    qDebug() << "UUID: "    << uuid.toString();
    qDebug() << "プロトコル: " << protocol;
});
</syntaxhighlight>
<br>
==== 探索完了 または エラー時 ====
<code>QBluetoothServiceDiscoveryAgent::finished</code>シグナルで探索完了を検知する。<br>
<br>
<code>QBluetoothServiceDiscoveryAgent::error</code>シグナルでエラーを検知する。<br>
<br>
必要に応じて、<code>QBluetoothServiceDiscoveryAgent::stop</code>メソッドで探索を終了することも可能である。<br>
<br>
<syntaxhighlight lang="c++">
// 完了時の処理
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, []() {
    qDebug() << "探索が完了しました";
});
// エラー時の処理
connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::error, [](QBluetoothServiceDiscoveryAgent::Error error) {
    switch (error) {
      case QBluetoothServiceDiscoveryAgent::NoError:
          qDebug() << "エラーなし";
          break;
      case QBluetoothServiceDiscoveryAgent::PoweredOffError:
          qDebug() << "Bluetoothがオフです";
          break;
      default:
          qDebug() << "その他のエラー";
    }
});
// 探索を途中で停止する場合
discoveryAgent.stop();
</syntaxhighlight>
<br>
==== 組み合わせ ====
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <QBluetoothServiceDiscoveryAgent>
  #include <QBluetoothServiceDiscoveryAgent>
  #include <QBluetoothAddress>
  #include <QBluetoothAddress>
  #include <QDebug>
  #include <QDebug>
#include <memory>
   
   
  class ServiceDiscovery : public QObject
  class ServiceDiscovery : public QObject
393行目: 547行目:
   
   
  private:
  private:
     std::unique_ptr<QBluetoothServiceDiscoveryAgent> discoveryAgent;
     QBluetoothServiceDiscoveryAgent discoveryAgent;
   
   
     // プロトコルタイプを文字列に変換するヘルパー関数
     // プロトコルタイプ
     QString protocolToString(int protocol)
     QString protocolToString(int protocol)
     {
     {
407行目: 561行目:
     }
     }
   
   
     // エラーコードを文字列に変換するヘルパー関数
     // エラーコード
     QString errorToString(QBluetoothServiceDiscoveryAgent::Error error)
     QString errorToString(QBluetoothServiceDiscoveryAgent::Error error)
     {
     {
421行目: 575行目:
   
   
  public:
  public:
     explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent)
     explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent), discoveryAgent(this)
     {
     {
       try {
       // 各種シグナルとスロットの接続
          // サービス探索エージェントの作成
      connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, this, &ServiceDiscovery::onServiceDiscovered);
          discoveryAgent = std::make_unique<QBluetoothServiceDiscoveryAgent>(this);
      connect(&discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, this, &ServiceDiscovery::onScanFinished);
      connect(&discoveryAgent, static_cast<void(QBluetoothServiceDiscoveryAgent::*)(QBluetoothServiceDiscoveryAgent::Error)>(&QBluetoothServiceDiscoveryAgent::error),
          // 各種シグナルとスロットの接続
              this, &ServiceDiscovery::onError);
          connect(discoveryAgent.get(), &QBluetoothServiceDiscoveryAgent::serviceDiscovered, this, &ServiceDiscovery::onServiceDiscovered);
          connect(discoveryAgent.get(), &QBluetoothServiceDiscoveryAgent::finished, this, &ServiceDiscovery::onScanFinished);
          connect(discoveryAgent.get(), static_cast<void(QBluetoothServiceDiscoveryAgent::*)(QBluetoothServiceDiscoveryAgent::Error)>(&QBluetoothServiceDiscoveryAgent::error),
                  this, &ServiceDiscovery::onError);
      }
      catch (const std::exception &e) {
          qDebug() << "初期化エラー: " << e.what();
          throw;
      }
     }
     }
   
   
442行目: 587行目:
     void startDiscovery(const QBluetoothAddress& address)
     void startDiscovery(const QBluetoothAddress& address)
     {
     {
       try {
       qDebug() << "サービス探索を開始...";
          qDebug() << "サービス探索を開始...";
      discoveryAgent.setRemoteAddress(address);
          discoveryAgent->setRemoteAddress(address);
      discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
          discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
      }
      catch (const std::exception &e) {
          qDebug() << "探索開始エラー:" << e.what();
          throw;
      }
     }
     }
   
   
456行目: 595行目:
     void stopDiscovery()
     void stopDiscovery()
     {
     {
       try {
       qDebug() << "サービス探索を停止...";
          qDebug() << "サービス探索を停止...";
      discoveryAgent.stop();
          discoveryAgent->stop();
      }
      catch (const std::exception &e) {
          qDebug() << "探索停止エラー:" << e.what();
          throw;
      }
     }
     }
   
   
  private slots:
  private slots:
     // サービスの探索に成功した場合のスロット
     // サービスの探索に成功した場合
     void onServiceDiscovered(const QBluetoothServiceInfo& service)
     void onServiceDiscovered(const QBluetoothServiceInfo& service)
     {
     {
476行目: 609行目:
   
   
       // サービスの詳細情報を表示
       // サービスの詳細情報を表示
       if (service.serviceUuid().isNull()) {
       if (service.serviceUuid().isNull()) qDebug() << "  UUID: カスタムUUID";
          qDebug() << "  UUID: カスタムUUID";
       else                               qDebug() << "  UUID: " << service.serviceUuid().toString();
      }
       else {
      // サービスクラスを表示
          qDebug() << "  UUID: " << service.serviceUuid().toString();
      QList<QBluetoothUuid> serviceClasses = service.serviceClassUuids();
      if (!serviceClasses.isEmpty()) {
          qDebug() << "  サービスクラス:";
          for (const QBluetoothUuid& uuid : serviceClasses) {
            qDebug() << "    -" << uuid.toString();
          }
       }
       }
   
   
493行目: 631行目:
     }
     }
   
   
     // 探索完了時のスロット
     // 探索完了時
     void onScanFinished()
     void onScanFinished()
     {
     {
499行目: 637行目:
     }
     }
   
   
     // エラー発生時のスロット
     // エラー発生時
     void onError(QBluetoothServiceDiscoveryAgent::Error error)
     void onError(QBluetoothServiceDiscoveryAgent::Error error)
     {
     {
505行目: 643行目:
     }
     }
  };
  };
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// 使用方法
ServiceDiscovery discovery;
// 例: MACアドレスを指定してサービス探索を開始
QBluetoothAddress address("XX:XX:XX:XX:XX:XX");
discovery.startDiscovery(address);
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー