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.rhkb.cn/news/348026.html

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

相关文章

JAVA:在IDEA引入本地jar包的方法并解决打包scope为system时发布无法打包进lib的方案

一.引入本地Jar包的步骤 有时maven依耐的包是本地的jar包&#xff0c;此时需要进行以下步骤设置。 步骤1.在pom.xml中添加插件设置,将system范围包含进来&#xff0c;此设置是为了在打包时&#xff0c;本地jar包自动生成到部署包里。(若无法打进包&#xff0c;请参考下文的方…

面向对象三大特征之:封装

文章目录 什么是封装&#xff1f;封装的设计规范 什么是封装&#xff1f; 就是用类设计对象处理某一个事物的数据时&#xff0c;应该把要处理的数据&#xff0c;以及处理这些书记的方法设计到一个对象中去。 封装的设计规范 合理隐藏&#xff0c;合理暴露 public就是都能访问…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

服务器配置(初始化)

一&#xff1a;什么是云服务器及用途&#xff1a; 云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件&#xff0c;即可迅速创建或释放任意多台云服务器。 我个人感觉就…

录取查询小程序怎么制作?

招生老师往往需要花费大量的时间和精力去手动整理学生的录取信息&#xff0c;并一一通知学生。那时的录取查询系统&#xff0c;复杂而繁琐&#xff0c;要处理大量的数据&#xff0c;还要确保信息的准确无误和安全。经常为了发布录取结果&#xff0c;不得不加班到深夜&#xff0…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte &#xff08;Silhouette的界面介绍&#xff09; Part 2: The shape divisions and manual roto&#xff08;形状分区和手动roto工作&#xff09;: Part 3: tracking &#xff1a; Part 4: Mocha Tracking Part 5: Motion Blur(…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途&#xff1a;字段截取从指定开始的字符开始&#xff0c;截取要的数&#xff1b;指定开始的字符数字可以用负的&#xff0c;指定开始的字符从后往前(向左)数&#xff0c;截取要的数不能为负。 语…

mysql知识点

目录 1、数据库定义语言&#xff08;DDL&#xff09;&#xff08;1&#xff09;创建数据库&#xff08;2&#xff09;创建表SQL数据类型列级约束条件表级约束条件&#xff08;3&#xff09;修改表 2、数据库操纵语言&#xff08;DML&#xff09;&#xff08;1&#xff09;插入数…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时&#xff0c;发生第一次捕获&#xff0c;计数器CNT 的值会被锁存到捕获寄存器CCR中&#xff0c;而且还会进入捕获中断&#xff0c;在中断服务程序中记录一次捕获&#xff08;可以用一个标志变量来记录&#…

Linux “ 软件管理 “

软件管理 widows 安装 方法一&#xff1a; 双击exe安装包&#xff0c;就可以安装。 用exe安装的软件会破记录到注册表中。 注册会记录安装位置&#xff0c;软件名称。 方法二&#xff1a; 用绿色方式进行安装。 不用写到注册表中&#xff0c;因此无法在开始菜单里面查看和卸…

【Java】解决Java报错:IllegalArgumentException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…

LM2576系列3A开关型DCDC BUCK降压稳压器

前言&#xff1a; 老款DCDC&#xff0c;使用历史几十年了&#xff0c;今天设计仍然使用这个DCDC的&#xff0c;是不合适的。主要缺点是开关频率较低只有几十Khz&#xff0c;导致需要使用较大感量的功率电感&#xff0c;这样的电感价格较高&#xff0c;且占用PCB空间较大&#…

【机器学习300问】114、什么是度量学习?三元组损失又是什么?

这些天都在加强自己的CV基本功&#xff0c;之前做过的人脸识别项目里有很多思考&#xff0c;在学习了这些基础知识后&#xff0c;我再次回顾了之前的人脸识别项目。我发现&#xff0c;很多之前困惑不解的问题现在都有了清晰的答案。 一、什么是度量学习&#xff1f; 度量学习也…

Spring框架是如何查找方法上的异步任务注解@Async

结论先行 Spring框架层面&#xff0c;查找方法上的注解的原理与机制是一样的。 在方法层面&#xff0c;Spring框架已经找到子类的Async注解&#xff0c;原因是查找注解会搜索整棵类型继承树&#xff0c;包括超类和实现的接口。 异步任务代码示例 Async注解&#xff0c;在父类…

0605 实际集成运算放大器的主要参数和对应用电路的影响

6.5.1 实际集成运放的主要参数 6.5.2 集成运放应用中的实际问题 6.5.2 集成运放应用中的实际问题

【python】tkinter GUI开发: Button和Entry的应用实战探索

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Spark参数配置不合理的情况

1.1 内存设置 &#x1f4be; 常见的内存设置有两类&#xff1a;堆内和堆外 &#x1f4a1; 我们作业中大量的设置 driver 和 executor 的堆外内存为 4g&#xff0c;造成资源浪费 &#x1f4c9;。 通常 executor 堆外内存在 executor.cores1 的时候&#xff0c;1g 足够了&…

傲医医疗集成引擎 Rhapsody 在超融合信创平台表现如何?

作者&#xff1a;SmartX 商业团队 黄玉辉 随着越来越多的医疗用户基于超融合基础设施实现 IT 基础架构信创转型&#xff0c;超融合信创架构在医疗业务场景中的实际表现也得到更多关注。尤其是集成平台业务场景——作为三甲医院互联互通评级中不可缺少的核心业务系统&#xff0…

条件判断if语句与case语句

一、条件测试 test命令进行条件测试&#xff0c;然后根据返回值来判断条件是否成立。 常用操作符&#xff1a; -e &#xff1a;既可以测试文件又可以测试目录是否存在 -d &#xff1a;测试目录是否存在 -f &#xff1a;测试文件是否存在 -r &#xff1a;测试当前用户是否…

delmia中机器人末端固定工具

1 需要在工具上面建立点 在Device Building模式下 2 然后通过 set tool可以设置