Qt 集成emqx/qmqtt实现订阅与发布
Qt 集成emqx/qmqtt实现订阅与发布
- 下载源码
- 编译生成mqtt库
- 测试使用
Qt使用第三方库emqx/qmqtt实现mqtt基本通信。
下载源码
从emqx/qmqtt仓库下载工程源码到本地并使用Qt Creator打开项目:


编译生成mqtt库
会将mqtt相关内容编译成lib,选择需要使用mqtt的编译环境,这里演示就是用如下环境:

在编译器之前按仓库中的提示做一个配置:


然后直接点击编译:

编译结束后会在编译输出目录生成一个dll文件:

在加上源码中如下几个头文件就可以开始尝试使用了:

测试使用
新建mqtt工程,选择和上面一样的编译环境:

将上面提到的几个文件加入到工程目录中(一个dll,4个头文件):

配置引用库和网络模块:

将头文件加入到工程中:

然后编译工程,将dll文件复制到编译生成的exe同级目录:

基本工作准备好后就可以开始调用相关接口显示连接、订阅、发布了,仓库中也写了使用案例和可能需要的信号与槽接口:
在 头文件中包含qmqtt.h,定义连接状态与订阅消息接收的槽函数在,再定义一个mqtt_client指针:
#include "qmqtt.h"private slots:void mqtt_received(const QMQTT::Message& message);void mqtt_connected();private:QMQTT::Client *mqtt_client;
定义两个主题,一个用于测试发布,一个用于测试订阅
const QString SEND_TOPIC = "/mqtt/send";
const QString SUB_TOPIC = "/mqtt/sub";
初始化相关参数,连接槽函数,发起mqtt连接
mqtt_client = new QMQTT::Client(QHostAddress("MQTT服务器IP地址"), MQTT服务器端口);mqtt_client->setClientId("自定义id");mqtt_client->setUsername("mqtt用户名");mqtt_client->setPassword("mqtt连接密码");mqtt_client->connectToHost();connect(mqtt_client, SIGNAL(received(const QMQTT::Message &)),this, SLOT(mqtt_received(const QMQTT::Message &)));connect(mqtt_client, SIGNAL(connected()),this, SLOT(mqtt_connected()));
在槽函数中将信息打印看是否能只能正常收到(订阅主题需要在mqtt服务器连接成功后进行)
void MainWindow::mqtt_connected()
{qDebug()<<"mqtt_connected";mqtt_client->subscribe(SUB_TOPIC, 0);
}
void MainWindow::mqtt_received(const QMQTT::Message& message)
{qDebug()<<message.topic()<<":"<<message.payload();
}
界面上防止一个button用来出发发布主题:
void MainWindow::on_send_mqtt_btn_clicked()
{QMQTT::Message message(0 ,SEND_TOPIC,QString("send test data").toUtf8(),0);mqtt_client->publish(message);
}
关于消息的原型如下:

到这基本就已经可以测试订阅与发布消息了:

测试源码在这里,下载后测试需要将mainwindow.cpp文件中的mqtt连接参数修改成连接自己mqtt服务器的参数,再把Qt5Qmqtt.dll文件放到编译生成的exe同级目录下即可编译测试。
