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_OBJECTpublic: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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教师自费出书的注意事项有哪些?

备案主编专著的优势&#xff1a;&#xff08;qkfb88688&#xff09; 1、副高、正高职称最高学术成果 2、专著可以代替核心 3、周期短、出书快、可重复使用 4、双号齐全&#xff1a;ISBN&#xff5e;CIP 5、版权长期有效 教师自费出书有以下一些注意事项&#xff1a; 关于书稿&…

二、线性回归模型

目录 一、线性回归 1.模型示例 2.代码实验&#xff08;C1_W1_Lab03_Model_Representation&#xff09; (1).工具使用 (2).问题描述-房价预测 (3).输入数据 (4).绘制数据集坐标点 (5).建模构造函数 二、代价函数&#xff08;Cost function&#xff09; 1.解释一下概念…

mysql用户管理知识点

1、权限表 1.1、user表 1.1.1、用户列 Host、User、Password分别表示主机名、用户名、密码 1.1.2、权限列 决定了用户的权限&#xff0c;描述了在全局范围内允许对数据和数据库进行操作。 1.1.3、安全列 安全列有6个字段&#xff0c;其中两个是ssl相关的&#xff0c;2个是x509相…

敦煌网、ebay、速卖通等平台一直被差评怎么办?

在电商行业里一直都有一句话&#xff0c;有评行走天下&#xff0c;无评寸步难行 而没有review打造爆款的案例是少之甚少&#xff0c;众所周知&#xff0c;review已经成为用户衡量一件商品的标尺&#xff0c;目前我也是看到一个文章上面写到&#xff0c;一个卖家表示自己平时运…

形如SyntaxError: EOL while scanning string literal,以红色波浪线形式在Pycharm下出现

背景&#xff1a; 新手在学习Python时可能会出现如下图所示的报错 下面分情况教大家如何解决 视频教程【推荐】&#xff1a; 形如SyntaxError: EOL while scanning string literal&#xff0c;以红色波浪线形式在Pycharm下出现 过程&#xff1a; 问题概述&#xff1a; 简单…

React中使用 ts 后,craco库配置别名时需要注意什么?

文章目录 前言编译报错如下解决方式总结 前言 我们都知道craco库可以用来覆盖react配置&#xff0c;如设置别名等。但是在项目使用 Typescript 后&#xff0c;我们需要额外配置&#xff0c;否则会造成编译报错。 详细craco配置可以查看之前文章&#xff1a; 项目初始化与配置…

探索 LLM 预训练的挑战,GPU 集群架构实战

万卡 GPU 集群实战&#xff1a;探索 LLM 预训练的挑战 一、背景 在过往的文章中&#xff0c;我们详细阐述了LLM预训练的数据集、清洗流程、索引格式&#xff0c;以及微调、推理和RAG技术&#xff0c;并介绍了GPU及万卡集群的构建。然而&#xff0c;LLM预训练的具体细节尚待进一…

Vue06-el与data的两种写法

一、el属性 用来指示vue编译器从什么地方开始解析 vue的语法&#xff0c;可以说是一个占位符。 1-1、写法一 1-2、写法二 当不使用el属性的时候&#xff1a; 两种写法都可以。 v.$mount(#root);写法的好处&#xff1a;比较灵活&#xff1a; 二、data的两种写法 2-1、对象式…

【面试干货】SQL中count(*)、count(1)和count(column)的区别与用法

【面试干货】SQL中count&#xff08;*&#xff09;、count&#xff08;1&#xff09;和count&#xff08;column&#xff09;的区别与用法 1、count(*)2、count(1)3、count(column) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在SQL中&a…

CSS函数:fit-content与matrix的使用

网格函数 fit-content()属于网格函数&#xff0c;除此之外的网格函数还有&#xff1a;CSS函数&#xff1a; 实现数据限阈的数字函数。顾名思义&#xff0c;这三个函数只能在网格布局中使用。fit-content()函数主要是用于给定布局可用大小&#xff0c;适应内容&#xff0c;其功…

MySQL事务与MVCC

文章目录 事务和事务的隔离级别1.为什么需要事务2.事务特性1_原子性&#xff08;atomicity&#xff09;2_一致性&#xff08;consistency&#xff09;3_持久性&#xff08;durability&#xff09;4_隔离性&#xff08;isolation&#xff09; 3.事务并发引发的问题1_脏读2_不可重…

基于小波域优化Savitzky–Golay滤波器的脑电图信号的运动伪影去除方法(MATLAB R2018A)

在获取或采集数据的过程中&#xff0c;不可避免地将噪声引入到数据中&#xff0c;噪声的存在使得原始数据发生变异&#xff0c;对数据的处理及分析产生严重地影响。常用的去噪模型有平滑去噪、均值去噪。其中&#xff0c;平滑去噪又包括移动平均平滑法和Savitzky-Golay卷积平滑…

一周学会Django5 Python Web开发 - Django5内置Auth认证系统-用户注册实现

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计57条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

keil下载及安装(社区版本)

知不足而奋进 望远山而前行 目录 文章目录 前言 Keil有官方版本和社区版本&#xff0c;此文章为社区版本安装&#xff0c;仅供参考。 1.keil MDK 2.keil社区版介绍 3.keil下载 (1)打开进入登录界面 (2)点击下载,跳转到信息页面 (3)填写个人信息,点击提交 (4)点击下载…

韩国Neowine推出第三代强加密芯片ALPU-CV

推出第三代加密芯片&#xff1b;是ALPU系列中的高端IC&#xff1b;是一款高性能车规级加密芯片&#xff1b;其加密性更强、低耗电、体积小&#xff1b;使得防复制、防抄袭板子的加密性能大大提升&#xff0c;该芯片通过《AEC-Q100》认证&#xff0c;目前已经在国产前装车辆配件…

VMware Workstation虚拟机安装 CentOS 7.9 后ping ip地址出现错误:Network is unreachable

VMware Workstation虚拟机安装 CentOS 7.9 后ping ip地址出现错误&#xff1a;Network is unreachable 解决步骤&#xff1a; 进入目录 进入/etc/sysconfig/network-scripts/&#xff0c; cd /etc/sysconfig/network-scripts/修改文件 vi ifcfg-ens33变更项 ONBOOTyes保存…

算法学习笔记(7.6)-贪心算法(霍夫曼编码)

目录 1.什么是霍夫曼树 2.霍夫曼树的构造过程 3.霍夫曼编码 3.1具体的作用-频率统计 ##实战题目 1.什么是霍夫曼树 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也…

ast.js是什么?

在devtools分析网站时&#xff0c;出现了ast.js的页面。那么&#xff0c;什么是ast.js?它有什么用&#xff1f; 经查询&#xff0c;AST是抽象语法树&#xff08;Abstract Syntax Tree&#xff09;也称为AST语法树&#xff0c;指的是源代码语法所对应的树状结构。也就是说&…

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部&#xff0c;刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…