「Qtの基礎 - MQTT」の版間の差分

ナビゲーションに移動 検索に移動
21行目: 21行目:
<br>
<br>
また、大量のメッセージを送受信する場合は、非同期処理を活用してUIのブロッキングを防ぐことが重要である。<br>
また、大量のメッセージを送受信する場合は、非同期処理を活用してUIのブロッキングを防ぐことが重要である。<br>
<br><br>
== MQTT関連のクラスとメソッド ==
==== QMqttClientクラスのメソッド ====
基本的な接続に関する設定を以下に示す。<br>
<br>
<syntaxhighlight lang="c++">
QMqttClient client;
// MQTTブローカーのホスト名の指定
client->setHostname("localhost");
// ポート番号の指定
client->setPort(1883);
// ユーザ名の指定 (認証が必要な場合)
client->setUsername("<ユーザ名>");
// パスワード (認証が必要な場合)
client->setPassword("<パスワード>");
// MQTTブローカーの接続
client->connectToHost();
// MQTTブローカーの切断
client->disconnectFromHost();
// 現在の接続状態の取得
// 状態の種類:
// -> QMqttClient::Disconnected
// -> QMqttClient::Connecting
// -> QMqttClient::Connected
QMqttClient::ClientState state = client->state();
</syntaxhighlight>
<br>
MQTTメッセージの保持 (Retain) フラグとは、MQTTブローカーがそのトピックの最後のメッセージを保存して、<br>
新しいクライアントが購読を開始した時に、最後に発行されたメッセージを自動的に送信するかどうかを制御するフラグである。<br>
<br>
publishメソッドでは、以下に示す値を指定することができる。<br>
* RETAIN (true/1):
*: メッセージをMQTTブローカーに保持するように指示する。
*: 新しいサブスクライバーが接続した時に、最後のRetainメッセージを受信する。
*: 頻繁に更新されないステータス情報 (デバイスの設定値等) の共有に使用する。
*: <br>
* NO_RETAIN (false/0)
*: メッセージは保持されない。
*: 購読時に過去のメッセージは送信されない。
*: リアルタイムデータやイベント通知等の一時的な情報に適している。
<br>
<syntaxhighlight lang="c++">
// 使用例:
QMqttClient client;
// 保持フラグをtrueに設定してメッセージを発行 (QoS 0, Retain true)
client.publish("sensor/temperature", "25.5", 0, true);
// 保持フラグをfalseに設定してメッセージを発行 (QoS 0, Retain false)
client.publish("sensor/temperature", "25.5", 0, false);
</syntaxhighlight>
<br>
MQTTブローカーに保持されているメッセージを削除する場合は、同じトピックに空のペイロードを保持フラグtrueで送信する。<br>
<syntaxhighlight lang="c++">
QMqttClient client;
client.publish("sensor/temperature", "", 0, true);
</syntaxhighlight>
<br>
==== 送信 (パブリッシュ側) ====
<syntaxhighlight lang="c++">
QMqttClient client;
// メッセージのパブリッシュ
qint32 msgId = client->publish(topic,    // トピック名
                                message,  // メッセージ内容
                                qos,      // QoSレベル
                                retain);  // 保持メッセージフラグ
// 戻り値が-1の場合はパブリッシュ失敗
if (msgId == -1) {
    // エラー処理
    // ...略
}
</syntaxhighlight>
<br>
==== 受信 (サブスクライブ側) ====
<syntaxhighlight lang="c++">
QMqttClient client;
// トピックのサブスクライブ
// QoS 0 : (最大1回配信)
// QoS 1 : (最低1回配信)
// QoS 2 : (正確に1回配信)
auto subscription = client->subscribe(topic, qos);
// サブスクリプション成功の確認
if (subscription) {
    QMqttSubscription *sub = subscription;
    // サブスクリプションの状態変更を監視
    connect(sub, &QMqttSubscription::stateChanged, this, [](QMqttSubscription::SubscriptionState state) {
      // 状態の種類:
      // -> QMqttSubscription::Unsubscribed
      // -> QMqttSubscription::SubscriptionPending
      // -> QMqttSubscription::Subscribed
      // -> QMqttSubscription::UnsubscriptionPending
    });
}
</syntaxhighlight>
<br>
==== シグナル / スロット接続 ====
* 接続状態の変更を監視する場合
<br>
<syntaxhighlight lang="c++">
connect(client, &QMqttClient::stateChanged, this, [](QMqttClient::ClientState state) {
    // 状態変更時の処理
    // ...略
});
</syntaxhighlight>
<br>
* メッセージを受信する場合
<br>
<syntaxhighlight lang="c++">
connect(client, &QMqttClient::messageReceived, this, [](const QByteArray &message, const QMqttTopicName &topic) {
    // メッセージの受信
    QString msg = QString::fromUtf8(message);
    QString topicName = topic.name();
    // その他のメッセージ処理
    // ...略
});
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// エラー監視
connect(client, &QMqttClient::errorChanged, this, [](QMqttClient::ClientError error) {
    // エラーの種類:
    // -> QMqttClient::NoError
    // -> QMqttClient::InvalidProtocolVersion
    // -> QMqttClient::IdRejected
    // -> QMqttClient::ServerUnavailable
    // -> QMqttClient::BadUsernameOrPassword
    // -> QMqttClient::NotAuthorized
    // -> QMqttClient::TransportInvalid
    // -> QMqttClient::ProtocolViolation
    // -> QMqttClient::UnknownError
    // -> QMqttClient::Mqtt5SpecificError
    // エラー処理を記述
    // ...略
});
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー