0
点赞
收藏
分享

微信扫一扫

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

小迁不秃头 2022-02-14 阅读 49

前提:

(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 <QWidget>
#include "mqtt/qmqtt.h"	//添加mqtt头文件
#include <QtNetwork/QtNetwork>
#include <QtNetwork/QHostAddress>
#include <QString>
#include <QDebug>


namespace Ui {
class Control;
}

class Control : public QWidget
{
    Q_OBJECT

public:
    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:"<<data;
}

void Control::on_public_btn_clicked()
{
    //发布消息
    message = "{\"method\":\"thing.service.event.post\",\"id\":\"1075874688\",\"params\":{\"Speed\":22,\"Start\":1,\"Direction\":2},\"version\":\"1.0.0\"}";
    QMQTT::Message send_msg(136,m_strPubTopic1,message.toLocal8Bit(),0);
    qDebug()<<"====send_msg:"<<send_msg;
    mqtt_client->publish(send_msg);
}

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

举报

相关推荐

0 条评论