Представьте: производственная линия, 500 датчиков вибрации, температуры и давления. Каждую секунду — 250 000 сэмплов. Оператор не может уследить за всем. Нужно мобильное приложение, которое покажет только критические отклонения. Мы разрабатываем такие решения — от сбора данных с PLC до уведомлений на смартфоне. Свяжитесь с нами для обсуждения архитектуры вашего IIoT-решения. Наш опыт — более 10 лет в промышленном интернете вещей (IIoT), более 50 проектов для заводов. Без правильной архитектуры приложение захлебнётся в потоке данных. Поэтому на первом этапе мы проектируем систему сбора и нормализации данных на Edge-шлюзах, а затем строим надёжный real-time канал передачи.
Мобильный мониторинг промышленного оборудования: ключевые технические решения
Edge-компонент — промышленный шлюз (Moxa, Advantech, Siemens IPC) или кастомный Linux-сервер — нормализует данные с разных протоколов и публикует агрегаты в MQTT или отдаёт через REST/WebSocket. Для мобильного приложения важны два потока: реальное время — текущие значения ключевых параметров, обновление раз в 1-5 секунд через WebSocket; и история — тренды за смену, сутки, неделю через REST API с пагинацией и агрегацией.
Как устроен сбор данных в реальном времени?
На уровне оборудования данные собирает Edge-компонент: промышленный шлюз (Moxa, Advantech, Siemens IPC) или кастомный Linux-сервер. Он нормализует данные с разных протоколов (OPC-UA, Modbus, MQTT) и публикует агрегаты в MQTT или отдаёт через REST/WebSocket.
Датчики → PLC / Edge Gateway → Time-Series DB (InfluxDB / TimescaleDB)
↓
Backend API (REST + WebSocket)
↓
Мобильное приложение
Агрегация и нормализация на Edge-шлюзе — мобильный мониторинг промышленного
Согласно документации OPC-UA Part 6, шлюз преобразует адресное пространство OPC-UA в плоские тэги. Для Modbus — маппинг регистров на физические величины (например, регистр 40001 = температура с коэффициентом 0.1). Агрегация: среднее, минимум, максимум за окно 1 секунда. Это снижает трафик в 10-100 раз.
| Протокол | Применение | Частота опроса | Сложность интеграции |
|---|---|---|---|
| OPC-UA | PLC, CNC | 1-1000 мс | Средняя |
| Modbus RTU/TCP | Датчики, контроллеры | 10-1000 мс | Низкая |
| MQTT | IoT-устройства | 1-60 с | Низкая |
| Siemens S7 | SIMATIC S7 | 10-100 мс | Высокая |
Почему архитектура сбора данных — главный вызов?
Используем Flutter с WebSocket. Для надёжности — автоматическое переподключение с экспоненциальной задержкой.
class EquipmentMonitorRepository {
WebSocketChannel? _channel;
final StreamController<EquipmentState> _stateController =
StreamController.broadcast();
Stream<EquipmentState> get stateStream => _stateController.stream;
void connect(String equipmentId, String token) {
_channel = WebSocketChannel.connect(
Uri.parse('wss://iiot.factory.com/ws/equipment/$equipmentId'),
);
_channel!.stream
.map((event) => json.decode(event as String))
.map(EquipmentState.fromJson)
.listen(
_stateController.add,
onError: _handleError,
onDone: _scheduleReconnect,
);
_channel!.sink.add(json.encode({'auth': token}));
}
void _scheduleReconnect() {
Future.delayed(const Duration(seconds: 5), () => connect(_lastId, _lastToken));
}
}
Пример реализации BLoC для управления состоянием
class EquipmentMonitorBloc extends Bloc<EquipmentEvent, EquipmentMonitorState> {
StreamSubscription<EquipmentState>? _subscription;
EquipmentMonitorBloc(this._repository) : super(EquipmentMonitorInitial()) {
on<StartMonitoring>((event, emit) async {
_subscription = _repository.stateStream.listen(
(state) => add(StateUpdated(state)),
);
_repository.connect(event.equipmentId, event.token);
});
on<StateUpdated>((event, emit) {
final current = event.state;
final isAlert = current.temperature > 85.0 || current.vibrationRms > 12.5;
emit(EquipmentMonitorRunning(state: current, hasAlert: isAlert));
});
}
}
WebSocket в 20 раз быстрее HTTP polling при передаче телеметрии. Сравните:
| Способ | Задержка | Нагрузка на батарею | Нагрузка на сервер |
|---|---|---|---|
| HTTP polling | >1 сек | Высокая | Высокая |
| WebSocket | <100 мс | Низкая | Низкая |
| gRPC-stream | <50 мс | Средняя | Средняя |
Визуализация трендов и отклонений
Для исторических данных используем fl_chart (Flutter) или MPAndroidChart. Ключевая оптимизация — агрегация на стороне API. Запрос к InfluxDB-based API:
GET /api/v1/equipment/{id}/trend?
parameter=temperature&
from=2023-01-15T06:00:00Z&
to=2023-01-15T18:00:00Z&
resolution=300 # агрегация по 5 минут
Ответ — массив из 144 точек вместо 43 200. Чарт рисует без фризов.
Baseline и отклонения
Полезная функция — отображение baseline (нормального диапазона) на графике. Если ток двигателя в норме 12-15А, выделяем зону, и оператор сразу видит отклонение:
LineChartData buildTrendChart(List<TrendPoint> data, Range baseline) {
return LineChartData(
extraLinesData: ExtraLinesData(
horizontalLines: [
HorizontalLine(y: baseline.min, color: Colors.green.withOpacity(0.3)),
HorizontalLine(y: baseline.max, color: Colors.green.withOpacity(0.3)),
],
),
betweenBarsData: [
BetweenBarsData(
fromIndex: 0,
toIndex: 0,
color: Colors.green.withOpacity(0.1),
),
],
lineBarsData: [
LineChartBarData(
spots: data.map((p) => FlSpot(p.timestamp.toDouble(), p.value)).toList(),
color: data.any((p) => p.value > baseline.max || p.value < baseline.min)
? Colors.red
: Colors.blue,
),
],
);
}
Что нужно учесть при разработке?
- Агрегация данных — не передавать сырые сэмплы, только агрегаты.
- Офлайн-режим — кешировать последние показатели и алерты в локальной БД.
- Эскалация алертов — если оператор не принял алерт за 5 минут, уведомить мастера.
- Безопасность — TLS, JWT, шифрование на устройстве.
- Тестирование — симуляция до 10 000 устройств.
Для снижения трафика на Edge-шлюзе применяется скользящее окно: из 25 600 сэмплов с вибродатчика формируется 1-10 агрегатов — среднее, пик, RMS, частота основного тона.
Этапы разработки
- Аудит источников данных — разбор протоколов и частоты опроса.
- Проектирование архитектуры — выбор Edge-компонента и Time-Series DB.
- Разработка бэкенда — API агрегации, WebSocket, алерты.
- Разработка мобильного приложения — UI, тренды, пуш-уведомления.
- Интеграция и тестирование — на реальном оборудовании.
- Деплой и поддержка — App Store / Google Play, мониторинг.
Что входит в результат?
- Исходный код мобильного приложения (iOS/Android/Flutter).
- Бэкенд-сервис с API и WebSocket.
- Документация по интеграции и развёртыванию.
- Доступ к репозиторию и CI/CD.
- Обучение операторов (до 2 часов).
- Гарантия 6 месяцев на баги.
Стоимость и сроки
Разработка приложения для одного типа оборудования с WebSocket и трендами — от 4 до 8 недель. Полный цикл с офлайн-режимом и эскалацией — от 2 до 4 месяцев. Стоимость рассчитывается индивидуально после анализа ваших источников данных. Типичная экономия от внедрения составляет миллионы рублей в год за счёт снижения простоев и затрат на внеплановые остановки. Закажите бесплатную консультацию инженера по мобильной разработке.







