【前言】
环境监测是当前很多场景需要的项目,刚好我正在论坛参与的一个项目:Thingy:91X 蜂窝物联网原型开发平台的试用。把两个项目结合起来,实现一个简单的环境监测系统。
【硬件平台】
1、米尔-STM32MP257开发板
2、Thingy:91X
【项目规划】
1、米尔-STM32MP257开发板,板载了wifi模块,通过wifi连接到互联网。
2、启用MQTT,连接到私有的服务器,并订阅指定的主题。
3、使用QT设计UI界面。
4、接收数据并在UI界面中展示。
【QT设计】
【米尔-STM32MP257开发板】创建QT开发环境 - 工业自动化与控制 - 电子工程世界-论坛在这一篇文章我详细的分享了如何使用米尔提供的SDK来创建QT的开发环境。
1、在文章介绍的基础上,我创建了一个基于QT的桌面程序,其UI界面如下:
2、给相应的需要显示的label根据接收的数据,定义了相应的标签值:
3、引入QT的QtMqtt/QMqttClient 库
- #include <QtMqtt/QMqttClient>
【注】在官方发布的固件中,是没有QTMqtt的连接文件的,当运行带的QtMqtt的程序会报错:
- error while loading shared libraries: libQt5Mqtt.so.5: cannot open shared object file: No such file or directory
需要从SDK中复制到开发板目录中。
4、同时为了实现检测与MQTT服务器的连接状态,需要引入一个线程,用于检测是否连接到服务器:
- void run() override
- {
- while (true)
- {
- if (m_client)
- {
- QString statusText = m_client->state() == QMqttClient::Connected
- ? "连接服务器:成功"
- : "连接服务器:失败";
- emit updateStatus(statusText);
- }
- msleep(1000);
- }
- }
5、在main中编写代码如下:
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent), ui(new Ui::MainWindow), m_client(new QMqttClient(this))
- {
- ui->setupUi(this);
-
-
- m_client->setHostname("hostname");
- m_client->setPort(1883);
- m_client->setClientId("client_id");
- m_client->setUsername("usrename");
- m_client->setPassword("pwd");
-
-
- connect(m_client, &QMqttClient::connected, this, [this]()
- {
-
- ui->mqtt_client_state->setText("连接服务器:成功");
-
-
- m_client->subscribe(QMqttTopicFilter("devacademy/publish/topic")); });
-
-
- connect(m_client, &QMqttClient::messageReceived, this, &MainWindow::onMessageReceived);
-
-
- m_client->connectToHost();
-
-
- MqttConnectionChecker *checker = new MqttConnectionChecker(m_client, ui->mqtt_client_state, this);
- connect(checker, &MqttConnectionChecker::updateStatus, this, [this](const QString &status)
- { ui->mqtt_client_state->setText(status); });
- checker->start();
- }
6、编译订阅回调如下:
- void MainWindow::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
- {
- Q_UNUSED(topic);
-
-
- QJsonDocument doc = QJsonDocument::fromJson(message);
- if (!doc.isNull() && doc.isObject())
- {
- QJsonObject obj = doc.object();
- double temp = obj.value("temp").toDouble();
- double press = obj.value("press").toDouble()/100;
- double humidity = obj.value("humidity").toDouble();
- int iaq = obj.value("iaq").toInt();
- double co2 = obj.value("co2").toDouble();
- double voc = obj.value("voc").toDouble();
-
-
- ui->label_temp->setText(QString::number(temp, 'f', 2));
- ui->label_press->setText(QString::number(press, 'f', 2));
- ui->label_humidity->setText(QString::number(humidity, 'f', 2));
- ui->label_iaq->setText(QString::number(iaq, 'f', 2));
- ui->label_co2->setText(QString::number(co2, 'f', 2));
- ui->label_voc->setText(QString::number(voc, 'f', 2));
-
-
- }
- else
- {
- qDebug() << "Invalid JSON message received";
- }
- }
【实验效果】
编译好程序后,上传到开发板,运行后,效果如下:
【总结】
米尔-STM32MP257开发板,通过QT来设计UI界面,通过mqtt来订阅指定的主题,实现环境监测。在物联网方面大有作为!