Windows下Qt5.14.2连接华为IoTDA平台

一、华为IoTDA简介
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
(1)物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
(2)设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
(3)业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

  • 在这里插入图片描述
    物联网平台支持终端设备直接接入,也可以通过工业网关或者家庭网关接入;支持多网络接入、多协议接入、系列化Agent接入,解决设备接入复杂多样化和碎片化难题;也提供了丰富完备的设备管理能力,简化海量设备管理复杂性,提升管理效率。

二、如何在华为IoTDA购买产品
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、在已经购买的实例中创建产品
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建完成后进入创建的产品,进行产品模型设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击【新增属性】,添加产品需要收发的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果还需要进行云端下发指令控制设备,那么还需要点击【添加命令】,进行指令的设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
四、创建设备
在【所有设备】界面,点击右上角的【注册设备】添加设备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保存并关闭后会生成一个文件DEVICES-KEY.txt
在这里插入图片描述
获取MQTT三元组
用下面的网页生成三元组:Huaweicloud IoTDA Mqtt ClientId Generator (myhuaweicloud.com)

在这里插入图片描述
平台地址和接口获取,找到MQTT协议下的平台地址和端口号,使用的是MQTT,所以端口是1883
在这里插入图片描述
至此在华为IoTDA上已经创建好一个产品实例!

五、Windows下Qt5.14.2搭建MQTT环境
(1)首先从https://github.com/qt/qtmqtt/tree/5.14.2 下载qtmqtt库代码!,记住这边要下载对应Qt版本的
在这里插入图片描述
(2)下载OK后进行解压,并用Qt打开这个工程,如下图所示!
在这里插入图片描述
(3)因为Qt的安装路径下没有qtmqtt相关的头文件,所以编译这个工程目录之前,要把相关的头文件拷贝到Qt的安装目录下!
在这里插入图片描述
(4)打开Qt的安装目录:D:\Qt\Qt5.14.2\5.14.2\mingw73_64\include 这个目录下新建一个目录QtMqtt,然后把上图的头文件拷贝进QtMqtt目录
在这里插入图片描述
(5)回到Qt界面,然后直接点击“运行”按钮,等待片刻,就OK了!
在这里插入图片描述
在这里插入图片描述
(6)第5步运行结束之后,打开其DEBUG目录,如下所示
在这里插入图片描述
(7)把该目录下的bin目录下文件,拷贝到Qt的安装目录里的bin目录下!
在这里插入图片描述
在这里插入图片描述
(8)把lib目录下所有文件都拷贝到Qt安装目录下的lib目录下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(9)把mkspecs目录下的所有文件拷贝到Qt安装目录下的mkspecs目录下
在这里插入图片描述
在这里插入图片描述
至此Qt5.14.2的MQTT环境已经搭建OK!下面开始连接华为IoTDA平台

六、Qt连接华为IoTDA平台
(1)在Qt上新建一个工程connectIoTDA,如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)在.pro文件里新增“QT += mqtt network”,如下图所示:
在这里插入图片描述
(3)新建一个publicheader.h文件,专门用来存放华为IoTDA平台一些参数,这些参数,在前面搭建华为IoTDA产品里生成的,如下图所示:
在这里插入图片描述
在这里插入图片描述
(4)在Qt代码里新建mymqttclient类,专门用来连接华为IoTDA的!
在这里插入图片描述
mymqttclient.h文件代码如下:

#ifndef MYMQTTCLIENT_H
#define MYMQTTCLIENT_H
#include <QObject>
#include <QtMqtt/qmqttclient.h>
#include <QtMqtt/qmqttmessage.h>
#include <QtMqtt/qmqtttopicname.h>
#include <QHostInfo>
#include <QHostAddress>
#include <QByteArray>
#include "publicheader.h"

class mymqttclient : public QObject
{
    Q_OBJECT
public:
    mymqttclient();
    void mymqttInit(QString domainName, quint16 Port);
    void connectTOHuaWeiIOT(QString domainName, quint16 Port);
    void subPushTOHuaWeiIOT(QString pushContent);
    void disConnectTOHuaWeiIOT();
private:
    QMqttClient* mqttclient;
    QByteArray *msg;
};

#endif // MYMQTTCLIENT_H

mymqttclient.cpp代码如下:

#include "mymqttclient.h"
#include <QMessageBox>
mymqttclient::mymqttclient()
{
    mqttclient = new QMqttClient;
}
void mymqttclient::mymqttInit(QString domainName, quint16 Port)
{
    if(mqttclient->state() != QMqttClient::Connected)
    {
        mqttclient->setHostname(domainName);
        mqttclient->setPort(Port);
        mqttclient->setClientId(CLIENTID);
        mqttclient->setUsername(USERNAME);
        mqttclient->setPassword(PASSWORD);
        mqttclient->keepAlive();
        mqttclient->cleanSession();
        mqttclient->connectToHost();
        qDebug()<<mqttclient->state()<<":"<<"表示连接成功!!!";
    }
    else
    {
        mqttclient->disconnectFromHost();
        qDebug()<<"连接失败";
    }
}
void mymqttclient::connectTOHuaWeiIOT(QString domainName, quint16 Port)
{
    mymqttInit(domainName,Port);
}
void mymqttclient::disConnectTOHuaWeiIOT()
{
    mqttclient->disconnectFromHost();
    qDebug()<<"disconnect huaweiIOT!!";
}
void mymqttclient::subPushTOHuaWeiIOT(QString pushContent)
{
    QByteArray qba;
    qba.append(pushContent);
    qDebug()<<pushContent;
    if(mqttclient->state() == QMqttClient::Connected)
    {
        if(mqttclient->publish(QMqttTopicName(TOPIC),qba))
        {
           qDebug()<<"发布失败";
        }
        else
        {
            qDebug()<<"发布成功";
        }
    }
    else
    {
        qDebug()<<mqttclient->state();
        qDebug()<<"mqtt未连接";
    }
}

(5)主窗体布局代码如下所示:
在这里插入图片描述
在这里插入图片描述
(6)信号与槽连接代码如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Widget.h代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QLabel>
#include <QHostInfo>
#include <QHostAddress>
#include "mymqttclient.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void resolveHostname(const QString &hostname);

private:
    mymqttclient *myclient;
    QPushButton* connectToIoTDA;
    QPushButton* disconnectToIoTDA;
    QPushButton* subpushToIoTDA;
    QLabel* showLabel;
    QVBoxLayout* vboxlayout;
    QString IoTDAIPAddress;
    QLineEdit* inputLineEdit;

public slots:
    void clickConnectToIoTDA();
    void clickDisConnectToToTDA();
    void clicksubpushToIoTDA();

};
#endif // WIDGET_H

Widget.cpp代码如下:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setGeometry(100,100, 500, 150);
    connectToIoTDA = new QPushButton(this);
    connectToIoTDA->setText(tr("连接"));
    disconnectToIoTDA = new QPushButton(this);
    disconnectToIoTDA->setText(tr("断开"));
    subpushToIoTDA = new QPushButton(this);
    subpushToIoTDA->setText(tr("发布"));
    inputLineEdit = new QLineEdit(this);

    showLabel = new QLabel(this);
    vboxlayout = new QVBoxLayout;
    vboxlayout->addWidget(showLabel);
    vboxlayout->addWidget(connectToIoTDA);
    vboxlayout->addWidget(disconnectToIoTDA);
    vboxlayout->addWidget(inputLineEdit);
    vboxlayout->addWidget(subpushToIoTDA);
    this->setLayout(vboxlayout);

    myclient = new mymqttclient;

    connect(connectToIoTDA, &QPushButton::clicked, this, &Widget::clickConnectToIoTDA);
    connect(disconnectToIoTDA, &QPushButton::clicked, this, &Widget::clickDisConnectToToTDA);
    connect(subpushToIoTDA, &QPushButton::clicked, this, &Widget::clicksubpushToIoTDA);
}

Widget::~Widget()
{
}

void Widget::clickConnectToIoTDA()
{
    resolveHostname(HOSTNAME);
    myclient->connectTOHuaWeiIOT(IoTDAIPAddress, 1883);
    showLabel->setText("已经连上华为IoTDA平台!!!");

}
void Widget::clickDisConnectToToTDA()
{
    myclient->disConnectTOHuaWeiIOT();
    showLabel->setText("已经断开华为IoTDA平台!!!");
}
//这边是将设备消息进行上报
void Widget::clicksubpushToIoTDA()
{
    QString content = inputLineEdit->text();
    myclient->subPushTOHuaWeiIOT(content);
}

//将主机名解析成IP地址
void Widget::resolveHostname(const QString &hostname)
{
    QHostInfo info = QHostInfo::fromName(hostname);
    foreach (const QHostAddress &address, info.addresses())
    {
        if (address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            IoTDAIPAddress = address.toString();
            qDebug() << "IPv4 address:" << IoTDAIPAddress;
        } else if (address.protocol() == QAbstractSocket::IPv6Protocol)
        {
            qDebug() << "IPv6 address:" << address.toString();
        }
    }
}

(7)设备消息进行上报到华为IoTDA平台,根据华为IoTDA的Topic管理,可以得出所需要的信息,如下图所示:
在这里插入图片描述
(8)这里示例是进行设备消息的上报,也就是我们的Topic的命令是“$oc/devices/{device_id}/sys/messages/up”
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(9)至此代码部分已经完成,下面进行运行!点击运行按钮!如下图所示
在这里插入图片描述
(10)点击窗体里的“连接”按钮
在这里插入图片描述
在这里插入图片描述
(11)在输入框里输入“hello IoTDA”,然后点击“发布”按钮
在这里插入图片描述
在这里插入图片描述
在华为IoTDA平台里,查看相关日志,我们就可以发现刚才所发布的消息内容!
在这里插入图片描述
在这里插入图片描述
至此Windows下Qt5.14.2连接华为IoTDA平台成功!后续其他功能自行拓展!

文章配套的代码:https://download.csdn.net/download/xiaopang1122/89399796

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣200. 岛屿数量(BFS)

Problem: 200. 岛屿数量 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义方向数组&#xff1a;定义一个方向数组 DIRECTIONS&#xff0c;表示上、下、左、右四个方向的移动。 2.获取网格的行数和列数同时初始化一个计数器 numIslands 用于记录岛屿的数量。 …

【新书上市】图像画质算法与底层视觉技术

图书主页&#xff1a;https://book.douban.com/subject/36895899/ 购买链接&#xff1a;https://item.jd.com/10105601481762.html 内容介绍 本书主要介绍了图像画质相关的各类底层视觉任务及其相关算法&#xff0c;重点讲解了去噪、超分辨率、去雾、高动态范围、图像合成与图…

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层&#xff08;无线局域网&#xff09; 什么是无线局域网IEEE 802.11主要标准及其特点&#xff1a; 802.11的MAC帧样式 我们来看看无线局域网&#xff1a; 什么是无线局域网 无线局域网&#xff08;Wireless Local Area Network&#xff0c;简称WLAN…

LLM之RAG实战(三十九)| 高级RAG技术全面解析(附代码)

一、高级RAG概述 基本 RAG 的工作流程可分为三个步骤&#xff1a;索引、检索和生成。在索引阶段&#xff0c;文本被转换为嵌入&#xff0c;然后存储在向量数据库中以创建可搜索的索引。在检索步骤中&#xff0c;用户的查询也被转换为嵌入&#xff0c;此嵌入用于在向量数据库中搜…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的&#xff0c;包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误&#xff1a;如果模型在导入或创建时材质没有正确加载或设置&…

力扣 54.螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…

[SaaS] AI+数据,tiktok选品,找达人,看广告数据

TK观察专访丨前阿里“鲁班”创始人用AIGC赋能TikTok获千万融资用AI数据做TikTokhttps://mp.weixin.qq.com/s/xp5UM3ROo48DK4jS9UBMuQ主要还是爬虫做数据的。 商家做内容&#xff1a;1.找达人拍内容&#xff0c;2.商家自己做原生自制内容&#xff0c;3.广告内容。 短视频&…

MariaDB数据导入与导出操作演示

文章目录 整个数据库导出导入先删除库然后再导入 参考这里&#xff1a; MariaDB数据库导出导入. 整个数据库 该部分演示&#xff1a;导出数据库&#xff0c;然后重建数据库&#xff0c;并导入数据的整个过程。 导出 Win R &#xff0c;打开运行输入cmd并回车&#xff0c;然…

chatglm3-6b小试

原本想在VMware中装个unbutu&#xff0c;再搞chatglm&#xff0c;但经过调研发现业内都是采用双系统来搞chat的开发。于是只好用rufus制作了一个ubuntu22.04的系统盘&#xff0c;你需要准备8G&#xff0c;因为制作好镜像后是7个多G。安装这里就不说了。 1 ubuntu环境 安装好ubu…

python基础篇(2):字符串扩展知识点

1 字符串的三种定义方式 字符串在Python中有多种定义形式&#xff1a; &#xff08;1&#xff09;单引号定义法 name 博主帅绝上下五千年 print(name) print(type(name)) 效果如下&#xff1a; &#xff08;2&#xff09;双引号定义法 name "博主帅绝上下五千年&qu…

CUDA12.0 + cuDNN9.0.0安装

目录 1. 查看显卡支持的CUDA版本1.1 指令查看1.2 控制面板查看 2. 安装CUDA2.1 下载2.2 安装2.3 验证 3. 安装cuDNN3.1 下载3.2 安装3.2 验证 1. 查看显卡支持的CUDA版本 1.1 指令查看 打开cmd输入nvidia-smiDriver Version表示显卡驱动版本&#xff0c;CUDA Version表示支持…

【AndroidStudio旧版本BUG问题】完美解决运行报错问题Invalid keystore format

由于之前安装的版本导致AndroidStudio 运行报错&#xff1a;Invalid keystore format 在如下截图的路径中删了debug.keystore重新打开Android Studio运行一下就好了&#xff01;&#xff01;&#xff01; 下面介绍各个模块功能&#xff1a; adbkey 是 Android Debug Bridge (AD…

【数据库】SQL--DQL(初阶)

文章目录 DCL1. 基本介绍2. 语法2.1 基础查询2.2 条件查询2.3 聚合函数2.4 聚合查询2.5 分组查询2.6 排序查询2.7 分页查询2.8 综合案例练习2.9 执行顺序 3. DQL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DQL英…

Linux下SpringBoot项目部署(centos系统)

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…

【数据库初阶】SQL--DCL

文章目录 DCL1. 基本介绍2. 用户管理2.1 查询用户2.2 创建用户2.3 修改用户密码2.4 删除用户 3. 权限控制3.1 查询权限3.2 授予权限3.3 撤销权限 4. DCL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DCL英文全称是…

Docker 部署 Redis Cluster 高性能高可用分片集群

文章目录 1、环境准备2、Cluster 集群讲解2.1、Cluster 介绍2.2、Cluster 和哨兵模式区别2.3、Cluster 如何分散存储数据 3、Cluster 搭建流程3.1、安装 Docker3.2、启动 Redis 容器3.3、创建 Cluster 集群 4、Cluster 集群测试4.1、读写操作4.2、故障转移 1、环境准备 准备6台…

计算机网络 ——数据链路层(广域网)

计算机网络 —— 广域网 什么是广域网PPP协议PPP协议的三个部分PPP协议的帧格式 HDLC协议HDLC的站HDLC的帧样式 PPP和HDLC的异同 我们今天来看广域网。 什么是广域网 广域网&#xff08;Wide Area Network&#xff0c;简称WAN&#xff09;是一种地理覆盖范围广泛的计算机网络…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口&#xff0c;然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习&#xff0c;建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

Springboot高手之路01-AOP

文章目录 登录校验拦截器 基于拦截器实现登录校验功能全局异常处理器 登录校验 拦截器 拦截器是spring中提供的 所以第一步就是把拦截器交给spring管理 不管是过滤器还是拦截器都是需要配置路径 /** 拦截所有 拦截器放行直接是true 是否运行访问对应的web资源 拦截器实现Ha…