Реализация логирования событий IoT-устройств в мобильном приложении
Журнал событий IoT — не просто таблица с датой и текстом. Это инструмент разбора инцидентов: когда устройство потеряло связь, когда сработал датчик, кто и когда отправил команду. Без фильтрации и быстрого поиска по сотням тысяч записей журнал бесполезен.
Структура события и хранение
Минимальный набор полей события:
data class DeviceEvent(
val id: Long,
val deviceId: String,
val timestamp: Instant,
val severity: Severity, // DEBUG, INFO, WARNING, ERROR, CRITICAL
val category: String, // "connection", "sensor", "command", "firmware"
val message: String,
val metadata: Map<String, Any?>, // payload зависит от категории
)
На бэкенде — TimescaleDB (PostgreSQL extension) или ClickHouse для хранения временных рядов событий с быстрыми range-запросами. В мобильном клиенте — страничная загрузка с фильтрами.
Фильтрация и поиск
Future<List<DeviceEvent>> fetchEvents({
required String deviceId,
DateTime? from,
DateTime? to,
List<Severity>? severities,
String? searchQuery,
int page = 0,
int pageSize = 50,
}) async {
return _api.getEvents(
deviceId: deviceId,
from: from?.toIso8601String(),
to: to?.toIso8601String(),
severities: severities?.map((s) => s.name).toList(),
q: searchQuery,
offset: page * pageSize,
limit: pageSize,
);
}
Цветовая кодировка по severity: серый (DEBUG), белый (INFO), жёлтый (WARNING), красный (ERROR/CRITICAL). Критические события — выше в списке независимо от времени, остальные — по убыванию времени.
Локальный кеш и офлайн
Последние 500 событий кешируем в SQLite (drift) — журнал доступен без интернета. При восстановлении связи дозагружаем новые записи с момента последней синхронизации через since параметр API.
Реализация журнала событий IoT с фильтрацией, поиском, цветовой кодировкой и офлайн-кешем: 1–2 недели. Стоимость рассчитывается индивидуально.







