Ми розробляємо мобільні додатки для автомобільної телематики, які перетворюють розрізнені дані з трекерів у керовану картину автопарку. 8 років досвіду — це десятки інтеграцій з Teltonika, Concox та Queclink, кожна з яких вимагала глибокого розуміння бінарних протоколів та real-time архітектури. Мобільний додаток стає єдиним вікном для диспетчера: карта з живими маркерами, алерти, звіти та аналітика — все в одному інтерфейсі.
Ми використовуємо open-source платформу Traccar як основу серверної частини. Це дає готову підтримку 200+ протоколів трекерів, REST API та WebSocket для real-time. Замість того, щоб писати інтеграцію з нуля, ми зосереджуємося на бізнес-логіці та користувацькому досвіді. Кожен новий трекер додається за 1-2 години, що значно прискорює розробку порівняно з написанням інтеграції з нуля.
Структура телематичного блоку управління
ТБУ (або AVL-трекер) — OBD-II або CAN-пристрій з GSM/LTE модемом, GPS-модулем та внутрішньою пам'яттю для буферизації. Популярні серії: Teltonika FMB (FMB920, FMB003, FMB125), Concox GT06N, Queclink GV500. Дані передаються на сервер по TCP у пропрієтарному бінарному протоколі. Teltonika Codec 8/8E — найпоширеніший. Структура AVL-запису:
Повна структура AVL-запису Codec8
| Поле | Розмір (байт) | Опис |
|---|---|---|
| Timestamp | 8 | Unix ms |
| Priority | 1 | 0–3 |
| Longitude | 4 | int32 × 0.0000001 |
| Latitude | 4 | int32 × 0.0000001 |
| Altitude | 2 | int16 (метри) |
| Angle | 2 | uint16 (градуси) |
| Satellites | 1 | uint8 |
| Speed | 2 | uint16 (км/год × 10) |
| IO count | 1 | кількість IO елементів |
| IO elements | N | пари ID-Value |
Парсинг на сервері (Go):
type AVLRecord struct {
Timestamp time.Time
Longitude float64
Latitude float64
Altitude int16
Angle uint16
Satellites uint8
Speed uint16
IOElements map[uint16]int64
}
func parseAVLRecord(r *bufio.Reader) (AVLRecord, error) {
var rec AVLRecord
var tsMs uint64
binary.Read(r, binary.BigEndian, &tsMs)
rec.Timestamp = time.UnixMilli(int64(tsMs))
var priority uint8
binary.Read(r, binary.BigEndian, &priority)
// GPS Element: lon(4), lat(4), alt(2), angle(2), sat(1), speed(2)
var lonRaw, latRaw int32
binary.Read(r, binary.BigEndian, &lonRaw)
binary.Read(r, binary.BigEndian, &latRaw)
rec.Longitude = float64(lonRaw) / 10_000_000.0
rec.Latitude = float64(latRaw) / 10_000_000.0
// ... решта полів
return rec, nil
}
Чому Traccar — оптимальний вибір для серверної частини?
Traccar — open-source платформа, яка знає 200+ протоколів трекерів і надає REST API та WebSocket. Вона розгортається за 2-3 дні, що в 30-60 разів швидше, ніж розробка власної серверної платформи (3-4 місяці).
Згідно з офіційною документацією, Traccar підтримує 200+ протоколів. GitHub: Traccar
| Параметр | Traccar | Самописна платформа |
|---|---|---|
| Час запуску | 2-3 дні | 3-4 місяці |
| Підтримка протоколів | 200+ (вбудована) | Потрібно писати кожну інтеграцію |
| Real-time | WebSocket з коробки | Розробляти з нуля |
| Масштабування | До 10 000 пристроїв | Обмежене |
Traccar REST API для мобільного клієнта:
interface TraccarApi {
@GET("devices")
suspend fun getDevices(@Query("groupId") groupId: Long? = null): List<Device>
@GET("positions")
suspend fun getLatestPositions(
@Query("deviceId") deviceId: Long? = null
): List<Position>
@GET("reports/trips")
suspend fun getTrips(
@Query("deviceId") deviceId: Long,
@Query("from") from: String,
@Query("to") to: String,
): List<Trip>
@GET("reports/events")
suspend fun getEvents(
@Query("deviceId") deviceId: Long,
@Query("from") from: String,
@Query("to") to: String,
@Query("type") types: List<String>,
): List<Event>
}
Real-time позиції — WebSocket Traccar (wss://server/api/socket):
class TraccarLiveSession(private val baseUrl: String, private val sessionCookie: String) {
fun observe(): Flow<TraccarMessage> = callbackFlow {
val client = OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS)
.build()
val ws = client.newWebSocket(
Request.Builder()
.url("wss://$baseUrl/api/socket")
.header("Cookie", "JSESSIONID=$sessionCookie")
.build(),
object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
trySend(Json.decodeFromString(text))
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
close(t)
}
}
)
awaitClose { ws.close(1000, null) }
}
}
Як забезпечити плавну анімацію маркерів на карті?
Google Maps SDK — стандарт для Android, MapKit для iOS, Mapbox або Yandex MapKit для російського ринку. Маркери рухаються плавно між позиціями з інтерполяцією:
private fun updateVehicleMarker(position: Position) {
val latLng = LatLng(position.latitude, position.longitude)
val existing = vehicleMarkers[position.deviceId]
if (existing == null) {
vehicleMarkers[position.deviceId] = map.addMarker(
MarkerOptions()
.position(latLng)
.icon(getVehicleIcon(position.attributes["ignition"] as? Boolean ?: false))
.rotation(position.course.toFloat())
.flat(true)
)!!
} else {
ValueAnimator.ofFloat(0f, 1f).apply {
duration = 1000
interpolator = LinearInterpolator()
val from = existing.position
addUpdateListener { anim ->
val f = anim.animatedFraction
existing.position = LatLng(
from.latitude + (latLng.latitude - from.latitude) * f,
from.longitude + (latLng.longitude - from.longitude) * f
)
existing.rotation = position.course.toFloat()
}
}.start()
}
}
Кластеризація для автопарків з > 50 машин — обов'язкова: ClusterManager з Maps SDK Utilities без неї карта гальмує при сотнях маркерів.
Історія поїздок та геозони
Трек поїздки — Polyline за списком GPS-точок. Колір лінії по швидкості дає миттєве візуальне розуміння манери їзди:
fun drawSpeedColoredRoute(points: List<Position>) {
points.zipWithNext().forEach { (from, to) ->
val color = when {
to.speed > speedLimitKph -> Color.RED
to.speed > speedLimitKph * 0.8 -> Color.YELLOW
else -> Color.GREEN
}
map.addPolyline(
PolylineOptions()
.add(LatLng(from.latitude, from.longitude))
.add(LatLng(to.latitude, to.longitude))
.color(color)
.width(4f)
)
}
}
Геозони — полігони на карті, при перетині сервер генерує події. Створення геозони з додатку: малюємо полігон тапами, відправляємо координати в Traccar Geofences API. Прив'язка пристрою через notificationTypes.
CAN-дані та розширена телематика
Через OBD-II порт або CAN-шину отримуємо: рівень пального, пробіг з ECU, оберти, навантаження, коди DTC, температуру. Дані приходять в IOElements AVL-запису по IO ID. Для Teltonika: ID 12 = ignition, ID 67 = CAN speed, ID 82 = CAN fuel level. На сервері зберігається мапінг, клієнт отримує вже іменовані поля.
Сповіщення та алерти
Алерти налаштовуються на сервері та доставляються через FCM або APNS. Типові алерти автопарку:
- перевищення швидкості > X км/год
- виїзд з геозони в неробочий час
- тривала стоянка з увімкненим двигуном (витрата на холостому ходу)
- розряд акумулятора (< 11.8 В)
- різке гальмування / прискорення
- втрата зв'язку з пристроєм > 5 хвилин
На клієнті — стрічка алертів з фільтрацією, перехід до карти в момент події.
Етапи розробки додатку для телематики
- Аудит парку трекерів — визначаємо підтримувані протоколи, частоту відправки даних, параметри IO.
- Налаштування сервера Traccar — встановлення, конфігурація протоколів, налаштування алертів та звітів.
- Розробка мобільного клієнта — UI для карти, звітів, алертів, налаштувань геозон. Реалізація WebSocket-з'єднання.
- Інтеграція з CAN-даними — якщо потрібна розширена телематика, підключаємо OBD-II або CAN-шину.
- Тестування на реальних пристроях — перевірка стабільності при різних навантаженнях.
- Деплой в App Store та Google Play — підготовка метаданих, проходження рев'ю.
Кожен етап завершується демонстрацією замовнику. Після запуску надаємо місяць підтримки.
Що входить у роботу (deliverables)
- Документація: технічне завдання, API-документація, інструкція з експлуатації.
- Доступи: до репозиторію коду, сервера та інструментів моніторингу.
- Навчання: онлайн-сесія для диспетчерів та адміністраторів.
- Підтримка: 1 місяць безкоштовної технічної підтримки після запуску.
- Гарантія: 6 місяців на виправлення помилок, виявлених після здачі.
Терміни та оцінка
Базовий додаток на Traccar: 8–12 тижнів. Кастомна платформа з CAN-даними та білим міткою: 4–6 місяців. Вартість розраховується індивідуально — від $5000 для MVP. Зв'яжіться з нами для оцінки вашого проєкту. Отримайте консультацію інженера з вибору трекерів та архітектури. Економія пального до 30% при впровадженні системи контролю витрати. Працюємо з гарантією якості та сертифікованими трекерами. Пишіть на пошту або заповніть форму — оцінимо проєкт за 1 день.







