Создание программной системы для автоматизации контроля за проведением обходов на предприятиях, с целью повышения качества их осуществления, освобождение персонала от рутинных операций по заполнению журналов обхода, с помощью идентификации датчиков во время совершения обхода, получения информации с Центрального поста о значениях их показаний, визуализации показаний с датчика на экране мобильного устройства, отправки сообщения на Центральный пост о том, что объект был проинспектирован.
Приложение предназначено для работы на предприятиях с системой централизованного получения технологической информации с объектов её инфраструктуры.
Так как датчиков может быть огромное множество, а их типы и назначение повторятся, целесообразно их структурировать в виде каталогов. Имена вложенных каталогов указывать через «слеш» ( / ), последним будет указано название датчика, например:
Название_системы / название_подсистемы / имя_датчика
- это будет полное имя датчика. Полное имя датчика будет использоваться для получения информации с него.
Для того чтобы быстро и точно передать имя датчика в приложение можно использовать Bluetooth-маяки и NFC-метки, закодировав его в соответствующий сигнал.
В рамках дипломной работы я заменил эти два способа передачи данных считыванием QR-кодов. Данная функция работает аналогично, только используется не чип NFC или Bluetooth модуль, а камера смартфона. Это делает систему ещё более доступной, так как не нужно использовать дополнительное оборудование кроме принтера. Вместе с тем она имеет один существенный недостаток: недобросовестный обходчик может скопировать изображение и никуда не ходить.
Мобильный телефон – смартфон с поддержкой передачи данных сети Wi-fi, Bluetooth, NFC, оснащённый цифровой камерой, под управлением операционной системы Android 8.1 и выше.
Для взаимодействия между собой устройства используют различные промышленные протоколы, одним из популярных протоколов для этой цели является MQTT. MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала. Вышеперечисленные достоинства позволяют применять его в системах M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).
Исходя из анализа требований, предъявляемых к системе, была составлена её структурная схема:
В работе приложения можно выделить четыре основных этапа:
Все этапы представлены в алгоритме:
Название модуля | Реализуемая функция |
---|---|
MQTT | Подключение к брокеру, аутентификация передачу сообщений с докладом о идентификации датчика, получение сообщений с показаниями идентифицированных датчиков |
QRDecoder.Camera | Управление камерой и получение изображения с неё |
QRDecoder.Barcode | Детектирование и расшифровывание QR-кодов, полученных в виде изображений с камеры |
Database | Взаимодействие с базой данных SQLite |
UI | Реализация пользовательского интерфейса |
MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала. Вышеперечисленные достоинства позволяют применять его в системах M2M (Машинно-Машинное взаимодействие) и IIoT (Промышленный Интернет вещей).
Для создания MQTT-клиента в своём приложении я использовал Paho MQTT и Android-сервис, предоставляемый Eclipse. Как добавить его в проект и как с ним взаимодействовать прсмотренно в статье MQTT-клиент для Androud.
Идентификатором датчика в системе будет уникальное имя датчика, ввод которого будет осуществлён с помощью камеры устройства. Для обработки изображений, специалистами Google были реализованы примеры кода android-vision, в которых присутствует модуль barcode-reader, состоящий из классов:
Название класса | Реализуемая функция |
---|---|
CameraSource | Предоставляет управление камерой для получения предварительного просмотра. Получает изображение предварительного просмотра камеры с определённой частотой, отправляя кадры детектору по мере того как он их обрабатывать. Кадры могут быть отброшены, если детектор не успевает обрабатывать все кадры, генерируемые камерой. Частоту кадров можно указать с помощью метода setRequestedFps (float). |
CameraSourcePreview | Отвечает за отображение кадров предварительного просмотра камеры на экран. |
GraphicOverlay | Отображает графические объекты поверх связанного предварительного просмотра камеры. Представление, отображающее серию пользовательских графических объектов, накладываемых поверх связанного предварительного просмотра (т. е. камеры). Позволяет добавлять графические объекты, обновлять их и удалять их, вызывая и отключая видимость соответствующего рисунка в пределах view. Поддерживает масштабирование и зеркальное отображение графики относительно свойств предварительного просмотра камеры. Размеры элементов выражаются в значениях размера предварительного просмотра, но должны быть масштабированы к полному размеру экрана. |
BarcodeGraphicTracker | Это трекер, который используется для обнаружения штрихкодов на экране, и их отслеживания для наложения графики, а также удаления графики, когда штрих-код покидает зону видимости. |
BarcodeGraphic | Используется для отрисовки экземпляра накладываемого на штрих-код изображения с учетом его положения, размера и идентификатора. |
BarcodeTrackerFactory | Реализует паттерн «Фабрика» и используется для создания трекеров штрих-кода — по одному для каждого штрих-кода. |
Эти классы используют интерфейсы Mobile Vision, которые обеспечивают API для обнаружения штрих-кода. На данный момент эта библиотека уже устарела и не поддерживается, вместо неё можно воспользоваться библиотекой ML Kit
Информацию сохраняемая в приложении делится на два группы:
Первая группа характеризуется небольшим, но постоянным объёмом данных. Поэтому для неё в качестве хранилища будет использован SharedPreferences — постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек. В файле SharedPreferences будут созданы поля вида:
<map>
<string name="Ключ">Значение</string>
</map>
Ключи и значения параметров будут задаваться при старте приложения и хранится в закрытом хранилище. Планируется использовать следующие ключи:
autoFocus — отвечает за использование автофокусировки, принимает значения:
ON — автофокусировка активирована
OFF — автофокусировка деактивирована
useFlash — отвечает за включение / выключение подсветки камеры, принимает значения:
ON — подсветка камеры включена
OFF — подсветка камеры выключена
Вторая группа — показания датчиков — очень динамична в процессе работы и может как увеличивать объём данных, используемых в приложении, так и уменьшать. Для хранения информации о показаниях датчиков приложение использует базу данных SQLite.
База данных приложения будет состоять из трёх таблиц:
В таблице types, кроме поля id, которое является первичным ключом, присутствуют ещё четыре поля:
В таблице sensors, помимо поля id, которое является первичным ключом, имеются три поля:
В третей таблице readings также присутствует поле id(первичный ключи), и три поля:
Непосредственного взаимодействия пользователя ожидают четыре функции: аутентификация, настройка подключения к серверу, идентификация датчиков и визуализация их показаний. На основании этого была составлена навигационная карта приложения:
Экран аутентификации содержит текстовые поля для ввода имени пользователя и пароля, которые используются для аутентификации пользователя в системе, Кнопку «Sign in», при нажатии которой происходит попытка соединиться с сервером, виртуальную клавиатуру для ввода значений в текстовые поля. Также в верхнем меню присутствует кнопка перехода, к экрану настроек оформленная в виде значка шестерёнки.
Если после нажатия на кнопку «Sign in» соединение с сервером не будет установлено, на экран будет выведено сообщение об ошибке с предложением проверить настройки соединения. Для настройки соединения необходимо нажать на знак в виде шестерёнки в углу экрана. Произойдёт переход на экран настройки.
На экране настройки также присутствуют два текстовых поля:
Виртуальная клавиатура зависит от активного текстового поля. Если активно поле URL — адреса, выводится полноценная клавиатура с основными буквенное-символьными элементами. Если активно поле для ввода номера порта — выводится только цифровая клавиатура. В верхнем меню активируются следующие пункты
Основной экран приложения объединяет область для идентификации датчика и список. Для идентификации датчика используется изображение с камеры, которую пользователь направляет на QR-код. Ниже отображается список идентифицированных датчиков в порядке обратном времени идентификации. Каждый элемент списка содержит название датчика и его показания.
Внизу экрана расположено горизонтальное меню, которое состоит из пунктов:
Кроме того специальные движения позволяют регулировать zoom на камере, а продолжительное нажатие на элемент списка вызывает контекстное меню, через которое можно удалить данный элемент.
Для проверки работоспособности приложения потребуется:
Для организации передачи сообщений по сети необходимо установить 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
Для моделирования работы системы был написан скрипт на языке 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
Для проверки работоспособности были сгенерированы соответствующие QR-коды:
Спасибо за внимание! :)