Разработка мобильного приложения для мониторинга транспорта
Диспетчер смотрит на карту — 40 грузовиков, и три из них не обновляли позицию уже 20 минут. Зависла ли трансляция? Нет сети в горах? Или GPS-антенна отключена намеренно? Это три разных сценария с разной реакцией, и приложение должно их различать — а не просто красить точку в серый цвет.
Что на самом деле нужно диспетчеру
Приложение мониторинга — не просто «маркеры на карте». Диспетчер работает с парком 20–200 единиц и ему нужны:
- Реальное время с метаданными: координата + скорость + направление + статус двигателя + заряд батареи трекера
- История трека: маршрут за день/неделю с геокодированными адресами остановок
- Геозонирование: уведомление при въезде/выезде из зоны склада, стройплощадки, запрещённой территории
- Алерты: превышение скорости, долгая стоянка с заведённым двигателем, отклонение от маршрута
Всё это требует разной архитектуры на клиенте.
Приём данных телематики в реальном времени
Телематические блоки (Teltonika FMB, Wialon TK, Navixy OEM) передают данные через TCP или GPRS на сервер. Мобильное приложение не соединяется с трекерами напрямую — оно получает уже обработанный поток через WebSocket или MQTT-клиент.
На Android используем OkHttp WebSocket с EventBus или SharedFlow для доставки обновлений в ViewModel. На iOS — URLSessionWebSocketTask (iOS 13+) или Starscream для более старых target'ов. Обновления приходят как JSON или protobuf — protobuf предпочтительнее при большом флоте: пакет 40 машин × 10 полей в protobuf занимает ~1.5 КБ против ~8 КБ в JSON.
Карта: производительность с большим флотом
200 маркеров на карте с анимацией движения — это уже напряжённо. Ключевые решения:
Аннотации вместо SVG-оверлеев. На iOS MKAnnotationView обрабатывает до ~300 маркеров без заметного лага. Свыше — используем MKOverlay с кастомным рендерером, который рисует все точки в одном CALayer. На Android Google Maps SDK с MarkerOptions деградирует после ~500 маркеров — переходим на Mapbox Maps SDK v10 с SymbolLayer на основе GeoJSON source: весь флот обновляется одним вызовом source.setGeoJson(featureCollection).
Clustering на сервере. При зуме < 11 кластеры считаются на сервере (PostGIS ST_ClusterKMeans), клиент получает готовые центроиды с счётчиком. Локальная кластеризация (Supercluster) подходит для флотов до 300–400 единиц.
Анимация движения. Позиция трекера обновляется раз в 10–30 секунд — маркер не должен «прыгать». ValueAnimator с LatLngInterpolator (Android) или CABasicAnimation с CGPoint interpolation (iOS) — маркер плавно «скользит» к новой точке.
История трека и геокодирование
Трек за день — это 2000–8000 точек в зависимости от интервала записи. Отображаем через Polyline / MKPolyline, но не весь трек сразу: загружаем bbox видимой области карты и запрашиваем точки только для неё. При зуме «весь день» — дискретизируем трек алгоритмом Douglas-Peucker на сервере.
Адреса остановок — reverse geocoding через Google Maps Geocoding API или OpenStreetMap Nominatim (self-hosted). Кешируем результаты в SQLite, чтобы не повторять запросы при скролле истории.
Алерты и уведомления
Превышение скорости, геозонные события, долгая стоянка — триггеры вычисляются на сервере, push-уведомление приходит через FCM/APNs. На iOS используем UNNotificationCategory с UNNotificationAction — прямо из уведомления можно открыть карту с конкретным транспортным средством.
Геозоны — полигоны GeoJSON, проверка ST_Contains в PostgreSQL + PostGIS при каждом входящем сообщении от трекера. Мобильный клиент только отображает геозоны и получает алерты — не вычисляет пересечения локально.
Этапы и сроки
Мобильное приложение для мониторинга транспорта разрабатывается параллельно с сервером обработки телематики или как надстройка над существующей платформой (Wialon, Gurtam, Navixy — все предоставляют SDK/API).
- Аудит телематической платформы и API
- Дизайн интерфейса диспетчера: карта, список транспорта, история, алерты
- Разработка: карта → реальное время → история → геозоны → уведомления
- Нагрузочное тестирование (имитируем 200+ трекеров с частотой обновления 30 сек)
- Публикация
MVP (карта + реальное время + история): 6–10 недель. Полная платформа с геозонами, алертами, аналитикой пробега и отчётами: 3–5 месяцев. Стоимость рассчитывается после аудита существующей инфраструктуры.







