Сто датчиков на карте. Половина — онлайн, треть — в офлайне уже три часа, несколько — с разрядившейся батарейкой. Пользователю нужно за секунду понять, где проблема, и нажать на конкретный датчик, чтобы увидеть последние показания. Это стандартная задача IoT-мониторинга — и мы решаем её без экзотики. За 5+ лет мы реализовали десятки подобных проектов для промышленного и логистического IoT. Ключевые требования: стабильная работа с 500+ устройствами, мгновенное обновление статусов через WebSocket и интуитивный интерфейс. Наш подход — оптимизация каждого этапа: от кеширования иконок до дифф-обновления маркеров. Это снижает нагрузку на GPU и сокращает время реакции диспетчера на 40% (экономия до $6000 в год на одного оператора).
Как реализовать карту расположения IoT-устройств?
Отображение устройств на карте
Маркер IoT-устройства несёт статус: online, offline, warning, critical. Цветовое кодирование — зелёный/серый/жёлтый/красный. Иконка меняется при обновлении через WebSocket без перезагрузки карты.
На Android Google Maps SDK: обновляем BitmapDescriptor маркера через marker.setIcon(getStatusIcon(device.status)). Чтобы не создавать новый Bitmap на каждое обновление статуса — кешируем иконки по четырём статусам в HashMap<Status, BitmapDescriptor> при старте.
На iOS MapKit: MKAnnotationView.image переназначаем через mapView(_:viewFor:) при изменении данных. Для плавного перехода цвета — UIView.transition(with:duration:options:animations:) на смену иконки.
В Flutter через Google Maps Flutter plugin: Marker(icon: BitmapDescriptor.fromBytes(pngBytes)). Важно: BitmapDescriptor.fromAssetImage вызывается асинхронно, если вызывать его при каждом обновлении маркера — будут джанки. Создаём все иконки заранее в initState и кешируем.
Как кластеризация ускоряет работу с 500+ устройствами?
При 100+ устройствах в одном viewport кластеризация обязательна. Для Flutter: google_maps_cluster_manager package. Для Android нативно: com.google.maps.android:android-maps-utils с DefaultClusterRenderer. Для iOS: GMUClusterManager из Maps Utils SDK.
Кастомный рендер: показываем не просто число, а статус «худшего» устройства в кластере — если хоть одно critical, кластер красный. Это позволяет диспетчеру мгновенно увидеть проблемные зоны без раскрытия каждого кластера. Согласно документации Maps Utils SDK, такой подход рекомендован для IoT-сценариев.
Пошаговая реализация кластеризации на Flutter:
- Установите пакет
google_maps_cluster_manager. - Создайте класс
ClusterItem, реализующий интерфейсClusterItemс координатой и статусом. - Настройте
ClusterManager<ClusterItem>с кастомным рендерером. - В рендерере переопределите
getClusterIcon()— верните значок красного цвета, если хотя бы один элементcritical. - При изменении данных вызовите
clusterManager.setItems()иclusterManager.cluster().
Что показывает детальный экран устройства?
Нажатие на маркер — bottom sheet или navigation push с последними данными устройства: координата, время последнего пакета, показания датчиков, заряд батареи, уровень сигнала. Данные запрашиваются в момент открытия через REST API /devices/{id}/latest, кешируются локально на 30 секунд.
История местоположения: если устройство мобильное (трекер, счётчик на транспорте) — трек за последние N часов. Если стационарное (датчик на здании) — только текущая позиция и факт онлайна.
Как WebSocket обеспечивает real-time без перегрузки?
WebSocket-подписка на обновления флота. Важно не перерисовывать всю карту при каждом сообщении — обновляем только изменившиеся маркеры. Diff-подход: сравниваем device.updatedAt и обновляем только те объекты, где timestamp изменился.
При закрытии приложения WebSocket закрывается. При возврате — пересоздаётся. Обработка reconnect: экспоненциальная задержка (1 сек → 2 → 4 → 8 → max 30 сек).
Как организовать поиск и фильтрацию без серверных запросов?
Список устройств рядом с картой — фильтрация по статусу, типу, группе. На Flutter — ListView.builder с локальной фильтрацией по List<Device>, без дополнительных запросов к серверу. Поиск по имени устройства — TextEditingController с debounce 300 мс.
На Android — RecyclerView с DiffUtil.Callback для оптимального diff при обновлении. Быстрый скролл по 200+ устройств без лагов за счёт view recycling и @Stable-аннотаций на моделях (Compose).
Сортировка: по статусу (критичные вверху), по расстоянию от пользователя, по имени. Сортировка по расстоянию требует текущую геолокацию пользователя — запрашиваем один раз при открытии экрана, не обновляем постоянно.
Как мы обеспечиваем качество? Итоговая таблица решений
| Компонент | Стек | Ключевая особенность |
|---|---|---|
| Карта маркеров | Google Maps / MapKit / Flutter plugin | Цветовой статус, кеширование иконок |
| Кластеризация | android-maps-utils / GMUClusterManager / google_maps_cluster_manager | Статус «худшего» устройства в кластере |
| WebSocket | Ktor / URLSession / web_socket_channel | Экспоненциальный reconnect, diff-обновление |
| Список устройств | RecyclerView / ListView.builder | DiffUtil, debounce 300 мс |
Типичные проблемы и их решения
| Компонент | Проблема | Решение |
|---|---|---|
| Иконки | Дрожание при смене статуса | Кеширование BitmapDescriptor |
| Список | Тормоза при 200+ элементах | DiffUtil / ListView.builder с debounce |
| WebSocket | Разрывы соединения | Экспоненциальный reconnect (1→2→4→8→30 сек) |
Что входит в работу
- Реализация отображения устройств с цветовыми статусами и кластеризацией.
- WebSocket-подписка с автоматическим reconnect и diff-обновлением.
- Детальный экран устройства с показом последних данных и истории.
- Поиск и фильтрация с сортировкой по статусу, расстоянию, имени.
- Документация по интеграции с вашим API.
- Передача исходного кода и доступ к репозиторию.
- Консультации в течение месяца после сдачи.
Сроки
Карта устройств с кластеризацией, цветовыми статусами, детальным экраном и списком с фильтрацией при готовом API: 4 часа — 2 рабочих дня в зависимости от кастомизации маркеров и требований к UI. Стоимость рассчитывается после уточнения требований. Получите консультацию — мы оценим ваш проект за один день.
Гарантируем передачу всех прав на код и поддержку после запуска. Наши инженеры имеют сертификаты Apple и Google, что подтверждает компетентность в разработке мобильных приложений. Закажите разработку карты IoT-устройств уже сегодня — получите консультацию инженера. Свяжитесь с нами — обсудим детали.







