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

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація телематики транспорту в мобільному IoT-додатку
Складний
~1-2 тижні
Часті запитання

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

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

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

Транспортна телематика — це збір даних з рухомих об'єктів: координати GPS, швидкість, пробіг, поведінка водія (різкі прискорення, гальмування), витрата палива, температурний режим кузова для рефрижераторів. Дані ідуть з бортового трекера через GPRS/LTE на сервер; мобільний додаток — інструмент диспетчера або менеджера автопарку. Розробка ділиться на три шари: протокол трекера, серверна платформа, мобільний клієнт.

Протоколи GPS-трекерів

Трекери спілкуються на кількох поширених протоколах:

Протокол Трекери Транспорт
Teltonika codec 8/8E Teltonika FMB920, FMC003 TCP
Concox протокол Concox GT06, JT701 TCP
GT06N (Gotop) 90% дешевих китайських трекерів TCP
NMEA 0183 Більшість GPS-модулів RS-232/TCP
MQTT JSON Сучасні IoT-трекери MQTT/TLS

Для парсингу трекерних протоколів використовуйте Traccar — open-source серверна платформа, яка знає 200+ протоколів. Traccar розгортається на сервері, приймає дані від трекерів та надає REST API + WebSocket для мобільних клієнтів. Це найрозумніший шлях для старту.

Traccar API: інтеграція на Android

// Retrofit інтерфейс до Traccar API
interface TraccarApi {
    @GET("devices")
    suspend fun getDevices(
        @Query("all") all: Boolean = false,
        @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,  // ISO 8601
        @Query("to") to: String,
    ): List<Trip>
}

data class Position(
    val id: Long,
    val deviceId: Long,
    val latitude: Double,
    val longitude: Double,
    val speed: Double,     // вузли, конвертуємо у км/ч * 1.852
    val course: Double,
    val altitude: Double,
    val accuracy: Double,
    val fixTime: String,
    val valid: Boolean,
    val attributes: Map<String, Any>,  // батарея, запалювання, пробіг та ін.
)

Оновлення в реальному часі через Traccar WebSocket:

class TraccarWebSocketClient(private val baseUrl: String, private val token: String) {
    private val okHttpClient = OkHttpClient.Builder()
        .readTimeout(0, TimeUnit.MILLISECONDS)  // нескінченний timeout для WS
        .build()

    fun connect(): Flow<TraccarEvent> = callbackFlow {
        val request = Request.Builder()
            .url("wss://${baseUrl}/api/socket")
            .header("Cookie", "JSESSIONID=$token")
            .build()

        val ws = okHttpClient.newWebSocket(request, object : WebSocketListener() {
            override fun onMessage(webSocket: WebSocket, text: String) {
                val event = json.decodeFromString<TraccarSocketMessage>(text)
                event.positions?.forEach { trySend(TraccarEvent.Position(it)) }
                event.devices?.forEach { trySend(TraccarEvent.DeviceUpdate(it)) }
                event.events?.forEach { trySend(TraccarEvent.Alert(it)) }
            }

            override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
                close(t)
            }
        })
        awaitClose { ws.close(1000, "Closed") }
    }
}

Карта з живими мітками

Google Maps SDK на Android з кастомними маркерами-автомобілями:

class FleetMapFragment : Fragment() {
    private lateinit var map: GoogleMap
    private val vehicleMarkers = HashMap<Long, Marker>()

    private fun updateVehiclePosition(position: Position) {
        val latLng = LatLng(position.latitude, position.longitude)
        val marker = vehicleMarkers[position.deviceId]

        if (marker == null) {
            val newMarker = map.addMarker(
                MarkerOptions()
                    .position(latLng)
                    .icon(getBitmapDescriptor(R.drawable.ic_truck, position.course))
                    .title(getVehicleName(position.deviceId))
            )
            vehicleMarkers[position.deviceId] = newMarker!!
        } else {
            // Анімуємо переміщення маркера
            animateMarker(marker, latLng, position.course)
        }
    }

    private fun animateMarker(marker: Marker, to: LatLng, bearing: Float) {
        val animator = ValueAnimator.ofFloat(0f, 1f).apply {
            duration = 1000
            interpolator = LinearInterpolator()
        }
        val from = marker.position
        animator.addUpdateListener { anim ->
            val fraction = anim.animatedValue as Float
            marker.position = LatLng(
                from.latitude + (to.latitude - from.latitude) * fraction,
                from.longitude + (to.longitude - from.longitude) * fraction,
            )
            marker.rotation = bearing
        }
        animator.start()
    }
}

Анімація маркера між позиціями — деталь, яку часто пропускають. Без неї іконка прилітає по карті.

Аналітика поведінки водія

Різкі прискорення (> 0,3g), гальмування (> 0,4g), різкі повороти — события з акселерометра трекера, приходять в attributes позиції. Scoring водія лічиться на backend, у додаток віддається агрегат за день/тиждень: відсоток часу з перевищенням швидкості, кількість жорстких событій, рейтинг 0-100.

Геозони — зони на карті, при въїзді/виїзді з яких формується подія. Додавання геозони з мобільного додатка: рисуємо полігон на карті, відправляємо координати в Traccar Geofences API.

Офлайн та кеш

Диспетчер дивиться у додаток постійно, та якщо сервер недоступен 5 хвилин — неможна показати пусту карту. Кешуємо останні позиції всіх машин у Room. При старті показуємо кеш, оновляємо через WebSocket. Timestamp останнього оновлення видно в заголовку.

Розробка диспетчерського додатка з картою, real-time позиціями через Traccar та звітами по поїздках: 5-8 тижнів. Повнофункціональна телематична платформа з аналітикою водіїв, геозонами та інтеграцією CAN-даних: 3-4 місяці. Вартість розраховується індивідуально після аналізу парку пристроїв та вимог до платформи.