====== АННОТАЦИЯ ======
В данном программном документе приведено руководство системного программиста по установке и настройке системы сбора, обработки и хранения результатов измерений (далее система), предназначенной для сохранения и предоставления любых переданных данных, а в частности – с учебных устройств, разработанных на кафедре ПМиВТ МФ МГТУ им. Н. Э. Баумана.
====== Общие сведения о системе ======
Функциональным назначением системы является приём, сохранение и предоставление данных, полученных в процессе проведения замеров.
Основные функции системы состоят в приёме и обработке данных JSON формата, сохранение и предоставлении по запросу, для последующей обработкой операторами.
Для функционирования системы требуется серверная операционная си-стема, система управления базами данных, веб-сервер с поддержкой языка программирования PHP 7.2 и программный код.
====== Структура системы ======
Система сбора, обработки и хранения результатов измерений состоит из комплекса программного обеспечения, необходимого для её выполнения. На серверной операционной системе запущен веб-сервер, ожидающий HTTP запроса. При вхождение запроса выполняется сценарий, зависящий от вызываемого при запросе файла.
====== Настройка системы ======
Подготовка системы к работе делится на несколько этапов, выполнение которых будет рассматриваться на примере системы GNU/Linux Debian 9.
===== 1 Создание базы данных =====
==== Установка СУБД MariaDB ====
Обновите базу пакетов
$ apt-get update
Найдите нужный пакет
$ apt-cache search mysql-server
Установите пакет mariaDB
$ apt-get install mariadb-server-*
Если будет просить ввести root пароль, то оставьте его пустым
Инициализируйте систему безопасности MySQL
$ mysql_secure_installation
После этого система будет задавать вопросы, рассмотренные в разделе «сообщения системного программисту».
==== Настройка СУБД ====
Откройте конфигурационный файл «50-server.cnf» расположенный по пути /etc/mysql/mariadb.conf.d/ и в разделе [mysql] добавьте строку lower_case_table_names = 1 для регистронезависимости имён таблиц.
Перезапустите mysql для внесения изменений
$ systemctl restart mysql
==== Создание и настройка базы данных ====
Зайдите в mysql и создайте новую базу данных:
$ mysql –u root –p
(после нужно ввести пароль)
CREATE DATABASE Production;
Если ошибок нет, то база успешно создана.
Создайте пользователя, под которым сайт будет работать с БД, пользователя для запроса данных, и пользователя-администратора базы данных для удалённого администрирования, следующей командой:
CREATE USER ‘username’@’localhost’ IDENTIFIED BY ‘password’;
Выдайте пользователям привилегии.
Для сайта:
$ GRANT SELECT,INSERT,UPDATE,DELETE ON production.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’;
Для запроса данных:
$ GRANT SELECT ON production.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’;
GRANT FILE ON *.* TO ‘username’@’localhost’ IDENTIFIED BY ‘password’;
Для администратора:
$ GRANT ALL PRIVILEGES ON production.* TO ‘username’@’localhost’ IDEN-TIFIED BY ‘password’;
Выйдите из базы данных.
$ Exit
Воссоздайте структуру базы данных с помощью SQL файла дампа.
mysql -u username -p Production < data-dump.sql
(Структура базы данных рассматривается в Приложении 1.)
===== 2 Установка HTTP сервера =====
==== Установка и настройка пакета apache ====
Установите apache2 веб-сервер
$ apt-get install apache2
Создайте каталог для сайта.
$ mkdir –p /var/www/site.ru/
Настройте конфигурацию виртуального хоста.
$ nano /etc/apache2/sites-available/site.ru.conf
Вставьте в созданный файл конфигурации следующие настройки:
ServerAdmin admin@e-mail
ServerName site.ru
ServerAlias www.site.ru
DocumentRoot /var/www/site.ru/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Options ExecCGI
Сохраните файл и включите сайт.
a2ensite site.ru.conf
Отключите стандартный сайт.
a2dissite 000-default.conf
Перезапустите apache.
systemctl restart apache2
==== Установка и настройка php 7.2 ====
Импортируйте ключ подписи и включите PPA.
$ wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -echo "deb https://packages.sury.org/php/stretch main" | sudo tee /etc/apt/sources.list.d/php.list
Установите сертификаты.
$ apt-get install ca-certificates apt-transport-https
Обновите пакеты.
$ apt-get update
Установите пакеты php 7.2 с наиболее используемыми расширениями
$ apt-get install php7.2 php7.2-cli php7.2-common php7.2-opcache php7.2-curl php7.2-mbstring php7.2-mysql php7.2-zip php7.2-xml php7.2-json
Проверьте результат установки запросом версии php
$ php –v
В конфигурационном файле php.ini располагающемся по пути /etc/php/7.2/apache2/php.ini значение «short_open_tag» укажите «on».
===== 3 Удалённый доступ к файлам веб-приложения =====
Для доступа к файлам сайта можно использовать FTP или SSH.
==== FTP ====
Установите пакет ftp
$ apt-get install proftpd
Откройте конфигурационный файл proftpd.conf, путь к которому /etc/proftpd/proftpd.conf
В строке DefaultRoot укажите /var/www/site.ru/
В строке User укажите пользователя, которого создадите позднее http-admin
В строке Group укажите группу http
Проверьте, чтобы весь раздел был закомментирован.
==== SSH ====
Установите SSH
$ apt-get install openssh-server
Запустите сервис ssh
$ service ssh start
Для загрузки файла на сервер используйте команду
$ scp /path/to/file.http User@remote.host:/var/www/site.ru
Для загрузки папки на сервер используйте команду с ключом –r
$ scp –r path/to/dir User@remote.host:/var/www/site.ru
Для скачивания с сервера на локальную машину используйте команду
$ scp User@remote.host:/var/www/site.ru/file.http local/path/to/dir
===== 4 Создание пользователей системы =====
Создайте группу и http пользователя этой группы.
$ groupadd http
$ adduser User
$ usermod –aG sudo,http User
Выдайте пользователю владение директорией сайта
$ chown –R User:http /var/www/site.ru/
Для возможности экспорта из mysql выдайте разделу /var/www/site.ru/export/ доступ другим пользователям.
$ chmod –R 777 /var/www/site.ru/export/
В случае, если для доступа к файлам сайта было решено использовать FTP, создайте пользователя http-admin и добавьте ему группу http
$ adduser http-admin
$ usermod –aG http http-admin
Смените владельца директории сайта на группу http
$ chgrp –R http /var/www/site.ru/
===== 5 Обязательные изменения в текстах программ =====
1. Откройте в текстовом редакторе файл /core/baseinfo.php.
2. Замените в нём:
* 'server' – если база данных и веб сервер находятся на одной машине, то замените на «localhost», иначе замените на адрес сервера с базой данных.
* 'user' – замените на логин пользователя базы данных.
* 'password' – замените на пароль пользователя базы данных.
* 'BD' – замените на название базы данных (по умолчанию Production).
3. Сохраните изменения
4. Откройте в текстовом редакторе файл /admin/config.php.
5. Добавьте пользователей панели управления.
Шаблонный пример:
$buffer['admin'] = ['password'=>'111','level'=>255];
В данной строке в массив buffer по индексу ‘admin’ вносится массив с паролем ‘12345’ и уровнем доступа ‘255’. Индекс – имя пользователя. Уровень доступа указывает к каким функциям пользователь имеет доступ:
**"1"** – только внесение новых данных.
**"2"** – внесение новых данных и данных калибровки и адресов датчиков.
**"127"** – добавление и редактирование объектов, операторов и приборов.
**"255"** – Полный доступ.
6. Сохраните изменений
7. Загрузите изменённые файлы в директорию сайта.
====== Проверка системы ======
Для проведения проверки системы рекомендуется внести данные в ручном режиме через веб-интерфейс, или же провести тестовую передачу данных с устройства. После выполнение внесения данных, проверьте хранимые данные SQL запросом:
SELECT sd.Num as Num,sd.Type as Type,sd.Value as Value,li.Date as Date,li.uid as Unit
FROM save_data sd
INNER JOIN (
SELECT Num_i as Num, Date, ul.uname as uid
FROM info inf
INNER JOIN (
SELECT uNum,uName as uname FROM units_list) as ul
ON inf.Prib_id = ul.uNum ORDER BY inf.Num_i DESC) as li
ON li.Num = sd.Num
====== Сообщения системному программисту ======
При запуске инициализации системы безопасности MySQL будут заданы вопросы:
----
«Enter current password for root (enter for none)».
Нажмите Enter, текущий пароль root пустой.
----
«Set root password? [Y/n]».
Введите Y. Да, установить пароль root для подключения к MariaDB. Теперь введите «новый» пароль root.
----
«Remove anonymous users? [Y/n]».
Введите Y. Удалить анонимного пользователя.
----
«Disallow root login remotely? [Y/n]».
Введите Y. Запретить подключаться под пользователем root к MariaDB с удаленных машин.
----
«Remove test database and access to it? [Y/n]».
Введите Y. Удалить тестовую базу test.
----
«Reload privilege tables now? [Y/n]».
Введите Y. Перезагрузить таблицу привилегий для вступления их в силу.
====== ПРИЛОЖЕНИЕ 1 ======
===== Структура базы данных =====
Для хранения данных используется следующая структура базы данных:
1. **opr_list(N, Name)** – таблица содержащая данные о операторах.
*Столбцы:
***N** – уникальный номер оператора(id).
***Name** – имя оператора.
2. **objects(NumOb, NameOb)** – таблица содержащая данные о объектах размещения приборов.
*Столбцы:
***NumOb** – уникальный номер объекта размещения(id).
***NameOb** – наименование объекта размещения.
3. **units_list(uNum, uName, Serial, AKey, OPid, x, y, IDob)** – таблица со-держащая данные о используемых приборах.
*Столбцы:
***uNum** – уникальный номер прибора(id).
***uName** – наименование прибора.
***Serial** – серийный номер прибора.
***AKey** – ключ доступа прибора (используется для идентификации при-бора при передаче данных).
***OPid** – уникальный номер оператора (берётся из таблицы OPR_list).
***x** – координата размещения прибора Х.
***y** – координата размещения прибора У.
***IDob** – уникальный номер объекта размещения (берётся из таблицы Objects)
4. **info(Num_i, Date, Prib_id, OpNum, ObjectId, x, y)** – таблица содержащая данные о сессиях передачи данных.
*Столбцы:
***Num_i** – номер сессии передачи данных.
***Date** – временной штамп сессии передачи данных.
***Prib_id** – уникальный номер прибора передавшего данные (берётся из units_list)
***OpNum** – уникальный номер оператора, закреплённого к прибору на момент сессии передачи данных (берётся из OPR_list)
***ObjectId** – уникальный номер объекта размещения, где располагался прибор на момент сессии передачи данных.
***x** – координата X размещения прибора на объекта размещения, на момент сессии передачи данных.
***y** – координата Y размещения прибора на объекте размещения, на момент сессии передачи данных.
5. **save_data(Num, Type, Value)** – таблица содержащая данные, полученные в процессе сессии передачи данных.
*Столбцы:
***Num** – номер сессии, в процессе которой были переданы данные.
***Type** – вид параметра, данные измерения которого были переданы.
***Value** – значение данных для замеряемого параметра.
6. **multiplier(unit, sensor, timestamp, ratio)** – таблица содержащая калибровочные данные датчиков.
*Столбцы:
***unit** – уникальный номер прибора на котором установлен калибруемый датчик.
***sensor** – наименование датчика, параметр, если он снимает несколько параметров, а так же номер датчика, если их несколько в одном приборе
***timestamp** – временная привязка данных калибровки
***ratio** – данные калибровки.
7. **sensors_adr(id, unit_id, sensor, adr, timestamp, sensor_name, note)** – таблица содержащая адреса датчиков.
*Столбцы:
***id** – уникальный номер записи
***unit_id** – уникальный номер прибора на котором установлен датчик
***sensor** – полное название параметра передаваемого датчиком
***adr** – адрес датчика
***timestamp** – время внесения данных
***sensor_name** – короткое наименование параметра
***note** – заметка о датчике и его применение
Далее представлена структура базы данных и взаимосвязь таблиц на рисунке 1.
{{:doc:1513:bd_after.png?nolink|}}
=== Рисунок 1. ===
----
===== SQL запрос, для загрузки в новую базу данных созданной структуры =====
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for info
-- ----------------------------
DROP TABLE IF EXISTS `info`;
CREATE TABLE `info` (
`Num_i` int(1) UNSIGNED NOT NULL AUTO_INCREMENT,
`Date` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Prib_id` tinyint(1) UNSIGNED NOT NULL,
`OpNum` tinyint(1) UNSIGNED NOT NULL,
`ObjectId` tinyint(1) UNSIGNED NOT NULL,
`x` float(10, 5) NOT NULL,
`y` float(10, 5) NOT NULL,
PRIMARY KEY (`Num_i`) USING BTREE,
UNIQUE INDEX `Number_id_index`(`Num_i`) USING BTREE,
INDEX `date_index`(`Date`) USING BTREE,
INDEX `Unit_index`(`Prib_id`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for multiplier
-- ----------------------------
DROP TABLE IF EXISTS `multiplier`;
CREATE TABLE `multiplier` (
`unit` tinyint(1) NOT NULL,
`sensor` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`timestamp` datetime(0) NOT NULL,
`ratio` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`adr` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
INDEX `Unit_index_multip`(`unit`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for objects
-- ----------------------------
DROP TABLE IF EXISTS `objects`;
CREATE TABLE `objects` (
`NumOb` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
`NameOb` varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`NumOb`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for opr_list
-- ----------------------------
DROP TABLE IF EXISTS `opr_list`;
CREATE TABLE `opr_list` (
`N` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
`Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`N`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for save_data
-- ----------------------------
DROP TABLE IF EXISTS `save_data`;
CREATE TABLE `save_data` (
`Num` int(1) UNSIGNED NOT NULL,
`Type` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`Value` char(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
INDEX `Num_ses`(`Num`) USING BTREE,
INDEX `Type_value_index`(`Type`, `Value`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for sensors_adr
-- ----------------------------
DROP TABLE IF EXISTS `sensors_adr`;
CREATE TABLE `sensors_adr` (
`id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
`unit_id` tinyint(1) UNSIGNED NOT NULL,
`sensor` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`adr` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`timestamp` datetime(0) NOT NULL,
`sensor_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
-- ----------------------------
-- Table structure for units_list
-- ----------------------------
DROP TABLE IF EXISTS `units_list`;
CREATE TABLE `units_list` (
`uNum` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT,
`uName` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`Serial` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`AKey` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`OPid` tinyint(1) UNSIGNED NOT NULL,
`x` float(10, 5) NOT NULL,
`y` float(10, 5) NOT NULL,
`IDob` tinyint(1) UNSIGNED NOT NULL,
`remove` bit(1) NOT NULL,
PRIMARY KEY (`uNum`) USING BTREE,
UNIQUE INDEX `Units`(`uNum`, `uName`) USING BTREE
) ENGINE = Aria CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Page;
SET FOREIGN_KEY_CHECKS = 1;