欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Ubuntu下Qt连接阿里云mqtt服务器

时间:2023-06-05
前提:

(1)阿里云物联网平台创建产品-创建设备(略)

(2)Ubuntu可以成功连接外网(可以通过 ping www.baidu.com 来测试)

步骤:

① 源码下载地址:https://github.com/emqx/qmqtt

下载完之后解压,然后将 src/mqtt 文件夹拷贝到你的工程根目录下,如:(smartHome是我的工程项目名)

② 然后在 .pro 文件中添加 mqtt 相关的头文件和源文件:

注意:在导入库之后,一定要在.pro文件中添加如下代码:QMAKE_CXXFLAGS += -std=c++11

编译时才不会报错!!!

③ 接着编译运行,之后工程项目的目录结构就会变成这样:

④ 测试

在.pro文件中添加 QT += network;

homepage.h:

#ifndef CONTROL_H#define CONTROL_H#include #include "mqtt/qmqtt.h"//添加mqtt头文件#include #include #include #include namespace Ui {class Control;}class Control : public QWidget{ Q_OBJECTpublic: explicit Control(QWidget *parent = 0); ~Control();public slots: void doDataReceived(QMQTT::Message msg); void doConnected(); void doDisconnected(); void doSubscribed(QString,quint8); void doPublished(QMQTT::Message,quint16);private slots: void on_public_btn_clicked();private: Ui::Control *ui; QMQTT::Client *mqtt_client; QString m_strProductKey,m_strDeviceName,m_strDeviceSecret,m_strHostName,m_strRegionId,m_strPubTopic,m_strSubTopic,message;};#endif // CONTROL_H

homepage.cpp:

#include "control.h"#include "ui_control.h"Control::Control(QWidget *parent) : QWidget(parent), ui(new Ui::Control){ ui->setupUi(this); mqtt_client = new QMQTT::Client; //需要跟阿里云Iot平台一致 m_strProductKey = "gl9f****2vi"; m_strDeviceName = "Car_Robot"; m_strDeviceSecret = "4ffff06e47114ed043****0a563848730"; m_strRegionId = "cn-shanghai"; m_strHostName = m_strProductKey + ".iot-as-mqtt." + m_strRegionId + ".aliyuncs.com"; m_strPubTopic = "/sys/gl9f****2vi/Car_Robot/thing/event/property/post"; m_strSubTopic = "/sys/gl9f****2vi/Car_Robot/thing/service/property/set"; //配置mqtt mqtt_client->setHostName(m_strHostName);//设置域名 mqtt_client->setPort(1883);//设置端口 mqtt_client->setUsername(m_strDeviceName + "&" + m_strProductKey); mqtt_client->setClientId("gl9f****2vi.Car_Robot|securemode=2,signmethod=hmacsha256,timestamp=2524608000000|"); mqtt_client->setPassword("5412620810a7bee538a****a0aecc40ba7bf40861372be570e53dbdaf46fb4b9"); mqtt_client->setKeepAlive(30);//保活心跳时间取值范围为30秒~1200秒。如果心跳时间不在此区间内,阿里云物联网平台会拒绝连接 //绑定槽函数 connect(mqtt_client,SIGNAL(connected()),this,SLOT(doConnected()));//连接成功 //连接mqtt服务器 mqtt_client->connectToHost(); //断开连接 //mqtt_client->disconnectFromHost();}Control::~Control(){ delete ui;}void Control::doConnected(){ qDebug("connect succeed"); //绑定槽函数(槽函数的形参要和绑定的信号一样) connect(mqtt_client,SIGNAL(received(QMQTT::Message)),this,SLOT(doDataReceived(QMQTT::Message)));//接收到订阅的消息 connect(mqtt_client,SIGNAL(disconnected()),this,SLOT(doDisconnected()));//断开连接 connect(mqtt_client,SIGNAL(subscribed(QString,quint8)),this,SLOT(doSubscribed(QString,quint8)));//订阅成功 connect(mqtt_client,SIGNAL(published(QMQTT::Message,quint16)),this,SLOT(doPublished(QMQTT::Message,quint16)));//发布成功 mqtt_client->subscribe(m_strSubTopic);//订阅}void Control::doDisconnected(){ qDebug("disconnect succeed");}void Control::doPublished(QMQTT::Message, quint16){ qDebug("public succeed");}void Control::doSubscribed(QString, quint8){ qDebug("subscribe succeed");}void Control::doDataReceived(QMQTT::Message msg){ QString data = msg.payload(); qDebug()<<"===== received data:"<publish(send_msg);}

clean 之后编译运行,然后去阿里云物联网平台查看对应的设备状态,可以看到是处于【在线】状态了。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。