📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の2版が非表示)
21行目: 21行目:
<br>
<br>
また、大量のメッセージを送受信する場合は、非同期処理を活用してUIのブロッキングを防ぐことが重要である。<br>
また、大量のメッセージを送受信する場合は、非同期処理を活用してUIのブロッキングを防ぐことが重要である。<br>
<br><br>
== QtMqttモジュールのインストール ==
==== パッケージ管理システムからインストール ====
# RHEL
sudo dnf install qt6-qtmqtt-devel
# RHEL
sudo zypper install qt6-mqtt-devel
<br>
==== ソースコードからインストール ====
QtMqttモジュールのソースコードをダウンロードする。<br>
git clone --depth 1 git://code.qt.io/qt/qtmqtt.git -b <Qtのブランチ  例: 6.5.3>
cd qtmqtt
<br>
QtMqttモジュールをビルドおよびインストールする。<br>
<syntaxhighlight lang="sh">
mkdir build && cd build
# QtオンラインインストーラからQtライブラリをインストールしている場合
## Qt 5の場合
/<Qtのインストールディレクトリ>/<バージョン>/gcc_64/bin/qmake ../qtmqtt.pro
make -j $(nproc)
make install
## Qt 6 の場合
/<Qtのインストールディレクトリ>/<バージョン>/gcc_64/bin/qt-cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER=<GCC 8以降のGCCのパス>  \
    -DCMAKE_CXX_COMPILER=<GCC 8以降のG++のパス> \
    ..
make -j $(nproc)
make install
# パッケージ管理システムからQtライブラリをインストールしている場合
## Qt 5の場合
qmake ../qtmqtt.pro
make -j $(nproc)
make install
## Qt 6 の場合
cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX="<QtMqttモジュールのインストールディレクトリ>" \
      -DCMAKE_C_COMPILER=<GCC 8以降のGCCのパス>  \
      -DCMAKE_CXX_COMPILER=<GCC 8以降のG++のパス> \
      ..
make -j $(nproc)
make install
</syntaxhighlight>
<br><br>
<br><br>


230行目: 279行目:
  private:
  private:
     QMqttClient *m_client;
     QMqttClient *m_client;
     QString m_host;
     QString     m_host;
     quint16 m_port;
     quint16     m_port;
   
   
  public:
  public:
259行目: 308行目:
       m_client->setHostname(host);
       m_client->setHostname(host);
       m_client->setPort(port);
       m_client->setPort(port);
      // ユーザ名とパスワードが指定されている場合は設定
      if (!username.isEmpty()) {
          m_client->setUsername(username);
      }
      if (!password.isEmpty()) {
          m_client->setPassword(password);
      }
   
   
       // 非同期で接続を開始
       // 非同期で接続を開始
275行目: 333行目:
       auto publish = m_client->publish(topic, message, 1);
       auto publish = m_client->publish(topic, message, 1);
       if (!publish) {
       if (!publish) {
           qWarning() << "メッセージの発行に失敗しました: " << topic;
           qWarning() << "メッセージの発行に失敗しました : " << topic;
           return;
           return;
       }
       }
287行目: 345行目:
       }
       }
     }
     }
signals:
    // 接続確立時のシグナルを追加
    void connectionEstablished();
   
   
  private slots:
  private slots:
295行目: 357行目:
           case QMqttClient::Connected:
           case QMqttClient::Connected:
             qInfo() << "MQTTブローカーに接続しました";
             qInfo() << "MQTTブローカーに接続しました";
            emit connectionEstablished();  // 接続確立時にシグナルを発行
             break;
             break;
           case QMqttClient::Disconnected:
           case QMqttClient::Disconnected:
344行目: 407行目:
       }
       }
   
   
       qCritical() << "MQTTエラー:" << errorMsg;
       qCritical() << "MQTTエラー :" << errorMsg;
   
   
       // エラー発生時は再接続を試みる
       // エラー発生時は再接続を試みる
       if (m_client->state() != QMqttClient::Connected) {
       if (m_client->state() != QMqttClient::Connected) {
           QTimer::singleShot(5000, [this]() {
           QTimer::singleShot(5000, this, [this]() {
             qInfo() << "再接続を試みます...";
             qInfo() << "再接続を試みます...";
             this->connectToHost(m_host, m_port);
             this->connectToHost(m_host, m_port, m_client->username(), m_client->password());
           });
           });
       }
       }
367行目: 430行目:
   
   
     MqttPublisher publisher;
     MqttPublisher publisher;
    publisher.connectToHost("<IPアドレスまたはホスト名  例: localhost>", <MQTT通信するポート番号  例: 1883>);
   
   
     // 定期的にメッセージを送信
     // タイマの作成
     QTimer timer;
     QTimer *pTimer = new QTimer(&a);
     QObject::connect(&timer, &QTimer::timeout, [&publisher]() {
 
    // タイマーのコールバックを設定
     QObject::connect(pTimer, &QTimer::timeout, pTimer, [&publisher]() {
       publisher.publishMessage("qt/topic", "Hello, MQTT!");
       publisher.publishMessage("qt/topic", "Hello, MQTT!");
     });
     });
 
     timer.start(1000);  // 1秒おきに送信
     // Publisher側で接続状態の変化を監視し、接続成功時にタイマーを開始
    QObject::connect(&publisher, &Publisher::connectionEstablished, pTimer, [pTimer]() {
      pTimer->start(3000);  // 3秒おきに送信
    });
 
    // MQTTブローカーに接続
    publisher.connectToHost("<IPアドレスまたはホスト名  例: localhost>",
                            <MQTT通信するポート番号  例: 1883>,
                            "<MQTTユーザ名 (匿名ユーザを許可している場合は空でも可)>",
                            "<MQTTユーザのパスワード (匿名ユーザを許可している場合は空でも可>");
      
      
     return a.exec();
     return a.exec();