Общее описание локального сервера
Локальный сервер представяет собой автономно работающий сервис под ОС семейства Linux (так называемый демон). Задачи, выполняемые локальным сервером:
- Подключение устройств по USB и TCP/IP (порт 4081 без шифрования и порт 4082 с SSL). По USB подключаются устройства, представленные в системе как виртуальные COM порты. Так же возможно подключение устройств через реальные COM порты, если они присутствуют в системе. По TCP/IP можно подключать конкретные устройства по имени хоста или IP адресу. Кроме того, можно настроить рассылку широковещательных сообщений о наличии сервера в сети (используется UDP порт 4081). При этом устройства могут обрабатывать такие сообщения и подключаться к локальному серверу самостоятельно.
- Сбор данных с датчиков. Под каждый датчик, данные с которого необходимо собрать и обработать, создается отдельное хранилище. При этом в зависимости от необходимости хранилища могут быть разных типов:
- Непрерывные. Данные пишутся непрерывно по мере поступления с устройства.
- Сессионные. Могут быть автоматическими или ручными, но использовать автоматические на локальном сервере как правило нет необходимости. Данные записываются в хранилище только после создания и открытия на запись отдельной сессии, имеющей свое имя и атрибуты. После остановки сессии запись данных прекращается. Данный тип хранилищ хорошо подходит для записи данных экспериментов или, например, лабораторных работ.
- Хранение последних N значений. Запись ведется непрерывно, но хранится только фиксированное число последних значений. При поступлении новых данных наиболее старые удаляются.
- Хранение последних N значений в памяти. Работает аналогично предыдущему типу, но данные хранятся в оперативной памяти и не записываются на диск вообще. Подходит для случаев, когда локальный просмотр и обработка данных не предполагаются.
- Подключение клиентских приложений локально (unix-сокет /tmp/wliotproxyd) или по протоколу TCP/IP (порт 4083 с обязательным шифрованием SSL).
- Экспорт собираемых данных во внешние сервисы, такие как облачный сервер Alterozoom, Thingspeak, Amazon и т.д. В некоторых случаях поддерживается также получение команд для устройств от внешнего сервиса.
- Локальная обработка данных. На данный момент поддерживается два способа локальной обработки поступающих данных: обработка внутри самого сервера с помощью скриптов, написанных на языке javascript, и обработка в отдельном приложении, подключающемся к локальному серверу как клиент и получающему уведомления о появлении новых данных. Для второго варианта разработана клиентская библиотека на языке С++ с использованием фреймворка Qt.
Пользователи и права доступа
Локальный сервер работает в многопользовательском режиме, при котором есть множество пользователей с возможностью объединения в группы. Каждым устройством владеет какой-то пользователь, при этом владелец устройства может управлять разрешениями на доступ к устройству других пользователей.
После первого запуска ЛС автоматически будет добавлен суперпользователь с id 0 и именем root, но не будет задан его пароль, поэтому подключиться удаленно не получится. Суперпользователь имеет доступ ко всем устройствам, пользователям и группам на сервере.
При работе с сервером с помощью консольного клиента на том же ПК, где установлен сам локальный сервер, автоматически происходит идентификация суперпользователя без необходимости ввода пароля. При работе с сервером удаленно по сети TC/IP (например, из приложения для ОС Windows) нужно явно указывать имя и пароль пользователя.
Файл настроек
Все настройки сервера делатся на две группы системные и внутренние. Системные находятся в файле /etc/wliotproxyd.ini, внутренние распределены по файлам в рабочей директории /var/lib/wliotproxyd. Как правило, вручную редактировать внутренние настройки нет необходимости, так как для их изменения существуют специальные команды сервера. Наоборот, системные настройки редактируются внешним текстовым редактором ОС и как правило только из-под аккаунта системного администратора.
Файл системных настроек представляет собой документ в .ini формате. Ниже приведен пример файла настроек.
- server_name - имя сервера, будет отображаться в приложении или по запросу из командной строки при идентификации сервера.
- user и group - имя пользователя и группа пользователей ОС, под которыми будет выполняться процесс локального сервера. Если оставить поля пустыми, сервер будет работать из-под аккаунта администратора (root), что не рекомендуется с точки зрения безопасности. Если пользователь и группа установлены, важно убедиться, что директория /var/lib/wliotproxyd и все ее содержимое доступны для записи.
- networkCrt и networkKey - пути к файлам, содержащим сертификат и приватный ключ для шифрования данных при подключении к серверу по протоколу TCP/IP. Если сертификат и ключ прочитать не удалось, управление сервером по протоколу TCP/IP будет недоступно.
Для интеграции локального сервера в ОС предоставлен файл wliotproxyd.service, при помощи которого можно зарегистрировать ЛС как сервис systemd и автоматически запускать ЛС при старте системы.
Консольный клиент и его команды
Для управления локальным сервером из командной строки Linux был разработан специальный консольный клиент wliotproxy. С использованием консольного клиента доступны следующие возможности:
- Подключение COM и TCP/IP устройств.
- Запрос для устройства списка датчиков и списка поддерживаемых команд.
- Отправка команд устройствам.
- Создание/удаление хранилищ, редактирование атрибутов хранилищ.
- Запрос данных из хранилищ.
- Управление сессиями для сессионных хранилищ, создание, запуск, остановка, удаление сессий, редактирование атрибутов сессий.
- Настройка экспорта данных из хранилищ во внешние сервисы.
- Регистрация виртуальных устройств и генерация измерених от них.
- Управление скриптами обработки данных.
- Управление внутренней конфигурацией сервера:
- Запрос и установка фильтра имен COM-портов, которые будут автоматически подключаться сервером при появлении.
- Запрос и установка списка TCP/IP устройств, которые будут автоматически подключаться сервером.
- Включение и выключение рассылки широковещательных UDP пакетов, сигнализирующих о присутствии ЛС в локальной сети.
- Управление пользователями и правами доступа к устройствам.
В консольном клиенте присутствует строенная справка. Список команд клиента можно получить, выполнив
$wliotproxy --help
Для получения справки по отдельной команде нужно выполнить
$wliotproxy --help <command>
или
$wliotproxy <command> --help
где "<command>" заменяется на конкретную команду.
Для упрощения работы с консольным клиентом прилагается файл wliotproxy_bash_completion.sh, который является скриптом автодополнения для bash_completion и должен быть положен в соответствующую папку с подобными скриптами (зависит от дистрибутива, например /etc/bash_completion.d/).
Инструкции
- Сборка и настройка локального сервера
- Управление локальным сервером с помощью консольного клиента
server_name="Test server"
user=
group=
;address, 127.0.0.1 - local, 255.255.255.255 - broadcast
data_udp_export_address=127.0.0.1
;ssl vertificate and key
;to generate self-signed certificate, use openssl command, for example:
;$ openssl genrsa -out <key_file> 2048
;$ openssl req -x509 -new -key <key_file> -days 10000 -out <crt_file>
networkCrt=/etc/pki/wliotproxyd.crt
networkKey=/etc/pki/wliotproxyd.key