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

ナビゲーションに移動 検索に移動
(Wiki がページ「Qtの基礎 - Bluetooth」を「Qtの基礎 - Classic Bluetooth」に、リダイレクトを残さずに移動しました)
172行目: 172行目:
各サービスはUUIDで識別されており、標準的なサービスには予め定義されたUUIDが割り当てられている。<br>
各サービスはUUIDで識別されており、標準的なサービスには予め定義されたUUIDが割り当てられている。<br>
また、カスタムサービスの場合は独自のUUIDを使用する。<br>
また、カスタムサービスの場合は独自のUUIDを使用する。<br>
<br>
<syntaxhighlight lang="c++">
#include <QBluetoothServiceDiscoveryAgent>
#include <QBluetoothAddress>
#include <QDebug>
#include <memory>
class ServiceDiscovery : public QObject
{
    Q_OBJECT
private:
    std::unique_ptr<QBluetoothServiceDiscoveryAgent> discoveryAgent;
    // プロトコルタイプを文字列に変換するヘルパー関数
    QString protocolToString(int protocol)
    {
      switch (protocol) {
          case 0:  return "不明なプロトコル";
          case 1:  return "SDP";
          case 3:  return "RFCOMM";
          case 15: return "L2CAP";
          default: return QString("その他のプロトコル (%1)").arg(protocol);
      }
    }
    // エラーコードを文字列に変換するヘルパー関数
    QString errorToString(QBluetoothServiceDiscoveryAgent::Error error)
    {
      switch (error) {
          case QBluetoothServiceDiscoveryAgent::NoError:                      return "エラーなし";
          case QBluetoothServiceDiscoveryAgent::InputOutputError:            return "I/Oエラー";
          case QBluetoothServiceDiscoveryAgent::PoweredOffError:              return "Bluetoothがオフ";
          case QBluetoothServiceDiscoveryAgent::InvalidBluetoothAdapterError: return "無効なアダプタ";
          case QBluetoothServiceDiscoveryAgent::UnknownError:                return "不明なエラー";
          default: return "予期せぬエラー";
      }
    }
public:
    explicit ServiceDiscovery(QObject* parent = nullptr) : QObject(parent)
    {
      try {
          // サービス探索エージェントの作成
          discoveryAgent = std::make_unique<QBluetoothServiceDiscoveryAgent>(this);
          // 各種シグナルとスロットの接続
          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;
      }
    }
    // 特定のデバイスのサービス探索を開始
    void startDiscovery(const QBluetoothAddress& address)
    {
      try {
          qDebug() << "サービス探索を開始...";
          discoveryAgent->setRemoteAddress(address);
          discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
      }
      catch (const std::exception &e) {
          qDebug() << "探索開始エラー:" << e.what();
          throw;
      }
    }
    // 探索を停止
    void stopDiscovery()
    {
      try {
          qDebug() << "サービス探索を停止...";
          discoveryAgent->stop();
      }
      catch (const std::exception &e) {
          qDebug() << "探索停止エラー:" << e.what();
          throw;
      }
    }
private slots:
    // サービスの探索に成功した場合のスロット
    void onServiceDiscovered(const QBluetoothServiceInfo& service)
    {
      qDebug() << "サービスの探索に成功:";
      qDebug() << "  サービス名: "  << service.serviceName();
      qDebug() << "  サービス説明: " << service.serviceDescription();
      qDebug() << "  プロトコル: "  << protocolToString(service.protocolServiceMultiplexer());
      // サービスの詳細情報を表示
      if (service.serviceUuid().isNull()) {
          qDebug() << "  UUID: カスタムUUID";
      }
      else {
          qDebug() << "  UUID: " << service.serviceUuid().toString();
      }
      // サービスクラスを表示
      QList<QBluetoothUuid> serviceClasses = service.serviceClassUuids();
      if (!serviceClasses.isEmpty()) {
          qDebug() << "  サービスクラス:";
          for (const QBluetoothUuid& uuid : serviceClasses) {
            qDebug() << "    -" << uuid.toString();
          }
      }
    }
    // 探索完了時のスロット
    void onScanFinished()
    {
      qDebug() << "サービス探索が完了";
    }
    // エラー発生時のスロット
    void onError(QBluetoothServiceDiscoveryAgent::Error error)
    {
      qDebug() << "エラーが発生: " << errorToString(error);
    }
};
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー