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

ナビゲーションに移動 検索に移動
897行目: 897行目:
  #include <QBluetoothSocket>
  #include <QBluetoothSocket>
  #include <QDebug>
  #include <QDebug>
#include <memory>
   
   
  class BluetoothConnection : public QObject
  class BluetoothConnection : public QObject
904行目: 903行目:
   
   
  private:
  private:
     std::unique_ptr<QBluetoothSocket> socket;
     QBluetoothSocket socket;
   
   
     // エラーコードを文字列に変換するヘルパー関数
     // エラーコード
     QString errorToString(QBluetoothSocket::SocketError error)
     QString errorToString(QBluetoothSocket::SocketError error)
     {
     {
920行目: 919行目:
     }
     }
   
   
     // 接続状態を文字列に変換するヘルパー関数
     // 接続状態
     QString stateToString(QBluetoothSocket::SocketState state)
     QString stateToString(QBluetoothSocket::SocketState state)
     {
     {
935行目: 934行目:
   
   
  public:
  public:
     explicit BluetoothConnection(QObject* parent = nullptr) : QObject(parent)
     explicit BluetoothConnection(QObject *parent = nullptr) : QObject(parent), socket(QBluetoothServiceInfo::RfcommProtocol, this)
     {
     {
       try {
       // 各種シグナルとスロットの接続
          // RFCOMMソケットの作成
      connect(&socket, &QBluetoothSocket::connected, this, &BluetoothConnection::onConnected);
          socket = std::make_unique<QBluetoothSocket>(QBluetoothServiceInfo::RfcommProtocol, this);
      connect(&socket, &QBluetoothSocket::disconnected, this, &BluetoothConnection::onDisconnected);
      connect(&socket, &QBluetoothSocket::errorOccurred, this, &BluetoothConnection::onError);
      connect(&socket, &QBluetoothSocket::readyRead, this, &BluetoothConnection::onDataReceived);
      connect(&socket, &QBluetoothSocket::stateChanged, this, &BluetoothConnection::onStateChanged);
    }
   
   
          // 各種シグナルとスロットの接続
    ~BluetoothConnection()
          connect(socket.get(), &QBluetoothSocket::connected, this, &BluetoothConnection::onConnected);
    {
          connect(socket.get(), &QBluetoothSocket::disconnected, this, &BluetoothConnection::onDisconnected);
       disconnect();
          connect(socket.get(), &QBluetoothSocket::errorOccurred, this, &BluetoothConnection::onError);
          connect(socket.get(), &QBluetoothSocket::readyRead, this, &BluetoothConnection::onDataReceived);
          connect(socket.get(), &QBluetoothSocket::stateChanged, this, &BluetoothConnection::onStateChanged);
      }
       catch (const std::exception &e) {
          qDebug() << "初期化エラー: " << e.what();
          throw;
      }
     }
     }
   
   
957行目: 952行目:
     void connectToDevice(const QBluetoothAddress &address, quint16 port)
     void connectToDevice(const QBluetoothAddress &address, quint16 port)
     {
     {
       try {
       if (socket.state() == QBluetoothSocket::ConnectedState) {
          if (socket->state() == QBluetoothSocket::ConnectedState) {
          qDebug() << "既に接続済み";
            qDebug() << "既に接続済み";
          return;
            return;
      }
          }
   
   
          qDebug() << "デバイスに接続します: " << address.toString();
      qDebug() << "デバイスに接続します: " << address.toString();
          qDebug() << "ポート: " << port;
      qDebug() << "ポート: " << port;
          socket->connectToService(address, port);
      socket.connectToService(address, port);
      }
      catch (const std::exception &e) {
          qDebug() << "接続エラー: " << e.what();
          throw;
      }
     }
     }
   
   
976行目: 965行目:
     void disconnect()
     void disconnect()
     {
     {
       try {
       if (socket.state() != QBluetoothSocket::UnconnectedState) {
          if (socket->state() != QBluetoothSocket::UnconnectedState) {
          qDebug() << "接続を切断...";
            qDebug() << "接続を切断...";
          socket.disconnectFromService();
            socket->disconnectFromService();
          }
      }
      catch (const std::exception &e) {
          qDebug() << "切断エラー: " << e.what();
          throw;
       }
       }
     }
     }
991行目: 974行目:
     bool sendData(const QByteArray &data)
     bool sendData(const QByteArray &data)
     {
     {
       try {
       if (socket.state() != QBluetoothSocket::ConnectedState) {
          if (socket->state() != QBluetoothSocket::ConnectedState) {
          qDebug() << "送信エラー: 接続されていません";
            qDebug() << "送信エラー: 接続されていません";
          return false;
            return false;
      }
          }
   
   
          qint64 bytesWritten = socket->write(data);
      qint64 bytesWritten = socket.write(data);
          if (bytesWritten == -1) {
      if (bytesWritten == -1) {
            qDebug() << "送信エラー: データの書き込みに失敗";
          qDebug() << "送信エラー: データの書き込みに失敗";
            return false;
          return false;
          }
      }
   
   
          qDebug() << bytesWritten << "バイトデータの送信完了";
      qDebug() << bytesWritten << "バイトデータの送信完了";
          return true;
      return true;
      }
      catch (const std::exception &e) {
          qDebug() << "送信エラー: " << e.what();
          throw;
      }
     }
     }
   
   
  private slots:
  private slots:
     // 接続確立時のスロット
     // 接続確立時
     void onConnected()
     void onConnected()
     {
     {
       qDebug() << "接続が確立";
       qDebug() << "接続が確立";
       qDebug() << "  ローカルアドレス:" << socket->localAddress().toString();
       qDebug() << "  ローカルアドレス:" << socket.localAddress().toString();
       qDebug() << "  リモートアドレス:" << socket->peerAddress().toString();
       qDebug() << "  リモートアドレス:" << socket.peerAddress().toString();
     }
     }
   
   
     // 切断時のスロット
     // 切断時
     void onDisconnected()
     void onDisconnected()
     {
     {
1,027行目: 1,004行目:
     }
     }
   
   
     // エラー発生時のスロット
     // エラー発生時
     void onError(QBluetoothSocket::SocketError error)
     void onError(QBluetoothSocket::SocketError error)
     {
     {
1,033行目: 1,010行目:
     }
     }
   
   
     // データ受信時のスロット
     // データ受信時
     void onDataReceived()
     void onDataReceived()
     {
     {
       QByteArray data = socket->readAll();
       QByteArray data = socket.readAll();
       qDebug() << "データを受信: " << data.size() << "バイト";
       qDebug() << "データを受信: " << data.size() << "バイト";
   
   
1,043行目: 1,020行目:
     }
     }
   
   
     // 接続状態変更時のスロット
     // 接続状態変更時
     void onStateChanged(QBluetoothSocket::SocketState state)
     void onStateChanged(QBluetoothSocket::SocketState state)
     {
     {

案内メニュー