Разработка и проектирование ПО



Для проектирования клиентского ПО использовали язык программирования 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!