Реализация карты расположения IoT-устройств в мобильном приложении

Сто датчиков на карте. Половина — онлайн, треть — в офлайне уже три часа, несколько — с разрядившейся батарейкой. Пользователю нужно за секунду понять, где проблема, и нажать на конкретный датчик, чтобы увидеть последние показания. Это стандартная задача IoT-мониторинга — и мы решаем её без экзотики

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация карты расположения IoT-устройств в мобильном приложении
Простой
от 4 часов до 2 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    897
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1218
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    600

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

  1. Установите пакет google_maps_cluster_manager.
  2. Создайте класс ClusterItem, реализующий интерфейс ClusterItem с координатой и статусом.
  3. Настройте ClusterManager<ClusterItem> с кастомным рендерером.
  4. В рендерере переопределите getClusterIcon() — верните значок красного цвета, если хотя бы один элемент critical.
  5. При изменении данных вызовите 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-устройств уже сегодня — получите консультацию инженера. Свяжитесь с нами — обсудим детали.