RFIDapp
— это Android-приложение, превращающее обычный смартфон в полноценный терминал для учёта рабочего времени. Система использует внешний RFID-считыватель, подключённый через аудиоразъём (mini-jack), для регистрации прихода и ухода сотрудников по картам стандарта EM Marin. Проект разработан с нуля и демонстрирует глубокие знания в области обработки аудиосигналов в реальном времени, архитектуры Android-приложений и современных практик разработки.
Код проекта является закрытым. Название изменено.
Github Langbar симулирован при помощи gh-lang-mock
- Язык: Kotlin
- UI: Jetpack Compose
- Асинхронность: Kotlin Coroutines
- Архитектура: MVVM (частично)
- Основные библиотеки:
- Android Jetpack (Lifecycle, CameraX)
- Google Guava
- kotlinx.serialization
- Инструменты качества кода: Detekt, Spotless (ktlint), Android Lint, ErrorProne
- CI/CD: Gradle, PowerShell-скрипт для автоматизации локальных сборок и проверок
- Создание надёжного и доступного терминала: Основной задачей была разработка программного решения, которое позволило бы использовать стандартные смартфоны в качестве терминалов, значительно снижая затраты на оборудование.
- Низкоуровневая обработка сигнала: Вместо готовых библиотек был реализован собственный декодер RFID-сигнала на чистом Kotlin. Это потребовало глубокого погружения в цифровую обработку сигналов (DSP) для декодирования Манчестерского кода напрямую из аудиопотока. В качестве основы для алгоритма была взята и кардинально улучшена логика из предыдущей версии приложения заказчика.
- Обеспечение стабильности: Для повышения точности считывания была разработана система консенсуса, которая подтверждает номер карты только после нескольких успешных последовательных декодирований. Также реализован механизм подавления дубликатов при длительном удержании карты у считывателя.
-
Кастомный декодер RFID (Kotlin):
- Сердце приложения — высокопроизводительный декодер стандарта EM4100, написанный полностью на Kotlin. Он пришёл на смену устаревшему решению, значительно превзойдя его в стабильности.
- Алгоритм: Захват аудиопотока (PCM 16-bit) → сегментация по уровню сигнала (RMS) → построение упрощённой "сигнальной строки" и RLE-импульсов → поиск стабильной преамбулы → декодирование Манчестерского кода → проверка целостности данных (чётность) → извлечение ID карты.
- Такой подход позволил реализовать всю логику обработки сигнала нативно в рамках Android-приложения.
-
Конвейер обработки аудио в реальном времени:
AudioProcessor
: Отвечает за непрерывный захват аудио с микрофонного входа, применяет программное усиление (gain) и формирует буферы для анализа.AudioSegmenter
: Динамически выделяет из потока значимые сегменты с сигналом карты, отсекая тишину и шумы. Это оптимизирует производительность, так как декодер обрабатывает только потенциально полезные данные.- Для отладки алгоритмов предусмотрена функция непрерывной записи всей сессии в WAV-файл и экспорт отдельных сегментов.
-
Современный стек Android-разработки:
- UI: Интерфейс построен на Jetpack Compose с автопереключением светлой и тёмной темы, указания состояния приложения, индикацию считывания и проблемы с оборудованием.
- API и разрешения: Приложение корректно работает с последними версиями Android (целевая — Android 14), запрашивает все необходимые разрешения, включая
MANAGE_EXTERNAL_STORAGE
для Android 11+ иFOREGROUND_SERVICE_MICROPHONE
для фоновой работы на Android 14. - Файловая система: Реализован собственный менеджер (
RFIDappFileSystemManager
) для безопасной работы с файлами во внешнем хранилище, организации дебаг (логов, отчётов, аудиодампов) и клиентских данных.
-
Профессиональный подход к качеству кода и сборке:
- Автоматизация: Используется PowerShell-скрипт (
build.ps1
), который автоматизирует весь цикл проверки: форматирование (Spotless/ktlint), статический анализ (Detekt, Android Lint, ErrorProne), запуск unit-тестов и генерацию отчётов о покрытии (JaCoCo). В будущем будет имплементирован в Agent Enforcer. - Тестирование: Unit-тесты покрывают ключевую бизнес-логику. Для проверки декодера в том числе используется набор WAV-файлов — записей сигналов карт, что гарантирует защиту от регрессий.
- Безопасность: Release-сборки проходят минификациию и обфускацию.
- Автоматизация: Используется PowerShell-скрипт (
-
R&D-инструментарий (Python Sandbox):
- Для поддержки разработки и отладки основного алгоритма декодирования была создана отдельная среда (
sandbox
) со скриптами на Python. Этот инструментарий не является частью Android-приложения, а используется как песочница для ИИ Агента-Разработчика. - Возможности: Включает утилиты для визуализации этапов обработки сигнала, сравнительного анализа аудиозаписей с разных устройств, генерации тестовых данных и подбора оптимальных коэффициентов для цифровых фильтров.
- Такой подход позволил итеративно улучшать ядро декодера, используя Python для быстрых экспериментов, и переносить на Kotlin уже проверенные и отлаженные решения, что значительно ускорило R&D-цикл.
- Для поддержки разработки и отладки основного алгоритма декодирования была создана отдельная среда (