Представьте: производственная линия, 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 месяцев. Стоимость рассчитывается индивидуально после анализа ваших источников данных. Типичная экономия от внедрения составляет миллионы рублей в год за счёт снижения простоев и затрат на внеплановые остановки. Закажите бесплатную консультацию инженера по мобильной разработке.







