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

本文档介绍了如何在Ubuntu系统中,使用QMQTT库连接阿里云物联网平台。首先从GitHub下载并集成QMQTT源码到工程,然后配置.pro文件以支持MQTT和网络连接。接着设置MQTT客户端参数,包括产品密钥、设备名、设备秘钥等,并实现连接、断开、订阅和发布消息的槽函数。最后,通过点击按钮发布消息,并在阿里云物联网平台上验证设备的在线状态。
摘要由CSDN通过智能技术生成

前提:

(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);
    mqtt_client->publish(send_msg);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值