13,005
回編集
(→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> | ||