Russian Qt Forum

Qt => Общие вопросы => Тема начата: 8Observer8 от Март 06, 2014, 07:31



Название: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 07:31
Привет! С работы, на которую я хочу устроиться, мне дали задание. От граммотного выполнения которого зависит моя судьба :)

Задание на разработку системы сбора и отображения данных

Описание

В отсеке реактора атомного ледокола есть около 10 датчиков считывающих различную информацию о работе реактора. Датчики подключенны к компьютеру с Unix подобной ОС, для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика"). Сбор информации с драйверов датчиков осуществляет установленное на этом же компьютере приложение - "Сервер Данных". На удаленном компьютере установлено приложение, отображающее полученную с датчиков информацию - "Приложение Оператора"

Драйвер Датчика

В каждый момент времени хранит текущее значение измеряемого датчиком параметра.

Сервер Данных

- Опрашивает Драйвера Датчиков и получает текущие значения.
- Хранит все изменения значений датчиков.
- По запросу от Приложения Оператора предоставляет следующие данные о состоянии датчиков:
        - текущее состояние датчика
        - состояние датчика на определённый момент времени
        - история изменений состояния датчиков за указанный период времени
      
Приложение Оператора

Запрашивает с Сервера Данных информацию и отображает ее.

Задание

- Разработать Драйвер Датчика, Сервер Данных и обеспечить между ними обмен данными
- Обеспечить обмен данными между Сервером Данных и Приложением Оператора
- Если потребуется - разработать Приложение Оператора

Условия

- Драйвер Датчика и Сервер Данных должны быть разработаны на .NET-или (C++(Qt))
- Технология обмена данными с Приложением Оператора может быть любая.
- Приложение Оператора может быть разработанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение.
- В Драйвере Датчика в качестве источника данных можно использовать случайные значения.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 07:33
Я открыл примеры из Qt Creator'а. Ввёл в поиске Server. Там есть примеры: "Fortune Server Expample" и "Threaded Fortune Server"

Я так понимаю, что мне, во время написания приложения, нужно руководствоваться примером "Threaded Fortune Server"

Опишите, пожалуйста, как можно подробнее, как с точки зрения профи должно выглядить это приложение.


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 06, 2014, 07:58
Опишите, пожалуйста, как можно подробнее, как с точки зрения профи должно выглядить это приложение.
Печально, что вы так и не открыли книгу Гради Буч. :(
Там у него один из примеров, как раз разработка системы сбора данных, правда метеорологических, но это в данном случае значения не имеет.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 08:54
Печально, что вы так и не открыли книгу Гради Буч. :(
Там у него один из примеров, как раз разработка системы сбора данных, правда метеорологических, но это в данном случае значения не имеет.

Это удивительно, но я нашёл такой же пример и в этой книге: "Быстрая разработка программ: принципы, примеры, практика" http://rutracker.org/forum/viewtopic.php?t=905917

Причём авторы этой книги делают ссылки на книгу и статьи Гради Буч :)

(http://i.pixs.ru/storage/7/7/3/143png_9619880_11124773.png)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 08:55
Буду выполнять это задание, опираясь на эти три книги:

Быстрая разработка программ: принципы, примеры, практика (издание 2004, есть пример с метеостанцией, язык примеров - Java)
Скачать: http://rutracker.org/forum/viewtopic.php?t=905917 (http://rutracker.org/forum/viewtopic.php?t=905917)

Принципы, паттерны и методики гибкой разработки (издание 2011, нет примера с метеостанцией, язык примеров - C#)
Скачать: http://rutracker.org/forum/viewtopic.php?t=4295746 (http://rutracker.org/forum/viewtopic.php?t=4295746)
Исходники: http://www.objectmentor.com/PPP/ (http://www.objectmentor.com/PPP/)

Объектно-ориентированный анализ и проектирование с примерами приложений (3-е издание)
Перевод: http://rutracker.org/forum/viewtopic.php?t=3343958 (http://rutracker.org/forum/viewtopic.php?t=3343958)
Оригинал: http://kickass.to/object-oriented-analysis-and-design-with-applications-3rd-editio-t2753820.html (http://kickass.to/object-oriented-analysis-and-design-with-applications-3rd-editio-t2753820.html)

И на эти примеры из Qt:
- Fortune Server Example
- Threaded Fortune Server
- Fortune Client Expample


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 06, 2014, 09:02
Причём автор этой книги делает ссылки на книгу и статьи Гради Буч :)
Не удивительно, ребята небось просто переработали Буча для C#. :)


Название: Re: Система сбора и отображения данных
Отправлено: kuzulis от Март 06, 2014, 10:33
Ну нифигасе задачка. :)

Для таких случаев используют разные SCADA. Возьми готовую SCAD-у и забацай в ней то что нужно.

Например можешь эту OpenScada  (http://oscada.org/ru/)взять (она свободная и на Qt). В ней ты можешь и эмулировать сбор данных с датчиков и прочие няшки делать. Документация на русском, плюс там есть форум на котором ответят.

[нацпол]
 А может и не ответят, т.к. разработчики из Украины, и там не до датчиков сейчас. :) 
[/нацпол]


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 06, 2014, 10:36
Его тогда программистом на работу не возьмут, если он в OpenScada будет делать  ;D
к тому же в OpenScada и программировать ничего не надо - только настраивать  ;D


Название: Re: Система сбора и отображения данных
Отправлено: kuzulis от Март 06, 2014, 10:37
Так у него ж в требованиях написано:

Цитировать
Приложение Оператора может быть разраоотанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 10:51
Для таких случаев используют разные SCADA. Возьми готовую SCAD-у и забацай в ней то что нужно.
Спасибо! Уверен, мне в будущем это пригодится :)

Ну нифигасе задачка. :)
Тут нужно понимать, что никакого ледокола нет и это просто тестовое задание :)

Так у него ж в требованиях написано:

Там написано, что на приложение оператора "можно забить" и использовать готовое решение. В вот Клиенты и Сервер должны быть написаны на .NET-или (C++(Qt))

Цитировать
- Драйвер Датчика и Сервер Данных должны быть разработаны на .NET-или (C++(Qt))

- Приложение Оператора может быть разработанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение.


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 06, 2014, 10:56
Пока в опенскаде этой что-либо настроишь человеческое, состаришься  ;D


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 06, 2014, 12:17
Задание простейшее на уровне 3 курса колледжа. Если убрать все красивости типо атомохода, то выливается - есть удалённый компьютер. С ним надо связаться. Нужно создать N клиентов и 1 сервер. Способ связи любой, http\сокеты\ftp. FortuneServer после переработки подойдёт на все 100%.

PS если такое не сделает парень, изучающий ООП уже ммм... ну месяца 2, то ничего он не изучал :P


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 12:28
Я так понимаю, что мне нужно будет в Qt создать несколько проектов:

1) Сервер. К нему подключаются клиенты (датчики). Сервер ждёт от датчиков показаний. Сохраняет показания (вместе с датой и временем) в бинарный (или текстовый файл)
3) Клиент [1, 2, 3, ..., и т.д.]. При запуске подключается к Серверу. Отправляет серверу показания (с периодом... правда, не знаю, кто задаёт период...).
2) Приложение Оператора. Соединяется с сервером. Отображает данные с датчиков, для этого делает запросы с периодом указанных секунд (можно менять период запросов). С Приложения Оператора можно сделать запрос прислать с сервера данные за определённый промежуток времени.

P.S. Пожалуйста, поправьте, если что-то не так.


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 06, 2014, 12:38
Сервер сам опрашивает датчики, судя из задания.
Сервер и датчики на одном компьютере типа, если что.

Я вот только не могу понять, зачем уточнение про Unix-подобную ОС..


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 12:56
FortuneServer после переработки подойдёт на все 100%.
По-моему, FortuneServer может работать только с одним клиентом. Здесь нужен ThreadedFortuneServer

Сервер сам опрашивает датчики, судя из задания.
Да, точно! Спасибо! :)

Сервер и датчики на одном компьютере типа, если что.
А мне кажется, что на разных.

Я вот только не могу понять, зачем уточнение про Unix-подобную ОС..
А это мне тоже непонятно, так как в задании написано можно применять фрейворк .Net, а он ведь только для Windows.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 06, 2014, 12:59
А, ну всё правильно меня поправил OKTA. Тут гораздо проще. На 1 компе сервер и датчики. На втором клиент с оператором. Вот и всё. И как раз fortune server подойдёт на 100% :D Оператор в задании то один.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 06, 2014, 13:09
Да, кстати, скорее всего, вы правы, сервер, ну ,к примеру, через USB-порты считывает данные от датчиков на одной машине.

Оператор в задании то один.
В задании сказано, что один. А на практике, возможно, нужно будет предусмотреть возможность запуска нескольких, ведь ледокол то большой :)


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 06, 2014, 13:18
А ещё возможно система будет общаться с ядерным реактором и в зависимости от потребления мощностей на ледоколе будет регулироваться процесс распада в ядре.

PS идите от задачи, а не от "может быть". :P


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 06, 2014, 13:23
Соответственно еще вопрос  - каким методом будешь "читать данные из датчика"?


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 07, 2014, 11:18
Соответственно еще вопрос  - каким методом будешь "читать данные из датчика"?

Хороший вопрос и он на данный момент самый трудный.

Сейчас продумываю такую идею. В классе IcebreakerServer будут методы, которые возвращают текущее значение с датчика (сделаю случайное число из разных диапазонов для каждого датчика, чтобы их различать по данным)

Код
C++ (Qt)
class IcebreakerServer
{
   // ...
private:
 
   int sensor_01();
   int sensor_02();
   int sensor_03();
   int sensor_04();
   int sensor_05();
}

В бессконечном цикле с задержкой по времени, буду вызывать эти функции.


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 07, 2014, 11:22
Так датчики тоже надо отдельно реализовать, разве нет?
Лучше не бесконечный цикл, а QTimer использовать я думаю и по таймауту вызывать соответствующие слоты)


Название: Re: Система сбора и отображения данных
Отправлено: popper от Март 07, 2014, 11:24
для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика").
Мне тоже кажется, что исходя из этой записи в ТЗ, функционал опроса датчика нужно вынести как минимум в отдельный класс.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 07, 2014, 11:35
Так датчики тоже надо отдельно реализовать, разве нет?

Как это? Я представляю, что у нас есть комьютер с кучей USB-портов. К каждому порту подсоединён свой датчик. У сервера есть такие функции, которые возвращают данные из портов:
Код
C++ (Qt)
   int sensor_01();
   int sensor_02();
   int sensor_03();
   int sensor_04();
   int sensor_05();
 

Лучше не бесконечный цикл, а QTimer использовать я думаю и по таймауту вызывать соответствующие слоты)

Хорошо, сделаю через QTimer.

Я сейчас создал два проекта:
- консольный. Назвал его: IcebreakerServer
- оконный (QMainWindow). Назвал его: IcebreakerViewer

Сейчас хочу наладить взаимодействие между IcebreakerViewer и IcebreakerServer на основе примеров: "Fortune Server" и "Fortune Client"

для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика").
Мне тоже кажется, что исходя из этой записи в ТЗ, функционал опроса датчика нужно вынести как минимум в отдельный класс.

Да, Вы правы, но для меня это пока сложно. Я для начала сделаю через функции, а потом подумаю, что дальше делать.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 07, 2014, 11:44
А вот тут уже переход к ООП нужен, а не функциональное программирование :D
Классы:
Менеджер Датчиков - Сервер - Клиент.
Опрос, хранение, выдача - Запрос, получение, хранение, отдача клиенту - Получение, отображение.


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 07, 2014, 11:49
Как это? Я представляю, что у нас есть комьютер с кучей USB-портов. К каждому порту подсоединён свой датчик. У сервера есть такие функции, которые возвращают данные из портов:
Вы серьезно? Вас не возьмут на работу. :)
Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики?
Они могут выходить из строя....

Почитайте уже книгу.  ::)


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 07, 2014, 11:52
Ну, видимо самый просто вариант - это когда у каждого датчика свой временный файл и сервер читает эти файлы.
А вариант посложнее, это использовать именованные каналы, а соответственно для Qt - QLocalServer и QLocalSocket.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 07, 2014, 11:54
Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики?
Они могут выходить из строя....
А что мешает разработчику открыть код с классом и чуть-чуть его подкорректировать?

Почитайте уже книгу.  ::)
Пока я полностью прочитаю эти книги... Мне нужно сочитать это с практикой. Я и в книги заглядываю, и пытаюсь на практике, что-то делать.


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 07, 2014, 12:00
А что мешает разработчику открыть код с классом и чуть-чуть его подкорректировать?
Для этого разработчик должен находится на ледоколе. :)
К тому же сделать это без остановки программы вряд ли получиться.

Пока я полностью прочитаю эти книги... Мне нужно сочитать это с практикой. Я и в книги заглядываю, и пытаюсь на практике, что-то делать.
Прочитайте одну главу, где разбирается пример с метеостанцией.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 07, 2014, 12:02
Чую вся та тема с ООП не дала ничего полезного :D


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 07, 2014, 12:03
Чую вся та тема с ООП не дала ничего полезного :D
В той теме от ООП было только название.


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 07, 2014, 12:08
Да что вы накинулись на человека? Он же говорит, что пока не знает, как реализовать замуту с датчиками и сделает временно через функции, чтобы другую часть проекта сделать и протестировать.  :)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 07, 2014, 12:17
Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики?
Они могут выходить из строя....

Пока я сделаю датчики №1, №2 и т.д. Но ведь на самом деле они должны как-то называться? Ну, к примеру: ДатчикТемпературы, ДатчикДавления. А если делать что-то универсальное, то как клиент поймёт, что и куда выводить?

Если мы изменим датчик давления на датчик температуры, то как клиент это поймёт? Вот пример клиента:

(http://i6.pixs.ru/storage/5/0/4/144png_2294333_11139504.png)

Да что вы накинулись на человека? Он же говорит, что пока не знает, как реализовать замуту с датчиками и сделает временно через функции, чтобы другую часть проекта сделать и протестировать.  :)

Совершенно верно! Я хочу сделать черновой рабочий проект, чтобы он выполнял функциональность и чтобы я потратил меньше сил и времени на это. А потом я уже буду переделывать, как надо. Улучшать и улучшать.


Название: Re: Система сбора и отображения данных
Отправлено: OKTA от Март 07, 2014, 12:21
Удобно при запуске каждого драйвера датчика, указывать его тип и имя, тогда не будет проблем с тем, что и где отображать.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 07, 2014, 12:28
Каждый датчик имеет определённый идентификатор. Не бывает безымянных датчиков :D А по идентификатору можно сделать словарь или карту. И уже по ней будет всё ясно пользователю.
А "черновые" проекты имеют свойство превращаться в постоянные, причем дальше человек уже идёт по накатанному (функциональное), а не делает по новому :)

PS главное начать, а так всё комом покатится и ООП станет легко и просто :) Ну и главное иметь бумагу и карандаш. Более продвинутая версия - планшет для водных маркеров, их и тряпочку :)


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 07, 2014, 15:13
Пока я сделаю датчики №1, №2 и т.д. Но ведь на самом деле они должны как-то называться? Ну, к примеру: ДатчикТемпературы, ДатчикДавления. А если делать что-то универсальное, то как клиент поймёт, что и куда выводить?

Например так:
Код
C++ (Qt)
class Sensor
{
   Sensor( const QString &name ) :
       m_name( name )
   {
   }
 
   QString name() const { return m_name; }
 
private:
   QString m_name;
};
 
class PressureSensor : public Sensor
{
   PressureSensor() : Sensor( trUtf8( "Датчик давления" ) ) {}
};
 
class TempSensor : public Sensor
{
   TempSensor() : Sensor( trUtf8( "Датчик температуры" ) ) {}
};
 

А можно вообще оставить оператору назвать их так, как ему будет понятно.

Совершенно верно! Я хочу сделать черновой рабочий проект, чтобы он выполнял функциональность и чтобы я потратил меньше сил и времени на это. А потом я уже буду переделывать, как надо. Улучшать и улучшать.
Вы изначально его хотите сделать не правильно, что бы потом выкинуть его и сделать правильно?


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 07, 2014, 15:22
Вот и пример с наследованием. Вот и практика в ООП. И следующей фразой будет "Я же уже так много сделал на функциях, зачем мне всё переделывать?" :)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 07, 2014, 15:36
Мне сейчас нужно будет уехать на выходные. Я буду без компа и интернета. Как вернусь, постараюсь сделать это задание достойно. Спасибо огромное всем, кто помогает!


Название: Re: Система сбора и отображения данных
Отправлено: Igors от Март 08, 2014, 14:27
Задача выглядит очень типовой, наверняка есть подходящие либы. Если же самому, я бы рассуждал примерно так:

- датчик есть класс который собирает данные и хранит их в контейнере. Что есть единица данных? Ну пусть float значение. Нужно ли хранить время когда получено новое значение? Может и да, но может и ограничиться предположением что "данные приходят с фиксированной частотой". В любом случае датчик может быть вкл/выкл, уметь накапливать данные в своем буфере и знать какому времени соответствует каждое значение. Емкость буфера ограничена/задается. В общем датчик - класс который умеет по запросу выдать N единиц данных в заданном интервале времени


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 09, 2014, 13:58
Задача выглядит очень типовой, наверняка есть подходящие либы. Если же самому, я бы рассуждал примерно так:

- датчик есть класс который собирает данные и хранит их в контейнере. Что есть единица данных? Ну пусть float значение. Нужно ли хранить время когда получено новое значение? Может и да, но может и ограничиться предположением что "данные приходят с фиксированной частотой". В любом случае датчик может быть вкл/выкл, уметь накапливать данные в своем буфере и знать какому времени соответствует каждое значение. Емкость буфера ограничена/задается. В общем датчик - класс который умеет по запросу выдать N единиц данных в заданном интервале времени
Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение, все остальное должен делать клиентский код: опрашивать датчик с нужным заданным интервалом, хранить значения и делать выборки. Не стоит на датчик сваливать разные задачи. Каждый объект системы должен выполнять свою задачу.


Название: Re: Система сбора и отображения данных
Отправлено: lesav от Март 09, 2014, 20:15
Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение
Все зависит от важности данных,
если это банальная температура неких узлов то проблем нет,
а если это датчики системы управления реактором то тут совсем другие требования.
Датчики подключены к компьютеру с Unix подобной ОС, для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика").
Какая ось, QNX ?



Название: Re: Система сбора и отображения данных
Отправлено: lesav от Март 09, 2014, 20:26
Как подсоединены датчики ?
На каком интерфейсе ?
Используются дополнительные платы расширения pci или isa ?


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 09, 2014, 21:11
а если это датчики системы управления реактором то тут совсем другие требования.
Мы говорим про класс датчика учебного проекта. :)


Название: Re: Система сбора и отображения данных
Отправлено: Igors от Март 10, 2014, 08:54
Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение, все остальное должен делать клиентский код: опрашивать датчик с нужным заданным интервалом, хранить значения и делать выборки. Не стоит на датчик сваливать разные задачи. Каждый объект системы должен выполнять свою задачу.
Можно и так, но тогда надо создавать класс напр "контроллер" отвечающий за опрос и буферирование, а то "клиентский код" - неясно что это


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 10, 2014, 09:06
но тогда надо создавать класс напр "контроллер" отвечающий за опрос и буферирование
Не один класс, а несколько, объекты которых будут опрашивать датчики, сохранять показания во внешнем хранилище, передавать их и т.д. В общем, каждый объект занимается непосредственно своей работой.

"клиентский код" - неясно что это
Клиентский код это код, который взаимодействует с объектом датчика.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 11, 2014, 17:17
Сделал сегодня небольшой набросок. Приложение IcebreakerViewer отправляет серверу (IcebreakerServer) запрос раз в секунду. Сервер, в ответ на запросы, передаёт текущие значения датчиков:

(http://i7.pixs.ru/storage/0/4/3/147png_8288103_11194043.png)

(http://i7.pixs.ru/storage/0/3/6/146png_2511246_11194036.png)

Исходники:
IcebreakerServer: https://github.com/8Observer8/IcebreakerServer
IcebreakerViewer: https://github.com/8Observer8/IcebreakerViewer

Датчики реализованы следующем образом:

Код
C++ (Qt)
int IcebreakerServer::sensor_01()
{
   return qrand() % 10 + 10;
}
 
int IcebreakerServer::sensor_02()
{
   return qrand() % 10 + 20;
}
 
int IcebreakerServer::sensor_03()
{
   return qrand() % 10 + 30;
}
 
int IcebreakerServer::sensor_04()
{
   return qrand() % 10 + 40;
}
 
int IcebreakerServer::sensor_05()
{
   return qrand() % 10 + 50;
}
 

Вот так Viewer принимает данные и парсит их для отображения на экране:

Код
C++ (Qt)
void MainWindow::readyRead()
{
   QTcpSocket* clientSocket = (QTcpSocket*)sender();
   QDataStream in(clientSocket);
   in.setVersion(QDataStream::Qt_4_7);
   for (;;) {
       if (!m_nextBlockSize) {
           if (clientSocket->bytesAvailable() < (int)sizeof(quint16)) {
               break;
           }
           in >> m_nextBlockSize;
       }
 
       if (clientSocket->bytesAvailable() < m_nextBlockSize) {
           break;
       }
 
       QString str;
       in >> str;
 
       QStringList stringList = str.split(',');
       if (stringList.size() == 5) {
           ui->sensor01LineEdit->setText(stringList[0]);
           ui->sensor02LineEdit->setText(stringList[1]);
           ui->sensor03LineEdit->setText(stringList[2]);
           ui->sensor04LineEdit->setText(stringList[3]);
           ui->sensor05LineEdit->setText(stringList[4]);
       } else {
           qWarning() << "stringList.size() != 5";
       }
 
       m_nextBlockSize = 0;
   }
}
 


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 11, 2014, 23:32
Вот так функции побеждают ООП :D


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 12, 2014, 14:24
Вот так функции побеждают ООП :D

Мне нужно было разобраться с такими техническими вопросами, как:
1) Обмен данными между Server'ом и Viewer'ом
2) Хранение данных

С первым вопросом вчера разобрался, а сегодня - со вторым. Решил хранить данные в базе данных SQLite, в виде: название датчика, значение, дата-врамя.

Кому интересно, вот видео, как работать с SQLite из Qt: http://www.youtube.com/watch?v=cc06D3wuTn4 (http://www.youtube.com/watch?v=cc06D3wuTn4)

Я добился того, чтобы Server сохранял текущие значения датчиков в базу данных (а так же дату-время). Теперь надо разобраться с SQL. А именно, как получить данные за период по столбцу дата-врамя. Как сделаю, то оформлю проект в виде ООП.

Отправлено: Март 11, 2014, 17:17

Написал пошаговую инструкцию, как работать с базой данных SQLite в Qt: http://www.prog.org.ru/topic_26665_0.html (http://www.prog.org.ru/topic_26665_0.html)

Сделал вот такой GUI интерфейс, но пока не реализовал передачу данных из диапазона по времени съёма параметров:

(http://i7.pixs.ru/storage/2/4/6/148png_7514394_11218246.png)

(http://i7.pixs.ru/storage/2/7/0/149png_1507427_11218270.png)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 15, 2014, 08:24
Я уточнил ТЗ. Теперь сохраняю данные в базе данных SQLite.

Правда в моём варианте база данных располагается на стороне клиента. Удалённый сервер просто присылает посылку данных с датчиков. Я думаю, что нужно будет всё-таки сделать сбор данных на стороне удалённого сервера.

Я заметил, что  у меня GUI клиента фризится (то есть замирает, притормаживает). Скорее всего это происходит в моменты записи в базу данных.

Вариант с базой данный считаю оправданным, так как в этом случае легко организовать доступ к данным и обработку их. К примеру, легко получить данные за период времени, так как в базу данных я сохраняю и время в формате: миллисекунды с начала эпохи (со времени рождения ОС Unix, то есть с 1970 года)

(http://i7.pixs.ru/storage/3/7/6/152png_2288254_11241376.png)

Почему ТЗ требует, чтобы получение данных с датчиков было отдельным тредом или процессом? Если это отдельный процесс, то получается, что это отдельное приложение, то есть Клиент и приложение датчика может быть на другой машине в сети. Правильно ли я понимаю?


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 15, 2014, 08:37
Почему ТЗ требует, чтобы получение данных с датчиков было отдельным тредом или процессом?
Что бы этот прием шел параллельно с мониторингом данных. В случае с отдельным процессом - это еще и надежней, т.к. падение процесса получения данных не повлияет на процесс мониторинга и мы сможем отслеживать падения процессов и быстро их перезапускать.
И неплохое разделение функций получается: процесс приема просто складывает данные в БД - он знает и умеет получать данные, знает источники/протоколы и т.д., а процесс мониторинга берет данные исключительно из БД и ему не важно откуда и как эти данные получаются.

Если это отдельный процесс, то получается, что это отдельное приложение, то есть Клиент и приложение датчика может быть на другой машине в сети.
Тут зависит как эти два процесса будут взаимодействовать друг с другом.


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 15, 2014, 08:47
Я заметил, что  у меня GUI клиента фризится (то есть замирает, притормаживает). Скорее всего это происходит в моменты записи в базу данных.
Да как бы не очень понятно с чего ему притормаживать. Отключите сохранение данных в БД и проверьте, пройдут ли фризы.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 15, 2014, 09:27
Да как бы не очень понятно с чего ему притормаживать.

Я понял - это не фризы. У меня есть два текстовых поля LineEdit. В одном из них выводится время самого первого съёма, в другом - последнего. В моём приложении эти значения обновляются каждую секунду. Когда я пытаюсь выделить, к примеру, дату и время первого съёма, чтобы скопипастить, то выделение пропадает из-за обновления.

Но всё же, при наборе в полях: Требуемый диапазон - быстро набирать не получается. Есть небольшое притормаживание. Можете у себя просто запустить и попробовать набрать текст в поле "Введите начало диапазона". Только базу данных нужно расположить по этому пути:
Код
C++ (Qt)
QString path = QDir::currentPath()+QString("/database.sqlite");

Файл с базой данных можно найти в папке с исходниками Viewer'а.

Исходники:
https://github.com/8Observer8/IcebreakerServer/tree/dataFromRange
https://github.com/8Observer8/IcebreakerViewer/tree/dataFromRange

(http://i6.pixs.ru/storage/7/7/6/153png_3489517_11241776.png)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 23, 2014, 10:04
Помогите, пожалуйста, разобраться с таким вопросом. Хочу чтобы у каждого датчика был свой уникальный идентификатор. Поэтому я написал: static int mID; но компилятор ругается на эту строку:
Цитировать
Sensor.cpp:10: error: undefined reference to `Sensor::mID'

Sensor.h
Код
C++ (Qt)
#ifndef SENSOR_H
#define SENSOR_H
 
#include <QString>
 
class Sensor
{
public:
   Sensor(const QString &sensorName, const QString &portName);
 
   QString sensorName() const {
       return mSensorName;
   }
 
   QString portName() const {
       return mPortName;
   }
 
   int value() const;
 
   int id() const {
       return mID;
   }
 
private:
   QString mSensorName;
   QString mPortName;
   static int mID;
};
 
#endif // SENSOR_H
 

Sensor.cpp
Код
C++ (Qt)
#include "Sensor.h"
 
#include <QTime>
 
Sensor::Sensor(const QString &sensorName, const QString &portName) :
   mSensorName(sensorName),
   mPortName(portName)
{
   qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
   mID++;
}
 
int Sensor::value () const
{
   return qrand() % 10 + (mID * 10);
}
 


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 23, 2014, 10:15
Статическая переменная будет всегда одна, на все объекты и содержать она будет самое последнее значение.

Для статических переменных нужно определить в cpp файле:
Код
C++ (Qt)
int Sensor::mID = 0;
 


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 23, 2014, 10:18
Огромное спасибо :)

Посмотрите, пожалуйста, мой план-описание проекта. Всё ли здесь я правильно описал:

- пользователь запускает программу "Сервер Данных"

"Драйвер Датчика"
- пользователь запускает программу "Драйвер Датчика" (на том же, что и "Сервер Данных" или удалённом компьютере)
- добавляет датчики в таблицу, нажимая в меню "Добавить". В открывшимся диалоге указывает: имя датчика, номер COM-порта. В меню есть так же пункты: "Редактировать", "Удалить" запись из таблицы.
- вводит IP адрес (или имя компьютера) и порт "Сервера Данных"
- нажимает кнопку "Подсоединиться к серверу"
- пользователь может наблюдать текущие значения каждого датчика в приложении "Драйвер Датчика" в таблице

"Сервер Данных"
- после того, как пользователь нажал кнопку "Подсоединиться к серверу" в приложении "Драйвер Датчика", то "Сервер Данных" начинает принимать данные
- "Сервер Данных" сохраняет данные от датчиков в базу данных в таком виде: имя датчика, значение датчика, дата и время съёма

"Приложение Оператора"
- пользователь запускает "Приложение Оператора"
- вводит IP адрес (или имя компьютера) и порт сервера
- нажимает кнопку "Подсоединиться к серверу"
- "Приложение Оператора" начинает отправлять запросы приложению "Сервер Данных" каждую секунду
- в ответ приложение "Сервер Данных" присылает текущие значения датчиков
- "Приложение Оператора" отображает текущие значения датчиков
- пользователь вводит требуемый временной диапазон (дата-время) и получает от приложения "Сервер Данных" значения датчиков за указанный период
- пользователь так же может узнать значение указанного датчика в указанный момент времени, а так же значения указанного датчика в указанный период времени

Дополнительная функциональность. Пользователь может наблюдать текущие значения датчиков на графике в "Приложении Оператора" (графики рисуются в реальном времени)


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 23, 2014, 10:19
Статический будет сам счетчик:

Sensor.h
Код
C++ (Qt)
#ifndef SENSOR_H
#define SENSOR_H
 
#include <QString>
 
class Sensor
{
public:
   Sensor(const QString &sensorName, const QString &portName);
 
   QString sensorName() const {
       return mSensorName;
   }
 
   QString portName() const {
       return mPortName;
   }
 
   int value() const;
 
   int id() const {
       return mID;
   }
 
private:
   QString mSensorName;
   QString mPortName;
   int        mID;
 
   static int mSeq;
};
 
#endif // SENSOR_H
 

Sensor.cpp
Код
C++ (Qt)
#include "Sensor.h"
 
#include <QTime>
 
int Sensor::mSeq = 0;
 
Sensor::Sensor(const QString &sensorName, const QString &portName) :
   mSensorName(sensorName),
   mPortName(portName),
   mID( mSeq++ )
{
   qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
}
 
int Sensor::value () const
{
   return qrand() % 10 + (mID * 10);
}
 


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 23, 2014, 10:20
Да, это то, что я хотел :) Спасибо :)


Название: Re: Система сбора и отображения данных
Отправлено: Igors от Март 23, 2014, 11:10
Код
C++ (Qt)
int Sensor::value () const
{
   return qrand() % 10 + (mID * 10);
}
 
Возвращаемое значение зависит от порядка опроса датчиков


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 23, 2014, 11:11
Возвращаемое значение зависит от порядка опроса датчиков
Ну rand так устроен. :)


Название: Re: Система сбора и отображения данных
Отправлено: Johnik от Март 23, 2014, 11:24
Помогите, пожалуйста, разобраться с таким вопросом. Хочу чтобы у каждого датчика был свой уникальный идентификатор. Поэтому я написал: static int mID; но компилятор ругается

можно еще так:
Код
C++ (Qt)
class Foo {
public:
   static int generateId()
   {
       static int id = 0;
       return id++;
   }
}
 


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 24, 2014, 14:40
Спасибо с генератором :)

Сейчас 3 часа бился с проблемой и вроде подошёл к источнику. У меня Server отравляет QString Viewer'у. В строке содержатся данные по датчикам в формате: название, значение. Вот так: sensor1,18;sensor2,22;sensor3,28. Так вот. Когда это одно значение (sensor1,18), то Viewer нормально принимает. Если два и более, то Viewer перестаёт принимать.

Вот так Server отправляет строку:
Код
C++ (Qt)
void IcebreakerServer::sendToViewer(QTcpSocket *socket, const QString &str)
{
   QByteArray  arrBlock;
   QDataStream out(&arrBlock, QIODevice::WriteOnly);
   out.setVersion(QDataStream::Qt_4_7);
 
   out << quint16(0) << str;
 
   out.device()->seek(0);
   out << quint16(arrBlock.size() - sizeof(quint16));
 
   socket->write(arrBlock);
}
 

А вот так Viewer принимает:
Код
C++ (Qt)
void MainWindow::readyRead()
{
   QTcpSocket* clientSocket = (QTcpSocket*)sender();
   QDataStream in(clientSocket);
   in.setVersion(QDataStream::Qt_4_7);
   for (;;) {
       if (!m_nextBlockSize) {
           if (clientSocket->bytesAvailable() < (int)sizeof(quint16)) {
               break;
           }
           in >> m_nextBlockSize;
       }
 
       if (clientSocket->bytesAvailable() < m_nextBlockSize) {
           break;
       }
 
       QString inputData;
       in >> inputData;
       QStringList sensorsList = inputData.split(';');
 
       qDebug() << inputData;
 
       if ((sensorsList.size() == 3) && (sensorsList[0] == QString("alailableRange"))) {
           QDateTime time;
           // Begin of Range
           time.setMSecsSinceEpoch(sensorsList[1].toULongLong());
           ui->beginPossibleLineEdit->setText(time.toString());
 
           // End of Range
           time.setMSecsSinceEpoch(sensorsList[2].toULongLong());
           ui->endPossibleLineEdit->setText(time.toString());
       } else {
           qDebug() << "to table";
           if (sensorsList.size() != mModel->rowCount()) {
               mRows = sensorsList.size();
               delete mModel;
               mModel = new QStandardItemModel(mRows, mColumns, this);
               setHeaderData();
               ui->currentTable->setModel(mModel);
           }
 
           for (int i = 0; i < sensorsList.size(); ++i) {
               QStringList list = sensorsList[i].split(',');
               if (list.size() == mModel->columnCount()) {
                   QModelIndex index;
                   // Set data to the table
                   for (int j = 0; j < list.size(); ++j) {
                       index = mModel->index(i, j);
                       mModel->setData(index, list[j]);
                   }
               }
           }
       }
       m_nextBlockSize = 0;
   }
}
 


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 24, 2014, 19:10
Я видимо, перемудрил с сокетами. У меня Server и Viewer соединены по одному каналу. Каждую секунду я перебрасываю строку от Viewer - запрос "currentValues". На этот запрос Sever мне передаёт посылку-строку с названиями и значениями текущих датчиков (которых может быть сколько угодно, по ТЗ не больше 10). По этому же каналу я передаю запрос "getRequiredRange,времяНачала,времяОкончания". Server считывает из базы данных названия и значения датчиков и передаёт их Viewer'у, которых может быть много (в базе данных я также храню время-дату съёма). В том числе вся база данных. И всё это по-одному каналу. Придётся капать в сторону потоков, чтобы завести несколько сокетных соединений.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 25, 2014, 08:35
Я нашёл, как мне кажется, подходящий пример из Qt: ThreadedFortuneServer. Он позволил бы мне обрабатывать такие запросы от клиентов как: запрос на текущие (ежесекундные) данные с датчиков (название датчиков, их значение и время съёма данных), а так же запрос на историю изменений значений датчиков за указанный период.

Проблем появилось очень много. К примеру, клиент тоже придётся как-то переделать через потоки. Один поток запрашивает текущие данные, другой по желанию пользователя запрашивает данные за указанный период.

Одна из текущих проблем: как переделать ThreadedFortuneServer, чтобы он принимал данные от клиента. Так как в этом примере данные генерируются внутри самого класса FortuneServer:
Код
C++ (Qt)
#include "fortuneserver.h"
#include "fortunethread.h"
 
#include <stdlib.h>
 
//! [0]
FortuneServer::FortuneServer(QObject *parent)
   : QTcpServer(parent)
{
   fortunes << tr("You've been leading a dog's life. Stay off the furniture.")
            << tr("You've got to think about tomorrow.")
            << tr("You will be surprised by a loud noise.")
            << tr("You will feel hungry again in another hour.")
            << tr("You might have mail.")
            << tr("You cannot kill time without injuring eternity.")
            << tr("Computers are not intelligent. They only think they are.");
}
//! [0]
 
//! [1]
void FortuneServer::incomingConnection(qintptr socketDescriptor)
{
   QString fortune = fortunes.at(qrand() % fortunes.size());
   FortuneThread *thread = new FortuneThread(socketDescriptor, fortune, this);
   connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
   thread->start();
}
//! [1]


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 25, 2014, 11:11
Не вижу ваших проблем в упор.
Fortune Server спокойно держит до 15 клиентов, принимает и отсылает данные. И есть подозрение что так будет и при 100+ клиентах.
Вам нужно всего-то свой протокол сделать. Команды запроса-ответа, механизм верификации.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 25, 2014, 13:55
Да, точно, Вы правы! Со стороны сервера при новом соединении создаётся новый сокет:
Код
C++ (Qt)
void IcebreakerServer::readyRead()
{
   // ...
   QTcpSocket* clientSocket = (QTcpSocket*)sender();
   // ...
}
 

Надо со стороны Viewer несколько сокетов завести. Скорее всего, сервер переделывать не придётся. Спасибо! :)


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 25, 2014, 15:23
Зачем несколько сокетов?
Цитировать
В упор не вижу ваших проблем
.
По одному сокету можно спокойно запросить одну команду, потом другую. И периодически посылать третью с интервалом.


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 25, 2014, 15:35
А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет?


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 25, 2014, 16:20
м... это долгая операция. Хотя смотря как пересылать. Всё равно в одном пакете не получится, значит просто будут части посылаться. А между пакетами с частями всей инфы можно и любой другой пакет запросить.

PS и да, можно просто блочить интерфейс на ресурсоёмкую операцию. Все так делают, ничего постыдного нет.


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 25, 2014, 16:23
А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет?
Почему?


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 26, 2014, 10:04
Ура! Я выполнил задание! Всем огромное спасибо! :D

Вот так на рисунке выглядят программы: Server, Viewer, Менеджер датчиков:
(http://i.pixs.ru/storage/7/4/9/157png_6499387_11407749.png)

Исходники
Server: https://github.com/8Observer8/IcebreakerServer/tree/with_sensors_manager (https://github.com/8Observer8/IcebreakerServer/tree/with_sensors_manager)
Viewer: https://github.com/8Observer8/IcebreakerViewer/tree/with_sensors_manager (https://github.com/8Observer8/IcebreakerViewer/tree/with_sensors_manager)
Менеджер датчиков: https://github.com/8Observer8/Sensors (https://github.com/8Observer8/Sensors)

Краткое описание проекта:

"Сервер Данных"
- пользователь запускает программу "Сервер Данных"

"Драйвер Датчика"
- пользователь запускает программу "Драйвер Датчика" (на том же компьютере, что и
"Сервер Данных" или удалённом компьютере)
- добавляет датчики в таблицу, нажимая в меню "Добавить". В открывшимся диалоге
указывает: имя датчика, номер COM-порта. В меню есть так же пункты: "Редактировать", "Удалить" запись из таблицы.
- вводит IP адрес (или имя компьютера) и порт "Сервера Данных"
- нажимает кнопку "Подсоединиться к серверу"
- пользователь может наблюдать текущие значения каждого датчика в приложении "Драйвер Датчика" в таблице

"Сервер Данных"
- после того, как пользователь нажал кнопку "Подсоединиться к серверу" в приложении
"Драйвер Датчика", то "Сервер Данных" начинает принимать данные
- "Сервер Данных" сохраняет данные от датчиков в базу данных в таком виде: имя датчика,
значение датчика, дата и время съёма

"Приложение Оператора"
- пользователь запускает "Приложение Оператора"
- вводит IP адрес (или имя компьютера) и порт сервера
- нажимает кнопку "Подсоединиться к серверу"
- "Приложение Оператора" начинает отправлять запросы приложению "Сервер Данных" каждую секунду
- в ответ приложение "Сервер Данных" присылает текущие значения датчиков
- "Приложение Оператора" отображает текущие значения датчиков
- пользователь вводит требуемый временной диапазон (дата-время) и получает от
приложения "Сервер Данных" значения датчиков за указанный период
- пользователь так же может узнать значение указанного датчика в указанный момент
времени, а так же значения указанного датчика в указанный период времени

Дополнительная функциональность (которую я не успел реализовать на Qwt). Пользователь может
наблюдать текущие значения датчиков на графике в "Приложении Оператора" (графики рисуются в
реальном времени). Как в примере из Qwt:
(http://i.pixs.ru/storage/7/6/3/155png_7892683_11407763.png)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 27, 2014, 15:46
Облом... Вчера отправил задание на проверку. Сегодня позвонил. Сказали, что у них в компании какие-то проблемы и они экстренно все вакансии закрыли. Вот эта вакансия: http://www.volgasoft.com/careers.htm#cppj

По Qt в Саратове ничего больше нет. И эта компания подходила, так как они работают с зарубежным заказчиком. Хотелось ещё английский, чтобы пригодился (хотя он ещё очень плох). Теперь либо удалённо искать на Qt, либо изучать C# или Java.

Наверное всё же посижу ещё немного на шеи у родителей, отлично изучу C++ и Qt и найду себе работу по удалёнке!


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 27, 2014, 15:52
они экстренно все вакансии закрыли.
А что они там вообще делали?


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 27, 2014, 16:19
По-моему, то же самое что и я делал, только для конкретных систем и в других масштабах. Системы сбора, хранения и визуализации данных. Российский заказчик у них ГазПром. Пишут ПО для управления промышленным оборудованием.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Март 27, 2014, 16:51
Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке :D Есть вроде одна система специально под газпром написанная :)

Разве что для интерфейса :)


Название: Re: Система сбора и отображения данных
Отправлено: 8Observer8 от Март 27, 2014, 16:56
У них ещё .NET. А так они в основном с зарубежным заказчиком работают. Вот что они применяют для разработок: http://www.volgasoft.com/expertise/


Название: Re: Система сбора и отображения данных
Отправлено: Old от Март 27, 2014, 16:58
Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке :D
Для чего искать разработчиков Qt, что бы они забыли про Qt? :)

Разве что для интерфейса :)
Ну так Qt для этого и предназначен. :)


Название: Re: Система сбора и отображения данных
Отправлено: pilot.net от Май 13, 2014, 21:05
Может они этот форум читают, вот и закрыли вакансии  :)
Почему то у них на сайте общими словами написано и не понятно что за софт конкретно они пишут
Ни рекламы ни чего.


Название: Re: Система сбора и отображения данных
Отправлено: Bepec от Май 13, 2014, 22:00
И не будут писать. И я не буду писать :D Мне свобода дорога :D