ididdidi

Cogito, ergo sum

^

Мобильная система мониторинга

1. Цель проекта

Создание программной системы для автоматизации контроля за проведением обходов на предприятиях, с целью повышения качества их осуществления, освобождение персонала от рутинных операций по заполнению журналов обхода, с помощью идентификации датчиков во время совершения обхода, получения информации с Центрального поста о значениях их показаний, визуализации показаний с датчика на экране мобильного устройства, отправки сообщения на Центральный пост о том, что объект был проинспектирован.

1.2. Область применения разработки

Приложение предназначено для работы на предприятиях с системой централизованного получения технологической информации с объектов её инфраструктуры.

2. Функциональные требования

2.1. Входныe данныe

2.2. Входныe данныe

2.3. Идентификация датчиков в системе

Так как датчиков может быть огромное множество, а их типы и назначение повторятся, целесообразно их структурировать в виде каталогов. Имена вложенных каталогов указывать через «слеш» ( / ), последним будет указано название датчика, например: Название_системы / название_подсистемы / имя_датчика - это будет полное имя датчика. Полное имя датчика будет использоваться для получения информации с него. Для того чтобы быстро и точно передать имя датчика в приложение можно использовать Bluetooth-маяки и NFC-метки, закодировав его в соответствующий сигнал.

В рамках дипломной работы я заменил эти два способа передачи данных считыванием QR-кодов. Данная функция работает аналогично, только используется не чип NFC или Bluetooth модуль, а камера смартфона. Это делает систему ещё более доступной, так как не нужно использовать дополнительное оборудование кроме принтера. Вместе с тем она имеет один существенный недостаток: недобросовестный обходчик может скопировать изображение и никуда не ходить.

2.4. Требования к аппаратному и программному обеспечению

Мобильный телефон – смартфон с поддержкой передачи данных сети Wi-fi, Bluetooth, NFC, оснащённый цифровой камерой, под управлением операционной системы Android 8.1 и выше.

2.5. Сетевой протокол для передачи данных на устройство

Для взаимодействия между собой устройства используют различные промышленные протоколы, одним из популярных протоколов для этой цели является MQTT. MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала. Вышеперечисленные достоинства позволяют применять его в системах M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).

3. Реализация

Исходя из анализа требований, предъявляемых к системе, была составлена её структурная схема:

Рис.1. Структурная схема

3.1. Алгоритм работы приложения

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

Все этапы представлены в алгоритме:

Рис.2. Алгоритм

3.2. Структура приложения

Название модуля Реализуемая функция
MQTT Подключение к брокеру, аутентификация передачу сообщений с докладом о идентификации датчика, получение сообщений с показаниями идентифицированных датчиков
QRDecoder.Camera Управление камерой и получение изображения с неё
QRDecoder.Barcode Детектирование и расшифровывание QR-кодов, полученных в виде изображений с камеры
Database Взаимодействие с базой данных SQLite
UI Реализация пользовательского интерфейса

Рис.3. Диаграмма классов

3.3. MQTT-клиент

MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала. Вышеперечисленные достоинства позволяют применять его в системах M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).

Для создания MQTT-клиента в своём приложении я использовал Paho MQTT и Android-сервис, предоставляемый Eclipse. Как добавить его в проект и как с ним взаимодействовать прсмотренно в статье MQTT-клиент для Androud.

3.4. Идентификация датчиков

Идентификатором датчика в системе будет уникальное имя датчика, ввод которого будет осуществлён с помощью камеры устройства. Для обработки изображений, специалистами Google были реализованы примеры кода android-vision, в которых присутствует модуль barcode-reader, состоящий из классов:

Название класса Реализуемая функция
CameraSource Предоставляет управление камерой для получения предварительного просмотра. Получает изображение предварительного просмотра камеры с определённой частотой, отправляя кадры детектору по мере того как он их обрабатывать. Кадры могут быть отброшены, если детектор не успевает обрабатывать все кадры, генерируемые камерой. Частоту кадров можно указать с помощью метода setRequestedFps (float).
CameraSourcePreview Отвечает за отображение кадров предварительного просмотра камеры на экран.
GraphicOverlay Отображает графические объекты поверх связанного предварительного просмотра камеры. Представление, отображающее серию пользовательских графических объектов, накладываемых поверх связанного предварительного просмотра (т. е. камеры). Позволяет добавлять графические объекты, обновлять их и удалять их, вызывая и отключая видимость соответствующего рисунка в пределах view. Поддерживает масштабирование и зеркальное отображение графики относительно свойств предварительного просмотра камеры. Размеры элементов выражаются в значениях размера предварительного просмотра, но должны быть масштабированы к полному размеру экрана.
BarcodeGraphicTracker Это трекер, который используется для обнаружения штрихкодов на экране, и их отслеживания для наложения графики, а также удаления графики, когда штрих-код покидает зону видимости.
BarcodeGraphic Используется для отрисовки экземпляра накладываемого на штрих-код изображения с учетом его положения, размера и идентификатора.
BarcodeTrackerFactory Реализует паттерн «Фабрика» и используется для создания трекеров штрих-кода — по одному для каждого штрих-кода.

Эти классы используют интерфейсы Mobile Vision, которые обеспечивают API для обнаружения штрих-кода. На данный момент эта библиотека уже устарела и не поддерживается, вместо неё можно воспользоваться библиотекой ML Kit

3.5. Хранение информации

Информацию сохраняемая в приложении делится на два группы:

Первая группа характеризуется небольшим, но постоянным объёмом данных. Поэтому для неё в качестве хранилища будет использован SharedPreferences — постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек. В файле SharedPreferences будут созданы поля вида:

<map>
    <string name="Ключ">Значение</string>
</map>

Ключи и значения параметров будут задаваться при старте приложения и хранится в закрытом хранилище. Планируется использовать следующие ключи:

Вторая группа — показания датчиков — очень динамична в процессе работы и может как увеличивать объём данных, используемых в приложении, так и уменьшать. Для хранения информации о показаниях датчиков приложение использует базу данных SQLite.

База данных приложения будет состоять из трёх таблиц:

Рис.4. База данных приложения

В таблице types, кроме поля id, которое является первичным ключом, присутствуют ещё четыре поля:

В таблице sensors, помимо поля id, которое является первичным ключом, имеются три поля:

В третей таблице readings также присутствует поле id(первичный ключи), и три поля:

3.6. Графический интерфейс пользователя

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

Рис.5. Навигационная карта

Экран аутентификации содержит текстовые поля для ввода имени пользователя и пароля, которые используются для аутентификации пользователя в системе, Кнопку «Sign in», при нажатии которой происходит попытка соединиться с сервером, виртуальную клавиатуру для ввода значений в текстовые поля. Также в верхнем меню присутствует кнопка перехода, к экрану настроек оформленная в виде значка шестерёнки.

Если после нажатия на кнопку «Sign in» соединение с сервером не будет установлено, на экран будет выведено сообщение об ошибке с предложением проверить настройки соединения. Для настройки соединения необходимо нажать на знак в виде шестерёнки в углу экрана. Произойдёт переход на экран настройки.

На экране настройки также присутствуют два текстовых поля:

Виртуальная клавиатура зависит от активного текстового поля. Если активно поле URL — адреса, выводится полноценная клавиатура с основными буквенное-символьными элементами. Если активно поле для ввода номера порта — выводится только цифровая клавиатура. В верхнем меню активируются следующие пункты

Основной экран приложения объединяет область для идентификации датчика и список. Для идентификации датчика используется изображение с камеры, которую пользователь направляет на QR-код. Ниже отображается список идентифицированных датчиков в порядке обратном времени идентификации. Каждый элемент списка содержит название датчика и его показания.

Внизу экрана расположено горизонтальное меню, которое состоит из пунктов:

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

4. Тестирование

Для проверки работоспособности приложения потребуется:

4.1. Установка MQTT-сервера

Для организации передачи сообщений по сети необходимо установить Mosquitto – это популярный MQTT-сервер (или брокер). Он прост в установке и настройке и активно поддерживается сообществом разработчиков. Устанавливаем Mosquitto с помощью консольной команды:

sudo apt-get install mosquitto-clients

По умолчанию сервис Mosquitto запускается сразу после установки. Для настройки пароля в консоль вводим:

sudo mosquitto_passwd -c /etc/mosquitto/passwd <username>

Открываем файл конфигурации:

sudo nano /etc/mosquitto/mosquitto.conf

В открывшемся файле необходимо указать путь к файлу с именем пользователя и хэшем пароля:

allow_anonymous false
password_file /etc/mosquitto/mosquitto.pwd

После сохранения файла, нужно перезапустить сервер:

sudo systemctl restart mosquitto

4.2. Скрипт для генерации тестовых значений

Для моделирования работы системы был написан скрипт на языке bash. В бесконечном цикле скрипт генерирует случайные значения и посредством команды mosquitto_pub отправляет их на сервер, который перенаправляет эти сообщения клиентам, подписавшимся на соответствующие темы.

#!/bin/bash
echo "Рестарт сервера"
sudo systemctl stop mosquitto
sleep 0.5
sudo systemctl start mosquitto
sleep 0.5

echo "Получим адрес сервера"
ipm="$(ip -4 addr show scope global | awk '$1 ~ /^inet/ {print $2}')"
ip="$(echo $ipm | awk -F"/"'{print $1}')"
echo "ip = "$ip

echo "Запускаем цикл генерации значений"
echo "---------------------------------"
n=32
i=0

while [ 1 ]
do
    let "number = ($RANDOM % 100)"
    number=0.7$number
    number+="Bar"
    mosquitto_pub -h $ip -t "ОНП/Маш.Зал/давление масла" -m $number -u "8host" -P "1234"

    let "number = ($RANDOM % 10 + 1495)"
    number+="об/c"
    mosquitto_pub -h $ip -t "ОНП/Маш.Зал/обороты" -m $number -u "8host" -P "1234"

    let "number = ($RANDOM % 10)"
    number=34.3$number
    number+="С"
    mosquitto_pub -h $ip -t "ОНП/Литейный цех/температура" -m $number -u "8host" -P "1234"

    let "number = ($RANDOM % 10)"
    number=2.5$number\
    number+="м/с"
    mosquitto_pub -h $ip -t "ОНП/Сборочный конвейер/скорость" -m $number -u "8host" -P "1234"
done

4.3. QR-коды

Для проверки работоспособности были сгенерированы соответствующие QR-коды:

Спасибо за внимание! :)

tags: studies - java - android - mqtt

2019-06-27