Набросок серверной части система сбора информации с устройств.
Введение
ESD v0.1 - это набросок приложения, осуществляющего сбор информации с различных устройств. Приложение написано для ОС Linux с использованием С++11.
Не стоит рассматривать проект как имеющий какую-либо практическую ценность. Несомненно, гораздо практичнее будет использовать любую из множество других существующих систем. Например, из бесплатных имеется OpenSCADA. Это же лишь изложение концепции системы сбора информации, с частичным обоснованием принятых решений. Можно его использовать как отправную точку для своей системы, но предварительно стоит уделить внимание описанным недостаткам.
Описание файлов и классов примера
Core - база приложения (основные интерфейсы).
- IDevice - для возможности манипулирования устройствами (в т.ч. загружаемыми из библиотек расширений) все они должны иметь некой общий интерфейс.
- IDeviceFactory - фабрика классов очевидна. Изоляция кода создания устройства от его клиентов.
- IDeviceValuesPicker - унифицированный интерфейс получения данных от устройства. Позволит абстрагироваться от способа передачи данных (будь то бинарный, текстовый, XML или JSON для удалённых клиентов, или SQL для сохранения в БД).
- ISettings - интерфейс получения настроек. Позволит абстрагироваться от способа их хранения (текстовые или двоичные файлы, архивы, базы данных или удалённая загрузка).
Device - всё то, что позволит оперировать устройствами.
- DeviceConfig - Вспомогательный класс для конкретной реализации DeviceManager для передачи настроек создаваемым устройствам. Обусловлен необходимостью добавить к настройкам ID устройства.
- DeviceIdImpl - реализация вспомогательных средств для двух типов идентификаторов устройств: целое число и строка текста. Выбор осуществляется на стадии компиляции. Примесь выделена в сущность с целью минимизировать изменения в остальном коде, при переключение на другие варианты идентификаторов (например, GUID);
- DeviceManager - реализация контейнера для устройств с одним потоком опроса их всех.
- DeviceValuesPicker2OStream - класс получения данных от устройства с передачей их в поток вывода.
- SimplestDeviceFactory - самая простая реализация фабрики устройств, с жёстко прописанными всеми поддерживаемыми типами.
Devices - реализация устройств.
- DeviceBase - общая часть для всех поддерживаемых устройств. Позволяет оставить интерфейс IDevice чистым, и избежать дублирования кода в классах.
- DeviceRnd - демонстрационный пример устройства. Формирует случайное число в заданном диапазоне.
- UnknownDevice - заглушка для неподдерживаемых или неизвестных типов устройств. Можно использовать для редактирования настроек или исключения из опроса устройств, созданных в другой версии приложения.
Net - средства работы с сетью.
- Socket - обёртка над системными сокетами. Для удобства использования с коде C++ и для локализации изменений при переходе на другую ОС (например, Windows).
- TcpClient - класс для работы с клиентским TCP/IP подключением. На данный момент не используется.
- TcpServer - класс серверного TCP/IP сокета. Текущее ограничение IPv4.
Threading - многопоточность.
- PThreadMutexLockable - обёртка над pthread_mutex. Для блокировок в многопоточной среде, посредством Utils::Lock.
- Thread - обёртка над pthread. Для локализации изменений при переходе на другую ОС (например, Windows).
User - удалённое подключение пользователей к приложению.
- TelnetPacketBuilder - формирователь запросов из потока данных. Для конкретной реализации UserManager. Отправленные по TCP/IP данные могут быть разбиты на несколько пакетов, или наоборот быть объединены. Необходимо средство для выделения отдельных запросов пользователя.
- UserManager - обслуживание удалённых подключений. В текущей реализации в один момент времени обрабатывается только одно подключение типа telnet. Множество одновременных подключений нет.
Utils - набор утилит. Более общий код.
- CommandExecutor - класс реализации командной строки. Разбивает текстовую строку на аргументы, выполняет поиск среди зарегистрированных команд и вызывает соответствующую функцию. Используется в примере для консоли и для удалённого подключения.
- Lock - вспомогательный класс (шаблонный) для упрощения написания кода с блокировкой объекта в многопоточной среде. Сами средства блокировки должен предоставлять блокируемый объект, например, наследуясь от Threading::PThreadMutexLockable.
- SettingsFile - реализация класса для доступа к настройкам, хранящимся в файле (набор строк: ключ = значение).
- SettingsGroupProxy - вспомогательный класс для доступа к группе настроек (группа.ключ = значение). Позволяет так же при обращении скрыть несколько уровней иерархии настроек.
- Utils - набор функций преобразования. Регистр шрифта, целых, времени и строк. В разных версиях C++ такие преобразования выполняются по разному.
Остались нерассмотренными ещё несколько файлов.
- esd0.cpp - содержит функцию main, а в ней много строк кода. Это тестовый пример.
- config.h - определяет только тип DeviceId.
- esd.cfg - файл конфигурации для пробного запуска.
У рассмотренной модели отсутствует ещё несколько необходимых компонентов.
- Нет механизма установки сбоев по показателям устройств.
- Нет механизма протоколирования показателей устройств.
- Нет механизма передачи устройствам управляющих воздействий.
Недостатки реализации
Самые существенные недостатки приведённого примера:
- нет обработки ошибок выполнения;
- нет возможности управлять составом опрашиваемых устройств и их настройками во время работы приложения;
- отсутствие какой-либо проверки прав доступа для удалённых запросов;
- отсутствие шифрования каналов связи;
- отсутствие журналов аварий и сбоев;
- отсутствие журналов показателей устройств;
- отсутствие возможности передачи команд устройствам;
- нет ни единого поддерживаемого реального устройства;
- приложение не выполняет какой-либо полезной работы;
- и ещё множество других недостатков.
Да, написав столько кода, мы по прежнему имеем сырое и бесполезное приложение. Каждый файл, каждый компонент требует доработки, а точнее серьёзной переработки. В итоговом приложение от данного примера не должно остаться практически ничего.
Скачать
Исходный код esd0_src.tar.gz (27 кБ).
Собранный проект esd0_test.tar.gz (503 кБ)
Лицензия BSD (без гарантий, с возможностью коммерческого использования, не выдавать мой код за написанный вами).