Разработка и проектирование ПО
Для проектирования клиентского ПО использовали язык программирования C++. «Общение» между клиентом и сервером происходит с помощью сокета, в который происходит запись и из которого читаются данные в формате JSON.
Для проектирования пользовательского интерфейса использовался QT Designer.
При запуске приложения необходимо подключиться к серверу, иначе другие кнопки будут недоступны (рисунок 19).
Рисунок 19 – Алгоритм подключения к серверу
Согласно логике работы приложения, при первом запуске пользователь должен зарегистрироваться, введя логин, пароль и идентификатор своего аппаратного блока, а затем программа посылает эти данные на сервер. На основе этих данных сервер формирует ответ: регистрация разрешена или не разрешена. Если регистрация разрешена, появится сообщение об успешной регистрации. Если нет, появится окно ошибки.
Рисунок 20 – Алгоритм регистрации
Алгоритм авторизации
В следующий раз при запуске программы тому же пользователю не надо регистрироваться, ему необходимо авторизоваться. Пользователь вводит логин и пароль, и программа отправляет их на сервер. В зависимости от того, есть ли такая связка логина и пароля в базе данных, сервер формирует ответ: авторизация разрешена или нет. Если авторизация разрешеана, пользователю становится доступно получение данных. Если нет, приложение выведет ошибку.
|
|
Рисунок 21 – Алгоритм авторизации
Алгоритм получения данных
После успешной авторизации кнопка «Получить показания становится доступна». При нажатии на неё приложение отправляет запрос на сервер, а сервер направляет ответ в виде последних данных из БД. Открывается новое окно, в котором пользователь может увидеть пришедшие данные в удобной таблице. При повторном нажатии на кнопку данные обновляются по тому же алгоритму.
Рисунок 22 – Алгоритм получения данных
Заключение
ПАК «Мониторинг метеообстановки» поможет узнавать температуру, влажность воздуха и давление практически из любого места, где есть выход в интернет. Он позволяет пользователям получить самые актуальные и точные данные об этих метеорологических параметрах там, где им нужно, при этом стоит в несколько раз меньше, чем существующие аналоги и имеет лишь тот функционал, который необходим рядовому пользователю. Данная разработка находит широкое применение везде, где необходимо точно знать температуру, влажность воздуха и давление.
Библиографический список
1. Шлее М. QT 5.1. Профессиональное программирование на C++. — СПб.: «БХВ-Петербург», 2018. — 1072 с.
|
|
2. Иванова Г.С. Технология программирования. —М.: Издательство МГТУ имени Баумана, 2002. — 320 с.
3. Бадд Т. Объектно-ориентированное программирование в действии: Пер. с англ. — СПб.: Питер, 1997. — 464 с.
ПРИЛОЖЕНИЕ А
Файл authwindow.h – заголовочный файл окна авторизации
#ifndef AUTHWINDOW_H
#define AUTHWINDOW_H
#include <QDialog>
#include <QMainWindow>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QStandardItem>
#include <QJsonArray>
#include <QRegExpValidator>
namespace Ui {
class Authwindow;
}
class Authwindow : public QDialog
{
Q_OBJECT
public:
explicit Authwindow(QWidget *parent = nullptr);
~Authwindow();
typedef enum {
Authorization = 2,
}Request;
QByteArray Data;
QJsonDocument doc;
QJsonParseError docError;
public slots:
void sockReady();
void sockDisc();
private slots:
void on_authorizationButton_clicked();
private:
Ui::Authwindow *ui;
QRegExpValidator valid;
QString identificator;
};
#endif // AUTHWINDOW_H
ПРИЛОЖЕНИЕ Б
Файл mainwindow.h – заголовочный файл главного окна
#ifndef MAINWINDOW_H#define MAINWINDOW_H #include <QMainWindow>#include <QTcpSocket>#include <QMessageBox>#include <QDebug>#include <QJsonObject>#include <QJsonDocument>#include <QJsonParseError>#include <QStandardItem>#include <QJsonArray>#include <QRegExpValidator>#include "values.h"#include "regwindow.h"#include "authwindow.h" namespace Ui {class MainWindow;} class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QByteArray Data; QJsonDocument doc; QJsonParseError docError; typedef enum { Registration = 1, Authorization = 2, InsertItem = 3, }Request;signals:void sendData(QStandardItemModel* model); public slots: void sockReady(); void sockDisc(); private slots: void on_connectButton_clicked(); void on_sensorValueButton_clicked(); void on_regwindowButton_clicked(); void on_authwindowButton_clicked(); private: Ui::MainWindow *ui; QString identificator; QRegExpValidator valid; Values* values; Regwindow* regwindow; Authwindow* authwindow; }; #endif // MAINWINDOW_H
|
|
ПРИЛОЖЕНИЕ В
Файл refwindow.h – заголовочный файл окна регистрации
#ifndef REGWINDOW_H#define REGWINDOW_H #include <QDialog>#include <QMainWindow>#include <QTcpSocket>#include <QMessageBox>#include <QDebug>#include <QJsonObject>#include <QJsonDocument>#include <QJsonParseError>#include <QStandardItem>#include <QJsonArray>#include <QRegExpValidator> namespace Ui {class Regwindow;} class Regwindow : public QDialog{ Q_OBJECT public: explicit Regwindow(QWidget *parent = nullptr); ~Regwindow(); QByteArray Data; QJsonDocument doc; QJsonParseError docError; typedef enum { Registration = 1, }Request; public slots: void sockReady(); void sockDisc(); private slots: void on_registrationButton_clicked(); private: Ui::Regwindow *uireg; QRegExpValidator valid;}; #endif // REGWINDOW_HПРИЛОЖЕНИЕ Г
Файл values.h – заголовочный файл окна вывода данных
#ifndef VALUES_H#define VALUES_H #include <QDialog>#include <QTcpSocket>#include <QMessageBox>#include <QDebug>#include <QJsonObject>#include <QJsonDocument>#include <QJsonParseError>#include <QStandardItem>#include <QJsonArray>#include <QRegExpValidator>#include <QStringList> namespace Ui {class Values;} class Values : public QDialog{ Q_OBJECT public: explicit Values(QWidget *parent = nullptr); ~Values(); QByteArray Data; QJsonDocument doc; QJsonParseError docError; typedef enum { InsertItem = 3, }Request; public slots: void recieveData(QStandardItemModel* model);private: Ui::Values *uival; };#endif // VALUES_HПРИЛОЖЕНИЕ Д
|
|
Файл authwindow.cpp – файл окна авторизации
#include "authwindow.h"#include "ui_authwindow.h" extern QTcpSocket* mysocket; Authwindow::Authwindow(QWidget *parent) : QDialog(parent), ui(new Ui::Authwindow), valid(QRegExp("^\\w{6,12}$")){ ui->setupUi(this); ui->loginLineEdit->setValidator(&valid); ui->passwordLineEdit->setValidator(&valid); }void Authwindow::on_authorizationButton_clicked(){ QJsonObject objauth; objauth.insert("login",ui->loginLineEdit->text()); objauth.insert("password",ui->passwordLineEdit->text()); QJsonObject resauth; resauth.insert("type",Authorization); resauth.insert("main",objauth); QJsonDocument jsonauth; jsonauth.setObject(resauth); mysocket->write(jsonauth.toJson());} void Authwindow::sockDisc(){ mysocket->deleteLater();} Authwindow::~Authwindow(){ delete ui;}
ПРИЛОЖЕНИЕ Е
Файл mainwindow.cpp – файл главного окна
#include "mainwindow.h"#include "ui_mainwindow.h"#include "regwindow.h"#include "authwindow.h"#include <QtWidgets>#include "values.h"#include "ui_values.h" QTcpSocket* mysocket; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowTitle("Главное окно"); mysocket = new QTcpSocket(this); connect(mysocket,SIGNAL(readyRead()),this,SLOT(sockReady())); connect(mysocket,SIGNAL(disconnected()),this,SLOT(sockDisc())); values = new Values(); connect(ui->sensorValueButton, SIGNAL(clicked()),values,SLOT(show())); connect(this, SIGNAL(sendData(QStandardItemModel*)), values, SLOT(recieveData(QStandardItemModel*))); regwindow = new Regwindow(); authwindow = new Authwindow(); ui->authwindowButton->setEnabled(false); ui->regwindowButton->setEnabled(false); ui->sensorValueButton->setEnabled(false);} void MainWindow::on_connectButton_clicked(){ mysocket->connectToHost("127.0.0.1",5555); if (mysocket->waitForConnected(500)) { ui->connectButton->setText("Подключён к серверу"); ui->authwindowButton->setEnabled(true); ui->regwindowButton->setEnabled(true); ui->connectButton->setStyleSheet("*{background-color: limegreen; color: black}"); } else { ui->connectButton->setText("Не подключён.\n" "Переподключиться"); ui->connectButton->setStyleSheet("*{background-color: red; color: black}"); }} void MainWindow::on_regwindowButton_clicked(){ regwindow->show(); } void MainWindow::on_authwindowButton_clicked(){ authwindow->show();} void MainWindow::on_sensorValueButton_clicked(){ QJsonObject resval; resval.insert("type",InsertItem); resval.insert("identificator",identificator); qDebug()<<"identificator "<<identificator; QJsonDocument jsonval; jsonval.setObject(resval); mysocket->write(jsonval.toJson()); } void MainWindow::sockReady(){ Data = mysocket->readAll(); qDebug()<<"Data: "<<Data; doc = QJsonDocument::fromJson(Data, &docError); int type = doc.object().value("type").toInt(); qDebug()<<type; switch (type) { case Registration: { if (docError.errorString().toInt() == QJsonParseError::NoError) { QString res = doc.object().value("main").toString(); qDebug()<<"STATUS: "<<res; if(res == "Registration - yes") { QMessageBox::information(this,"Информация","Вы зарегистрированы"); regwindow->close(); ui->sensorValueButton->setEnabled(true); } else { QMessageBox::critical(this,"Информация","Вы не зарегистрированы, проверьте корректность введённых данных"); regwindow->activateWindow(); } } } break; case Authorization: { if (docError.errorString().toInt() == QJsonParseError::NoError) { QString res = doc.object().value("main").toString(); identificator = doc.object().value("identificator").toString(); if(res == "Autorization - yes") { QMessageBox::information(this,"Информация","Вы авторизованы"); authwindow->close(); ui->sensorValueButton->setEnabled(true); qDebug()<<"identificator "<<identificator; } else { QMessageBox::critical(this,"Ошибка","Проверьте корректность введённых данных"); authwindow->activateWindow(); } } } break; case InsertItem: { if (docError.errorString().toInt() == QJsonParseError::NoError) { QStandardItemModel *model = new QStandardItemModel; QStandardItem *item; QString temp = doc.object().value("temp").toString(); QString press = doc.object().value("press").toString(); QString hum = doc.object().value("hum").toString(); QString time = doc.object().value("time").toString(); QString date = doc.object().value("date").toString(); QStringList horizontalHeader; horizontalHeader.append("Температура, °С"); horizontalHeader.append("Давление, мм рт. ст."); horizontalHeader.append("Влажность, %"); horizontalHeader.append("Время измерения"); horizontalHeader.append("Дата измерения"); model->setHorizontalHeaderLabels(horizontalHeader); item = new QStandardItem(QString(temp)); model->setItem(0, 0, item); item = new QStandardItem(QString(press)); model->setItem(0, 1, item); item = new QStandardItem(QString(hum)); model->setItem(0, 2, item); item = new QStandardItem(QString(time)); model->setItem(0, 3, item); item = new QStandardItem(QString(date)); model->setItem(0, 4, item); emit sendData (model); } else { } } break; }} void MainWindow::sockDisc(){ mysocket->deleteLater();}MainWindow::~MainWindow(){ delete ui;}ПРИЛОЖЕНИЕ Ж
Файл regwindow.cpp – файл окна регистрации
#include "regwindow.h"#include "ui_regwindow.h" extern QTcpSocket* mysocket; Regwindow::Regwindow(QWidget *parent) : QDialog(parent), uireg(new Ui::Regwindow), valid(QRegExp("^\\w{6,12}$")){ uireg->setupUi(this); uireg->loginLineEdit->setValidator(&valid); uireg->passwordLineEdit->setValidator(&valid); uireg->identifLineEdit->setValidator(&valid); } void Regwindow::on_registrationButton_clicked(){ QJsonObject objreg; objreg.insert("login",uireg->loginLineEdit->text()); objreg.insert("password",uireg->passwordLineEdit->text()); objreg.insert("identificator",uireg->identifLineEdit->text()); int t = uireg->loginLineEdit->text().size(); int u = uireg->passwordLineEdit->text().size(); int v = uireg->identifLineEdit->text().size(); if(t<6) { QMessageBox::critical(this,"Ошибка ввода","Логин должен содержать от 6 до 12 символов"); } else if(u<6) { QMessageBox::critical(this,"Ошибка ввода","Пароль должен содержать от 6 до 12 символов"); } else if(v<6) { QMessageBox::critical(this,"Ошибка ввода","Идентификатор должен содержать от 6 до 12 символов"); } else { QJsonObject resreg; resreg.insert("type",Registration); resreg.insert("main",objreg); QJsonDocument jsonreg; jsonreg.setObject(resreg); qDebug()<<"MURMUR: "<<jsonreg; mysocket->write(jsonreg.toJson());}}void Regwindow::sockDisc(){ mysocket->deleteLater();}Regwindow::~Regwindow(){ delete uireg;}ПРИЛОЖЕНИЕ З
Файл values.cpp – файл окна вывода данных
#include "values.h"#include "ui_values.h" Values::Values(QWidget *parent) : QDialog(parent), uival(new Ui::Values){ uival->setupUi(this);} void Values::recieveData(QStandardItemModel* model){ uival->sensorTableView->setModel(model); uival->sensorTableView->resizeRowsToContents(); uival->sensorTableView->resizeColumnsToContents();}Values::~Values(){ delete uival;}
Дата добавления: 2021-05-18; просмотров: 50; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!