QTmqttクライアントに基づく複数の構成
使用する最近のプロジェクトmqttはもちろん、現在mqttはすでに標準コンポーネントの時代であり、C末端ベースのインターフェイスmosquittoライブラリの使用が行われる前は
qmqtt开源库14.2
、もちろん、書かれたuiインターフェイスに基づいてい ます。よく呼ばれますが、ライブラリの形式でカプセル化されています。
エフェクト画像
主な機能
構成機能
ソフトウェアが起動すると、最初に構成ファイルが検索MQTT_CONFIG.json
され、新しいデフォルト構成が生成されます。
Windows側はデフォルトでプログラムの起動を検索し、
Linux側は/ etcディレクトリでプログラムの起動を検索します
コンテンツの形式は次のとおりです。
- 当初は複数の構成から開始するか、複数のプラットフォームに接続することが想定されていたため、4つの構成があるのはなぜですか
- 現在、マルチ構成機能は利用可能ですが、インターフェースのインターフェースの場所がないため、UIで構成を切り替えるためのインターフェースがありません。
{
"MQTT_CONFIG": [
{
"MqttConfigNum": "Client_0",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_1",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_2",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
},
{
"MqttConfigNum": "Client_3",
"MqttKeepAlive": 300,
"MqttServerAddr": "broker.hivemq.com",
"MqttServerIp": "192.168.50.128",
"MqttServerPort": 1883,
"MqttUserKey": "123456",
"MqttUserName": "admin",
"PublishTopic": [
{
"MqttPUBQos": 0,
"MqttPublishTopic": ""
}
],
"SubscribeTopic": [
{
"MqttSUBQos": 0,
"MqttSubscribeTopic": ""
}
]
}
]
}
ネットワーク検出
これについては何も言うことはありませんが、インターネット上での検出のほとんどは、ブロッキングがインターフェース操作に適していないというものです。ここでは、最適化された機能項目である非同期非ブロッキングに変更されます。
- ネットワークに異常があると、非同期通知のために異常信号が送信されます。
デバッグ機能
- デバッグ機能をオンにすると、メッセージエリアの下部に送信するコンテンツを編集するための小さな入力ボックスが表示されます。このとき、公開エリアのトピックに送信するトピックを入力します。qosは0をクリックし、[送信]をクリックします。
- 送信トピックと同じトピックをサブスクライブしている場合は、送信メッセージを受信してメッセージ領域に表示できます。
トピックを公開する
現在、メッセージの公開は制限されています(サブスクリプション操作ロジックと一致)。つまり、公開列のトピックが送信インターフェイスを呼び出した場合にのみ、メッセージの送信が許可されます。
このクライアントを移植する
前提条件
このクライアントのソースコード
ダウンロードアドレスをダウンロードします。ポイントは3に設定されていますが、高いのは私のポットではありません。
コンパイル前の変更確認
- Windowsはソースコードをコンパイルしますが、コンパイラはデフォルトでそれを使用します
mingw64
- SSL暗号化機能、ssl暗号化機能はLinuxではデフォルトでソースコードで有効になっていません。Linux側の開発のほとんどが埋め込まれているため、qtソースコードのコンパイルとクリッピングアイテムのほとんどは、必要に応じてopenssl結合リンクをキャンセルします有効にするには、ソースコードを自分で変更し、マクロ判定をキャンセルします。
コンパイル
ここでは、例としてウィンドウ側を取り上げ
ます1.使用qtcreatorソースプロジェクトのlibmqttclient.pro
ファイルを開き、コンパイラをmingw64に設定し、コンパイルするリリースバージョンを選択します。
コンパイル結果は次のとおりです
。2つのライブラリファイルをコンパイルして生成します。1。クライアントライブラリファイルmqttclient 2.クライアントが依存するqmqtt14.2ライブラリファイルQt5Mqtt
- どの
lib
フォルダライブラリファイルqmqtt14.2を持っています src/mqttclient/release
ディレクトリにUIインターフェースクライアントのライブラリファイルがありますinclude
qmqtt14.2ヘッダーファイルがあります
mqttクライアントをプロジェクトに移植する
ソースメソッド
1、プロジェクトのソースmqtt
ディレクトリのルートディレクトリに基づいて、次のmqttディレクトリlib
、QtMqtt
2つのディレクトリを作成します。
2、コンパイラが生成しqmqttライブラリファイル(ソースコードのlibディレクトリにコンパイラが生成したが): Qt5Mqtt.dll
、Qt5Mqtt.a
あなたのプロジェクトにコピーされたmqtt/lib
ディレクトリ
3、コピーは(ディレクトリ(ソースコンパイラが生成した)が含ま下)あなたに、すべてのヘッダファイルをqmqtt 4。プロジェクトmqtt/QtMqtt
ディレクトリで、
プロジェクトの.proファイルに以下を追加します。
# qmqtt windows
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqttd
INCLUDEPATH += $$PWD/mqtt/QtMqtt/ $$PWD/mqtt/
DEPENDPATH += $$PWD/mqtt/QtMqtt/
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqtt.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqttd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqtt.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqttd.lib
# qmqtt linux
unix:!macx: LIBS += -L$$PWD/mqtt/lib/
unix:!macx: LIBS += -lQt5Mqtt
5.プロジェクトmqtt
ディレクトリにmqttclient.pri
ファイルを作成
し、次のように入力します。
SOURCES += \
customerwidgetitem.cpp \
libmqttclient.cpp
HEADERS += \
customerwidgetitem.h \
libmqttclient_global.h \
libmqttclient.h \
ui_libmqttclient.h
6.ソースコードディレクトリ(libmqttclient\src\mqttclient
)mqttclient.pri
に含まれるファイルを、プロジェクトのソースコードのルートディレクトリに作成されたディレクトリにコピーしますmqtt
。
7.プロジェクト.pro
ファイルに以下を追加します
# mqttclient
include(mqtt/mqttclient.pri)
上記の手順が完了すると、mqttClientによって提供されるインターフェイスを呼び出すことができます。
次に例を示します
。1。クライアントを含むヘッダーファイル
#include <mqtt/libmqttclient.h> /**< mqttclient*/
2.インスタンス化
Libmqttclient *MqttWindow;
/*mqttclient设置窗口显示*/
MqttWindow = new Libmqttclient(800 ,600 ,QString("192.168.50.128"));
/*连接mqttclient窗口关闭信号*/
connect(MqttWindow ,&Libmqttclient::MqttwindowIsClose ,this ,&MainWindow::slotShowMainWindow);
/*连接mqttclient自启动连接服务器异常信号*/
connect(MqttWindow ,&Libmqttclient::NetworkPingError ,this ,&MainWindow::slotShowNetErrDialog);
/*连接mqttclient窗口要求显示键盘的信号*/
connect(MqttWindow ,&Libmqttclient::show_keyboard ,this ,&MainWindow::slotprocessedit);
3.ディスプレイを呼び出す
MqttWindow->show();
図書館の方法
1.ソースコードのコンパイルが正常に完了したことを確認します(関連するライブラリファイルが期待どおりに生成されます)。
2、プロジェクトのソースmqtt
ディレクトリのルートディレクトリに構築され、次のmqttディレクトリlib
、QtMqtt
2つのディレクトリを作成します。
3、生成されたqmqttライブラリファイル(ソースコードlibディレクトリコンパイラによって生成された)をコンパイルします:Qt5Mqtt.dll
、Qt5Mqtt.a
プロジェクトmqtt/lib
ディレクトリにコピーされます
4、qmqttすべてのヘッダーファイル((ソースコンパイラによって生成されたインクルードディレクトリ)のmqtt/QtMqtt
下)をプロジェクトディレクトリの下にコピーします
5コンパイルされたmqttclientライブラリファイル(ソースコードのコンパイルによって生成されたsrc / mqttclient / releaseディレクトリの下)をmqttclient.dll
コピーしますmqtt/lib
。プロジェクトディレクトリにコピーします。6 。
プロジェクトの.proファイルに以下を追加します。
# qmqtt windows
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/mqtt/lib/ -lQt5Mqttd
INCLUDEPATH += $$PWD/mqtt/QtMqtt/ $$PWD/mqtt/
DEPENDPATH += $$PWD/mqtt/QtMqtt/
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqtt.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/libQt5Mqttd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqtt.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/mqtt/lib/Qt5Mqttd.lib
# qmqtt linux
unix:!macx: LIBS += -L$$PWD/mqtt/lib/
unix:!macx: LIBS += -lQt5Mqtt
#mqttclient
LIBS += -L$$PWD/mqtt/lib/
LIBS += -lmqttclient
7.プロジェクトmqtt
ディレクトリにmqttclient.pri
ファイルを作成します(できません)
次の内容を入力します:(できません)
HEADERS += \
$$PWD/customerwidgetitem.h \
$$PWD/libmqttclient.h \
$$PWD/libmqttclient_global.h \
$$PWD/ui_libmqttclient.h
プロジェクト.pro
ファイルに以下を追加します:(できません)
# mqttclient
include(mqtt/mqttclient.pri)
8.ソースコードディレクトリ(libmqttclient\src\mqttclient
)の下に.hサフィックスが付いているすべてのファイルを、プロジェクトソースコードのルートディレクトリに作成されたディレクトリにコピーしますmqtt
。
上記の手順を完了したら、インターフェイスを呼び出すことができます。
インターフェイスの説明
インターフェイスの詳細については、libmqttclient.h
ファイルを参照してください
static bool NetworkConnectCheck(QString netaddr); /**< 检测与指定外网的连接*/
void SetReconnectInterval(qint32 msec); /**< 设置重连检测周期*/
void NetworkPingCheck(QString netaddr); /**< 检测指定ip是否能够ping通*/
void SwitchClientConfig(quint8 clientNum = 0); /**< 切换客户端配置*/
void setUsername(QString &user ,QString &Key ,bool Writeflash = false ,quint8 configindex = 0); /**< 设置用户名和密码*/
void setHostIPAddr(QString &addr ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机IP地址*/
void setHostRealmAddr(QString &addr ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机域名地址*/
void setHostPort(quint16 port ,bool Writeflash = false ,quint8 configindex = 0);/**< 设置主机端口地址*/
void setProtocolVersion(QMqttClient::ProtocolVersion protocolVersion);/**< 设置版本*/
void setWillMsgConfig(const QString &willTopic ,const QByteArray &willMessage ,quint8 willQoS = 0 ,bool willRetain = false);/**< 设置遗属消息*/
void setCleanSession(bool cleanSession = true);/**< false表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销*/
QMqttClient::ClientState GetMqttConnectState()const;/**< 获取mqtt连接状态 0未连接 1连接中 2已连接*/
void UNsubscribe_all(); /**< 取消全部订阅*/
void UNpublish_all(); /**< 取消全部发布*/
qint32 PublishMsg(QString topicStr ,QByteArray msg);/**< 发布消息*/
bool RemoveSubscribeToic(QString topic ,bool Writeflash = false ,quint8 configindex = 0); /**< 删除指定订阅,选择是否写入到配置*/
bool RemovePublishToic(QString topic ,bool Writeflash = false ,quint8 configindex = 0); /**< 删除指定发布,选择是否写入到配置*/
bool AddSubscribeToic(QString topic ,qint32 qosvalue ,bool Writeflash = false ,quint8 configindex = 0); /**< 新增指定订阅,选择是否写入到配置*/
bool AddPublishToic(QString topic ,qint32 qosvalue ,bool Writeflash = false ,quint8 configindex = 0); /**< 新增指定发布,选择是否写入到配置*/
提供される信号:
void MqttwindowIsClose(); /**< 通知父窗口显示*/
void show_keyboard(QWidget * ,QLineEdit *,QString,QString); /**< 通知显示键盘*/
void NetworkPingError(); /**< 网络连接错误*/
void MessageReceived(const QByteArray &message, const QMqttTopicName &topic = QMqttTopicName());/**< 接收到新消息信号*/
void StartReconnectTimer();/**< 重新连接启动*/
インタラクティブな例
qtcreatorを使用してメインウィンドウウィンドウを作成します
インターフェイスヘッダーファイルが含まれています
#include <mqtt/libmqttclient.h>
プライベートメンバーmqttclientウィンドウポインタを作成します
private:
Libmqttclient *MqttWindow;
インスタンス化して、mqttclientクライアントウィンドウのサイズを指定し800*600
ます。デフォルトの接続mqttサーバーのIPは192.168.50.128
/*mqttclient设置窗口显示*/
MqttWindow = new Libmqttclient(800 ,600 ,QString("192.168.50.128"));
mqttclient関連の信号を接続します
/*连接mqttclient窗口关闭信号*/
connect(MqttWindow ,&Libmqttclient::MqttwindowIsClose ,this ,&MainWindow::slotShowMainWindow);
/*连接mqttclient自启动连接服务器异常信号*/
connect(MqttWindow ,&Libmqttclient::NetworkPingError ,this ,&MainWindow::slotShowNetErrDialog);
/*连接mqttclient窗口要求显示键盘的信号*/
connect(MqttWindow ,&Libmqttclient::show_keyboard ,this ,&MainWindow::slotprocessedit);
メインウィンドウ処理関連信号
/*显示主窗口*/
void MainWindow::slotShowMainWindow()
{
this->show();
}
/*显示网络错误*/
void MainWindow::slotShowNetErrDialog()
{
QMessageBox::critical(this,tr("Error"),tr("<p><span style='color: rgb(255, 0, 80);font-size: 24px;'>初始连通mqtt服务器失败.</span></p>"));
}
/*显示键盘信号*/
void MainWindow::slotprocessedit(QWidget *pObject ,QLineEdit *pwidget ,QString title ,QString edittext)
{
if(KeyboardUI->isHidden() == false)
{
return;
}
pLastCallobj = pObject;
pLastCallwidget = pwidget;
KeyboardUI->showKeyboard(title ,edittext);
}
さて、たくさん書いてください。インターフェイスには、柔軟に使用できるようにソースコードにコメントがあります。