這篇文章主要是分享QT智能家居項(xiàng)目的代碼
在我看來,QT MQTT的使用主要難點(diǎn)就是對于環(huán)境的搭建,在我們把環(huán)境搭建完之后,接下來就是傳統(tǒng)手藝了,我們只要知道相應(yīng)的庫函數(shù),調(diào)用它,就能實(shí)現(xiàn)我們所需要的功能了。
所以,在這里我也只是簡單的分享一下我寫的第一版代碼,希望能夠?qū)Ω魑惶峁┑綆椭?/p>
若是有什么疑問,或者有什么更好的想法,也可以聯(lián)系我,我盡量幫你們解決。
我們主要是使用MQTT協(xié)議以及ONENET云來實(shí)現(xiàn)數(shù)據(jù)從硬件端到PC端的傳輸以及控制指令的下發(fā)。
mainwindows.h代碼
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "QMqtt/qmqtt.h"
#include <QTime>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btn_connect_clicked();
void on_btn_send_clicked();
void on_btn_close_clicked();
void connect_success_slot();
void connect_error_slot(const QMQTT::ClientError error);
void disconnect_slot();
void received_slot(const QMQTT::Message& msg);
void on_clear_clicked();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void ClickButton0();
void ClickButton1();
void ClickButton2();
void ClickButton3();
// void onTimeOut();
private:
Ui::MainWindow *ui;
QMQTT::Client *client;
int flag0;
int flag1;
int flag2;
int flag3;
QTimer *tim;
};
#endif // MAINWINDOW_H
mainwindows.cpp代碼
這幾句代碼是用來設(shè)置你連接的ONENET設(shè)備的,因?yàn)槲也恍枰膐nenet平臺設(shè)備,所以直接將其內(nèi)置在代碼中了

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QMqtt/qmqtt.h"
#include <QtNetwork>
#include <QHoverEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//連接onenet云平臺
client = new QMQTT::Client(QHostAddress("183.230.40.39"),6002);
client->setClientId("943137931");//設(shè)備ID
client->setUsername("506581"); //產(chǎn)品ID
client->setPassword("123456"); //鑒權(quán)信息ID
client->setVersion(QMQTT::MQTTVersion::V3_1_1);
connect(client,SIGNAL(connected()),this,SLOT(connect_success_slot()));
connect(client,SIGNAL(received(const QMQTT::Message&)),this,SLOT(received_slot(const QMQTT::Message&)));
connect(client,SIGNAL(error(const QMQTT::ClientError)),this,SLOT(connect_error_slot(const QMQTT::ClientError)));
connect(client,SIGNAL(disconnected()),this,SLOT(disconnect_slot()));
//
connect(ui->btn_send, SIGNAL(clicked()), this, SLOT(ClickButton0()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(ClickButton1()));
connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(ClickButton2()));
connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(ClickButton3()));
flag0 = 0;
flag1 = 0;
flag2 = 0;
flag3 = 0;
tim = new QTimer();
tim->setInterval(5000);
connect(tim,SIGNAL(timeout()),this,SLOT(onTimeOut()));
tim->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
//連接onenet云
void MainWindow::on_btn_connect_clicked()
{
client->connectToHost();
}
// 連接成功后輸出“connect success”并訂閱主題
void MainWindow::connect_success_slot(){
qDebug() << "connect success";
client->subscribe("Celsius",0);
client->subscribe("Humidity",0);
client->subscribe("Rain",0);
client->subscribe("Smoke",0);
client->subscribe("Light",0);
client->subscribe("Far",0);
client->subscribe("test",0);
ui->output->setText("連接成功");
}
//連接出現(xiàn)錯誤時在控制臺輸出錯誤
void MainWindow::connect_error_slot(const QMQTT::ClientError error){
qDebug() << "錯誤" << error;
}
// 斷開連接輸出disconnect___
void MainWindow::disconnect_slot(){
qDebug() << "disconnect___";
ui->output->setText("斷開連接");
}
//斷開onenet云
void MainWindow::on_btn_close_clicked()
{
client->disconnectFromHost();
}
// 將對應(yīng)主題的數(shù)據(jù)輸出到對用的文本框中
void MainWindow::received_slot(const QMQTT::Message& msg){
QString strPayload(msg.payload());
if(msg.topic() == "Celsius")
ui->le_receive->setText(strPayload);
if(msg.topic() == "Humidity")
ui->le_send->setText(strPayload);
if(msg.topic() == "Rain")
ui->rain->setText(strPayload);
if(msg.topic() == "Smoke")
ui->smoke->setText(strPayload);
if(msg.topic() == "Light")
ui->light->setText(strPayload);
if(msg.topic() == "Far")
ui->far->setText(strPayload);
if(msg.topic() == "test")
ui->lineEdit->setText(strPayload);
}
//清空文本框
void MainWindow::on_clear_clicked()
{
ui->le_receive->setText("");
ui->le_send->setText("");
ui->far->setText("");
ui->rain->setText("");
ui->light->setText("");
ui->smoke->setText("");
ui->lineEdit->setText("");
}
//下發(fā)指令
void MainWindow::on_btn_send_clicked()
{
if(ui->btn_send->text() == "打開水泵"){
QString controal = "t";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
if(ui->btn_send->text() == "關(guān)閉水泵"){
QString controal = "y";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
}
void MainWindow::on_pushButton_clicked()
{
if(ui->pushButton->text() == "開燈"){
QString controal = "q";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
if(ui->pushButton->text() == "關(guān)燈"){
QString controal = "w";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
}
void MainWindow::on_pushButton_2_clicked()
{
if(ui->pushButton_2->text() == "開警報"){
QString controal = "e";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
if(ui->pushButton_2->text() == "關(guān)警報"){
QString controal = "r";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
}
void MainWindow::on_pushButton_3_clicked()
{
if(ui->pushButton_3->text() == "打開風(fēng)扇"){
QString controal = "d";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
if(ui->pushButton_3->text() == "關(guān)閉風(fēng)扇"){
QString controal = "f";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
}
void MainWindow::on_pushButton_4_clicked()
{
QString controal = "z";
QMQTT::Message msg(110,"Controal",controal.toUtf8());
client->publish(msg);
}
void MainWindow::ClickButton0()
{
if(!flag0){
ui->btn_send->setText("關(guān)閉水泵");
flag0 = 1;
}
else{
ui->btn_send->setText("打開水泵");
flag0 = 0;
}
}
void MainWindow::ClickButton1()
{
if(!flag1){
ui->pushButton->setText("關(guān)燈");
flag1 = 1;
}
else{
ui->pushButton->setText("開燈");
flag1 = 0;
}
}
void MainWindow::ClickButton2()
{
if(!flag2){
ui->pushButton_2->setText("關(guān)警報");
flag2 = 1;
}
else{
ui->pushButton_2->setText("開警報");
flag2 = 0;
}
}
void MainWindow::ClickButton3()
{
if(!flag3){
ui->pushButton_3->setText("關(guān)閉風(fēng)扇");
flag3 = 1;
}
else{
ui->pushButton_3->setText("打開風(fēng)扇");
flag3 = 0;
}
}
//void MainWindow::onTimeOut()
//{
// QString controal = "i";
// QMQTT::Message msg(110,"Controal",controal.toUtf8());
// client->publish(msg);
//}
運(yùn)行結(jié)果
連接成功狀態(tài)

斷開連接狀態(tài)

這次代碼只是第一版,簡單的實(shí)現(xiàn)了數(shù)據(jù)接收與指令下發(fā)的功能,若是以后有改進(jìn),會在之后分享給大家。
代碼鏈接:
百度網(wǎng)盤:
鏈接:https://pan.baidu.com/s/1Qh5EV0x_xVEhUhfWkLMQpQ?pwd=flas
提取碼:flas文章來源:http://www.zghlxwxcb.cn/news/detail-602564.html
希望對諸君有所幫助文章來源地址http://www.zghlxwxcb.cn/news/detail-602564.html
到了這里,關(guān)于QT使用MQTT協(xié)議連接ONENET云平臺:智能家居PC客戶端開發(fā)筆記-2 項(xiàng)目開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!