ведущий инженер системный администратор, АО “Farg’onaazot”, Республика Узбекистан, г. Фергана
РАЗРАБОТКА МОБИЛЬНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ СЧИТЫВАНИЯ МЕШКОВ ГОТОВОЙ ПРОДУКЦИИ АО “FARG’ONAAZOT”
АННОТАЦИЯ
В статье рассматривается проектирование и внедрение системы маркировки готовой продукции, регистрация / отслеживание нахождения пропусков мешков в производстве химических удобрений. Целью работы является проектирование и разработка системы, предоставляющей возможность организации считывания, регистраций, добавления или удаления из базы данных, инвентаризации и беспрепятственной доставки готовой продукции клиенту предприятий. С помощью RFID-тегов общий процесс будет автоматизирован. Для достижения поставленной цели, помимо всего прочего, будут изучены влияние окружающей среды на работоспособность технологии RFID. Основной задачей исследования стало: полностью автоматизировать процесс для снижения человеческого фактора влияния на него, а также разработка программного обеспечения для мобильного считывателя маркировки готовой продукции предприятия.
ABSTRACT
The article discusses the design and implementation of a finished product labeling system for registration/tracking the location of missing bags in the production of chemical fertilizers. The goal of the work is to design and develop a system that provides the ability to organize reading, registration, adding or deleting from the database, inventory and the smooth passage of finished products to the customer of the enterprise. By waving RFID tags, the overall process will be automated. To achieve this goal, among other things, the influence of the environment on the performance of RFID technology will be studied. The main goal was to fully automate the process to reduce the human factor of this process. Development of software for a mobile reader for marking finished products of an enterprise.
Ключевые слова: Считыватель, метка, RFID, экраны, система, мобильное приложение, Android.
Keyword: Reader, tag, RFID, screens, system, mobile application, Android.
Введение. Необходимо учитывать, что RFID-система включает в себя два обязательных компонента: считывающее устройство и RFID-метка (тег). Чаще всего метка состоит из интегральной схемы, где хранятся данные и антенны для связи со считывателем. Теги классифицируются по нескольким важным параметрам таким как: тип назначения, источник питания и используемой частоты. RFID поддерживает работу на нескольких различных частотах: низкие частоты диапазона LF (125–134 кГц), высокие частоты диапазона HF (13,56 МГц) и сверхвысокая частота диапазона UHF (860–960 МГц). Частотный диапазон LF–RFID обычно составляет от 30 кГц до 300 кГц. Рассматриваемый нами комплекс имеет охват чтения около 10 см. Его скорость чтения ниже, чем у других технологий, хорошо адаптирован к металлическим или жидким средам. Обычно он используется для некоторых приложений с коротким диапазоном чтения. Частотный диапазон высокочастотной радиометки находится в пределах 3МГц–30МГц. Подобного рода комплекс может считывать данные на расстоянии от 10 см до 1 м. В основном, он хорошо подходит для платежей, продажи билетов и передачи данных. Диапазон частот UHF RFID составляет от 300 МГц до 3 ГГц, что может достигать расстояния чтения до 12 м. В некоторых особых случаях частота может быть увеличена даже до 100 м. Скорость передачи данных в таких случаях относительно выше. Поскольку стоимость производства UHF-меток невелика, они в основном используются в розничной торговле и других отраслях с высоким спросом. По типу используемой памяти делятся на: RO (англ. Read Only) – данные записываются только один раз, сразу при изготовлении. Такие метки пригодны только для идентификации. Никакую новую информацию в них записать нельзя, и их практически невозможно подделать. WORM (англ. Write Once Read Many) – кроме уникального идентификатора такие метки содержат блок однократно записываемой памяти, которую в дальнейшем можно многократно читать. RW (англ. Read and Write) – такие метки содержат идентификатор и блок памяти для чтения и записи информации. Данные в них могут быть перезаписаны многократно.
Во время проектирования программного продукта с целью безопасности учитывалась идентификация, подключение к основной базе сервера и использование базы данных. В первую очередь была создана логическая диаграмма самого программного обеспечения (Рис.1).
Рисунок 1. Логическая диаграмма программного проекта
Чтобы формализовать ожидаемые возможности приложения и визуализировать для наглядности использовалась оболочка системы Android OS. Для того, чтобы получить доступ к приложению, в нем необходимо авторизоваться, как и в панели администратора в веб приложении. Основными функциями приложения являются: авторизация, считывание RFID-тегов, необходимость вносить данные и проводить инвентаризацию с мешками готовой продукции.
Рисунок 2. Иерархия объектов программного комплекса
Следующим этапом проектирования было создание UML диаграммы состояний. Это позволяет посмотреть в целом на весь планируемый функционал и спроектировать логику приложения, продумав возможные ошибки при работе считывание мешков. Впоследствии надо просто воплотить логику, представленную на схеме – это сильно упрощает разработку. В первую очередь при разработке проект был разделен согласно функциям использования и назначений. Было произведено наглядное наименование и разделение поименно каждой функции и процедуры программы (Рис. 2). Мы можем увидеть в папке UI внешний вид программного проекта и вспомогательные окна для авторизации в программный проект. Для удаленного подключения и использования базы данных всех составляющих на серверных приложениях применяются функции находящиеся в папке «databinding» и используемые для синхронизации данных с сервером. В паке «api» используется внешняя оболочка программного обеспечения с системной Android OS. Ниже указаны фрагменты кодов программного обеспечения.
package logix.rfidtracking; // указываем к какому пакету принадлежит класс FeedReaderDbHelper
import android.content.Context; // импорт класса Context из пакета android.content
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class FeedReaderDbHelper extends SQLiteOpenHelper { // объявление класса FeedReaderDbHelper
public static final String DATABASE_NAME = "LogixRFIDTracking.db"; // название базы данных где хранятся товары
public static final int DATABASE_VERSION = 1;
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, (SQLiteDatabase.CursorFactory) null, 1); // передача параметров в класс SQLiteOpenHelper
} public void onCreate(SQLiteDatabase db) { // метод для создания таблиц
db.execSQL("CREATE TABLE config (sync_id INTEGER, send_id INTEGER, till_id INTEGER, license TEXT, host_name TEXT, language INTEGER)"); // создание таблицы config
db.execSQL("CREATE TABLE info (idn INTEGER, name TEXT, warehouse INTEGER)");
db.execSQL("CREATE TABLE rfid_users (idn INTEGER, pass TEXT)"); db.execSQL("CREATE TABLE customers (idn INTEGER PRIMARY KEY, name TEXT)");
db.execSQL("CREATE TABLE warehouses (idn INTEGER PRIMARY KEY, name TEXT)"); db.execSQL("CREATE TABLE products (idn INTEGER PRIMARY KEY, name TEXT)");
db.execSQL("CREATE TABLE rfid_languages (idn INTEGER PRIMARY KEY, name TEXT)"); db.execSQL("CREATE TABLE rfid_languages_ex (idn INTEGER PRIMARY KEY, fk_rfid_language INTEGER, original TEXT, selected TEXT)");
db.execSQL("CREATE TABLE mob_tracking (idn INTEGER PRIMARY KEY, date TEXT, customer INTEGER, warehouse INTEGER, status INTEGER, order_id INTEGER, till_id INTEGER)");
db.execSQL("CREATE TABLE mob_tracking_ex (idn INTEGER PRIMARY KEY, fk_mob_tracking INTEGER, tag TEXT, date TEXT)");
db.execSQL("CREATE TABLE mob_checking (idn INTEGER PRIMARY KEY, date TEXT, customer INTEGER, status INTEGER)");
db.execSQL("CREATE TABLE mob_checking_ex (idn INTEGER PRIMARY KEY, fk_mob_checking INTEGER, tag TEXT, product INTEGER DEFAULT 0, part_no TEXT DEFAULT '', date_production TEXT DEFAULT '', expiration_date TEXT DEFAULT '', sale_date TEXT DEFAULT '', warehouse INTEGER DEFAULT 0, customer INTEGER DEFAULT 0, date TEXT)");
db.execSQL("CREATE TABLE sync_table (idn INTEGER PRIMARY KEY AUTOINCREMENT, table_name TEXT, table_idn INTEGER, kind INTEGER, ins_date TEXT)");
db.execSQL("CREATE TABLE rfid_orders (idn INTEGER PRIMARY KEY, date TEXT, operation INTEGER, document_id INTEGER, document_no TEXT, car_no TEXT, customer INTEGER, warehouse INTEGER,product INTEGER, quantity TEXT, sum_volume TEXT, unit_name TEXT, volume_unit_name TEXT, till_id INTEGER, status INTEGER)");
db.execSQL("INSERT INTO config VALUES(0, 0, 0, '', '', 0)"); // заполнение пустыми данными таблицы config
db.execSQL("INSERT INTO rfid_languages VALUES(0, 'ENG')");
db.execSQL("CREATE VIEW info_v AS SELECT t1.name, t2.name warehouse_name FROM info t1 JOIN warehouses t2 ON t1.warehouse=t2.idn"); // создание виртуальных таблиц
db.execSQL("CREATE VIEW mob_tracking_v AS SELECT t1.idn, t1.customer, t1.warehouse, t2.name, t3.name, t1.order_id FROM mob_tracking t1 LEFT JOIN customers t2 ON t1.customer=t2.idn LEFT JOIN warehouses t3 ON t1.warehouse=t3.idn WHERE t1.status=0");
db.execSQL("CREATE VIEW mob_checking_v AS SELECT t1.idn, t1.customer, t2.name FROM mob_checking t1 LEFT JOIN customers t2 ON t1.customer=t2.idn WHERE t1.status=0");
db.execSQL("CREATE VIEW mob_checking_ex_v AS SELECT t1.idn, t1.fk_mob_checking, t1.tag, IFNULL(t2.name, '') product_name, t1.part_no, t1.date_production, t1.expiration_date, t1.sale_date, IFNULL(t3.name, '') customer_name, IFNULL(t4.name, '') warehouse_name, t1.customer FROM mob_checking_ex t1 LEFT JOIN products t2 ON t1.product=t2.idn LEFT JOIN customers t3 ON t1.customer=t3.idn LEFT JOIN warehouses t4 ON t1.warehouse=t4.idn");
db.execSQL("CREATE VIEW rfid_orders_v AS SELECT t1.idn, CASE WHEN t1.customer<>0 THEN t2.name ELSE t3.name END name, t1.customer, t1.warehouse, t1.document_no, t1.date, t1.car_no, IFNULL(t4.name, '') product_name, t1.quantity, t1.sum_volume, t1.unit_name, t1.volume_unit_name, CASE t1.operation WHEN 0 THEN 'Product income'WHEN 2 THEN 'Product deletion'WHEN 3 THEN 'Product count'WHEN 4 THEN 'Product loading (Deletion)'WHEN 5 THEN 'Product loading'WHEN 11 THEN 'Product loading (Scales)'WHEN 8 THEN 'Product transfer'WHEN 10 THEN 'Sales return' ELSE '' END operation_name FROM rfid_orders t1 LEFT JOIN customers t2 ON t1.customer=t2.idn LEFT JOIN warehouses t3 ON t1.warehouse=t3.idn LEFT JOIN products t4 ON t1.product=t4.idn WHERE t1.status=0 AND (t1.customer<>0 OR t1.warehouse<>0)");
db.execSQL("CREATE VIEW send_v AS WITH send AS (SELECT s.idn, s.table_name, s.table_idn FROM sync_table s, config c WHERE s.idn>c.send_id ORDER BY s.idn LIMIT 100) SELECT table_name, '('||group_concat(table_idn,', ')||')' table_idn,(SELECT MAX(idn) FROM send) last_send_id FROM send GROUP BY table_name");
db.execSQL("CREATE TRIGGER mob_tracking_upd AFTER UPDATE ON mob_tracking BEGIN INSERT INTO sync_table(table_name, table_idn, kind, ins_date)SELECT 'mob_tracking_ex', t2.idn, 1, datetime('NOW') FROM mob_tracking t1, mob_tracking_ex t2 WHERE t1.status=1 AND t1.idn=t2.fk_mob_tracking AND t1.idn=new.idn UNION ALL SELECT 'mob_tracking', idn, 1, datetime('NOW') FROM mob_tracking WHERE status=1 AND idn=new.idn; END "); // создание триггеров
db.execSQL("CREATE TRIGGER mob_checking_upd AFTER UPDATE ON mob_checking BEGIN INSERT INTO sync_table(table_name, table_idn, kind, ins_date)SELECT 'mob_checking_ex', t2.idn, 1, datetime('NOW') FROM mob_checking t1, mob_checking_ex t2 WHERE t1.status=1 AND t1.idn=t2.fk_mob_checking AND t1.idn=new.idn UNION ALL SELECT 'mob_checking', idn, 1, datetime('NOW') FROM mob_checking WHERE status=1 AND idn=new.idn; END ");
} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // очистка базы данных, тут удаляются таблицы, триггеры и т.д.
db.execSQL("DROP TABLE IF EXISTS config"); // удалить таблицу config
db.execSQL("DROP TABLE IF EXISTS info"); db.execSQL("DROP TABLE IF EXISTS rfid_users");
db.execSQL("DROP TABLE IF EXISTS customers"); db.execSQL("DROP TABLE IF EXISTS warehouses");
db.execSQL("DROP TABLE IF EXISTS products"); db.execSQL("DROP TABLE IF EXISTS rfid_languages");
db.execSQL("DROP TABLE IF EXISTS rfid_languages_ex"); db.execSQL("DROP TABLE IF EXISTS mob_tracking");
db.execSQL("DROP TABLE IF EXISTS mob_tracking_ex"); db.execSQL("DROP TABLE IF EXISTS mob_checking");
db.execSQL("DROP TABLE IF EXISTS mob_checking_ex"); db.execSQL("DROP TABLE IF EXISTS sync_table");
db.execSQL("DROP TABLE IF EXISTS rfid_orders");
db.execSQL("DROP VIEW IF EXISTS mob_tracking_v"); // удалить виртульаную таблицу mob_tracking_v
db.execSQL("DROP VIEW IF EXISTS mob_checking_v"); db.execSQL("DROP VIEW IF EXISTS mob_checking_ex_v");
db.execSQL("DROP VIEW IF EXISTS rfid_orders_v"); db.execSQL("DROP VIEW IF EXISTS send_v");
db.execSQL("DROP TRIGGER IF EXISTS mob_tracking_upd"); // удалить триггер (хравнимая процедура) mob_tracking_upd
db.execSQL("DROP TRIGGER IF EXISTS mob_checking_upd");
onCreate(db); // создаем таблицы заново
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { // другой способ вызова функции onUpgrade
onUpgrade(db, oldVersion, newVersion);
} };
Заключение. Данный мобильный программный пакет для считывания RFID меток представляет собой эффективное и удобное средство для работы с данными на RFID метках. Он обеспечивает быстрое и точное чтение информации, удобный интерфейс для работы с данными, а также возможность интеграции с различными системами и устройствами. Такой программный пакет позволяет увеличить эффективность процессов считывания и обработки данных, а также обеспечивает большую гибкость и мобильность в работе с RFID технологиями.
Список литературы:
- Потапова К.А. Идентификация данных с помощью RFID-Меток // Вестник науки. – 2023. – №10 (67). [Электронный ресурс]. – Режим доступа: URL: https://cyberleninka.ru/article/n/identifikatsiya-dannyh-s-pomoschyu-rfid-metok (дата обращения: 23.04.2024).
- Хамзаев Д.И., Абдурахмонов С.М., Хамзаев И.Х. О процессе маркировки мешков готовой продукции на предприятие АО “Farg’onaazot” // Universum: технические науки. – 2023. – №7–1 (112). [Электронный ресурс]. – Режим доступа: URL: https://cyberleninka.ru/article/n/o-protsesse-markirovki-meshkov-gotovoy-produktsii-na-predpriyatie-ao-farg-onaazot. (дата обращения: 22.04.2024).
- Хамзаев Д.И., Абдурахмонов С.М., Хамзаев И.Х. О современных системах учета и маркировки продукции // Universum: технические науки : электрон. научн. журн. – 2023. – № 12 (117). [Электронный ресурс]. – Режим доступа: URL: https://7universum.com/ru/tech/archive/item/16467. (дата обращения: 23.04.2024).
- Хамзаев Д.И., Хамзаев И.Х. Сравнительный анализ между RFID и NFC технологий // Universum: технические науки : электрон. научн. журн. – 2024. – 2 (118). [Электронный ресурс]. – Режим доступа: URL: https://7universum.com/ru/tech/archive/item/.(дата обращения: 23.04.2024).
- Хамзаев Д.И., Хамзаев И.Х. структура и технические характеристики rfid метки // Universum: технические науки : электрон. научн. журн. – 2024. – № 1 (118). URL: https://7universum.com/ru/tech/archive/item/16699. (дата обращения: 24.04.2024).
- Хамзаев Д.И. МИКРОЧИПЫ ДЛЯ RFID МЕТОК // Universum: технические науки: электрон. научн. журн. – 2024. –№ 3(120). [Электронный ресурс]. – Режим доступа: URL: https://7universum.com/ru/tech/archive/item/17012. (дата обращения: 25.04.2024).