目次
4. X86 プラットフォームに mosquitto をインストールする
1. MQTT の概要
MQTT
(
メッセージ キュー テレメトリ トランスポート
、メッセージ キュー テレメトリ トランスポート プロトコル) は、パブリッシュ/サブスクライブ モデルに基づく「軽量」通信プロトコルです
。このプロトコルは TCP /IP プロトコルに基づいて構築され、1999年
に
IBMによって開発されました。MQTTの最大の利点は、非常に少ないコードと限られた帯域幅でリモート デバイスを接続するためのリアルタイムで信頼性の高いメッセージング サービスを提供できることです。低コスト、低帯域幅のインスタント メッセージング プロトコルとして、モノのインターネット、小型デバイス、モバイル アプリケーションなどに幅広い用途があります。
MQTT
は、クライアント
-
サーバーベースのメッセージ パブリッシュ
/
サブスクライブ トランスポート プロトコルです。
MQTT
プロトコルは軽量、シンプル、オープンで実装が簡単です。
これらの特徴により、幅広い用途に適しています。多くの場合、マシンツーマシン (
M2M
) 通信やモノのインターネット (IoT
) などの制約された環境が含まれます。これは、衛星リンクを介した通信センサー、臨時ダイヤル用の医療機器、スマート ホーム、および一部の小型デバイスで広く使用されています。
2. MQTTの概念
2.1購読
サブスクリプションには、トピック フィルター (
Topic Filter
) と最大のサービス品質 (
QoS
) が含まれます。
サブスクリプションはセッション
に関連付けられます
。セッションには複数のサブスクリプションを含めることができます。各セッションの各サブスクリプションには、異なるトピック フィルターがあります。
2.2 セッション
各クライアントがサーバーとの接続を確立すると、それがセッションとなり、クライアントとサーバーの間にステートフルな対話が行われます。セッションは 1 つのネットワーク間に存在し、クライアントとサーバー間の複数の連続したネットワーク接続にまたがる場合があります。
2.3 トピック名
サーバーのサブスクリプションと一致するアプリケーション メッセージのラベルに接続します。サーバーは、一致するタグにサブスクライブしているすべてのクライアントにメッセージを送信します。
MQTTのメッセージ トピックは
階層的に名前が付けられ、「/」で区切られることに 注意してください。
さらに、トピック内でワイルドカードを使用して、複数のトピックまたは複数のレベルをサブスクライブできます。一般的なワイルドカードは次の 2 つです。
1.
単一レイヤーのワイルドカード
+
: 単一レイヤーのワイルドカードは、トピックの 1 つのレイヤーのみと一致します (例:
China/Beijing/+ ) 。また、
北京のトピックの 1 つ下のレイヤーのトピック (Xicheng、DongCheng、など)
のみと一致します。
玄武など
2.
マルチレベル ワイルドカード
#
: 名前が示すように、マルチレベル ワイルドカードは、次のような複数レベルのトピックに一致します:
China/# 。一致するトピックには、 China/Beijing/Dongcheng、China/Shanghai/PuDong
など
が含まれます。
2.4 トピックフィルター
トピック名のワイルドカード フィルター。サブスクリプションに一致する複数のトピックを示すためにサブスクリプション式で使用されます。
2.5 メッセージの購読
メッセージ購読者が受信した特定のコンテンツ。
3. MQTT における役割
1. パブリッシャーとサブスクライバーはクライアント、ブローカーはサーバー、メッセージ トピックはメッセージ タイプであり、ブローカーはトピックに基づいてメッセージをフィルターし、メッセージをクライアントにプッシュします。
2. QoS はサービス品質を表すためにMQTT
で使用されます。MQTT
プロトコルには 3 種類のサービス品質(QoS)があります。
1
)
QoS =0
、最大 1 回、パケット損失が発生する可能性があります。たとえば、このサービス品質と通信環境センサー データを併用する場合など、リアルタイム要件が高くない状況で使用されます。個々の読み取りが失われるかどうか、または新しい読み取りが直後に公開されるかどうかは関係ありません。
2
)
QoS =1、
少なくとも 1 回はパケットが宛先に到達することが保証されますが、重いパケットが発生する可能性があります。
3
)
QoS = 2、
正確に 1 回。パケットが宛先に到達し、パケットが重複しないことが保証されます。
3.1 クライアント
1. パブリッシャー と サブスクライバーの両方が クライアントに属します。2. アプリケーション メッセージを他の関連クライアントに公開します。3. 関連するアプリケーション メッセージを受信するリクエストをサブスクライブします。4. サブスクライブを解除して、アプリケーションメッセージを受け入れるリクエストを削除します。5. サーバーから切断します
3.2 サーバー
1. サーバー側は、いわゆる MQTT ブローカー サーバーです。2. クライアントからのネットワーク接続を受け入れます。3. クライアントによって公開されたアプリケーション メッセージを受け入れます。4. クライアントの購読リクエストと購読解除リクエストを処理します。5. アプリケーション メッセージを適格なサブスクライブ済みクライアントに転送します。6. MQTTが提供する 公開サーバー ( Broker ) は 次のとおりです。1) test.mosquitto.org2) ブローカー.hivemq.com3) iot.eclipse.org
4. X86 プラットフォームに mosquitto をインストールする
4.1 モスキートサーバーをダウンロードする
注文:
sudo apt-get install mosquitto
4.2 モスキートクライアントのダウンロード
sudo apt-get install mosquitto-clients
4.3 モスキートコマンド
4.3.1 蚊
サーバー
を起動するコマンドは
Ubuntu
で
すでに起動されています。
4.3.2 モスキート_パブ
メッセージのパブリッシュに使用されるコマンド
mosquitto_pub -h 192.168.0.137 -t "house" -m "500"
-h は
どのサーバーから公開するかを指定します
-t は
公開するトピックを指定します
-m
はメッセージの内容です
4.3.3 モスキート_サブ
メッセージの購読に使用するコマンド
mosquitto_sub -h 192.168.0.137 -t "house" -v
-h は、どのサーバーからサブスクライブするかを指定します。
-t は
、サブスクライブするトピックを指定します。
-v は、
受信したメッセージを出力することを意味します
5. ソフトウェアテスト
Windows は
mqttfx-1.7.1-windows-x64.exeテスト ソフトウェアを
インストールして開きます
試験結果:
6. QT は MQTT を使用します
6.1 MQTTの初期化
6.1.1 ソースコードのダウンロード
https://github.com/emqx/qmqtt
このライブラリを使用するには、
Qtバージョンが
5.3
以降である必要があります。
マスター バージョンとリリースバージョンの2 つのバージョンがあります。ここではリリースバージョンを使用します。
6.2.1 プロジェクトにソースコードを追加する
ネットワークモジュールに追加
6.3.1 ヘッダファイルパスの追加
エラー: 解決策
6.4.1 コンパイル
エラー
解決:
6.5.1 MQTTの初期化
QMQTT::Client *mqttClient ;
QString clientID;
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));
clientID = "XYD-CXX"+QString::number(qrand()); //合成 mqtt id
//mqtt 初始化
mqttClient = new QMQTT::Client(ui->lEditServerIP->text(), 1883);
mqttClient->setClientId(clientID); //ClientId 不能重复,不然会覆盖之前连接的人的
//mqttClient->setUsername("user"); //服务器账号密码,不需要则不用
//mqttClient->setPassword("password");
mqttClient->connect();
6.6.1mqtt 信号とスロット
//mqtt 连接成功
connect(mqttClient,SIGNAL(connected()),this,SLOT(doProcessMqttConnected()));
//mqtt 退出成功
connect(mqttClient,SIGNAL(disconnected()),this,SLOT(doProcessMqttDisconnected()));
//mqtt 订阅成功
connect(mqttClient,SIGNAL(subscribed(QString)),this,SLOT(doProcessMqttSubscribe(QSt
ring)));
//mqtt 订阅到消息
connect(mqttClient,SIGNAL(received(QMQTT::Message)),this,SLOT(doProcessMqttReceived
(QMQTT::Message)));
6.7.1 MQTT リリース
if(mqttIsConnected)
{
QMQTT::Message msg;
msg.setTopic(ui->lEditPub->text()); //发布的主题
//发布的内容,QString 转 QByteArray
msg.setPayload(ui->lEditPubPayload->text().toLatin1());
mqttClient->publish(msg);
}
サブスクリプションが成功した場合のスロット機能: 通常は使用されません。
void MqttForm::doProcessMqttSubscribe(QString topic)
{
//qDebug()<< topic + "is Subscribe";
}
情報を受信するためのスロット機能:
void MqttForm::doProcessMqttReceived(QMQTT::Message msg)
{
qDebug() << "topic:" + msg.topic();
qDebug() << "payload:" + msg.payload();
}