אנו מפתחים אפליקציות מובייל לטלמטיקה רכבית שהופכות נתוני מעקב מפוזרים לתצוגת צי רכב ניתנת לפעולה. אפליקציית המובייל שלנו לטלמטיקה מאפשרת פיתוח Connected Car על ידי אינטגרציה עם יחידות בקרה טלמטריות ומערכות ניהול צי באמצעות Google Maps SDK ואינטגרציית Traccar. עם 8 שנות ניסיון ועשרות אינטגרציות עם Teltonika, Concox ו-Queclink, כל אחת דורשת הבנה עמוקה של פרוטוקולים בינאריים וארכיטקטורת זמן אמת, אנו מספקים חלון אחד עבור המוקדן: סמני מפה חיים, התראות, דוחות ואנליטיקה — הכל בממשק אחד.
אנו משתמשים בפלטפורמת הקוד הפתוח Traccar כעמוד השדרה של השרת. היא מספקת תמיכה מובנית ל-200+ פרוטוקולי מעקב, REST API ו-WebSocket לנתונים בזמן אמת. במקום לכתוב אינטגרציה מאפס, אנו מתמקדים בלוגיקה עסקית ובחוויית משתמש. כל מעקב חדש ניתן להוספה תוך 1–2 שעות, מה שמפחית את מאמץ האינטגרציה המותאמת אישית.
מבנה יחידת בקרה טלמטרית
TCU (או מעקב AVL) הוא מכשיר OBD-II או CAN עם מודם GSM/LTE, מודול GPS וזיכרון חיץ פנימי. סדרות פופולריות: Teltonika FMB (FMB920, FMB003, FMB125), Concox GT06N, Queclink GV500. נתונים נשלחים לשרת דרך TCP באמצעות פרוטוקולים בינאריים קנייניים. Teltonika Codec 8/8E הוא הנפוץ ביותר. מבנה רשומת AVL:
מבנה מלא של רשומת AVL (Codec8)
| שדה | גודל (בייטים) | תיאור |
|---|---|---|
| חותמת זמן | 8 | Unix ms |
| עדיפות | 1 | 0–3 |
| קו אורך | 4 | int32 × 0.0000001 |
| קו רוחב | 4 | int32 × 0.0000001 |
| גובה | 2 | int16 (מטרים) |
| זווית | 2 | uint16 (מעלות) |
| לוויינים | 1 | uint8 |
| מהירות | 2 | uint16 (קמ"ש × 10) |
| מספר IO | 1 | מספר רכיבי IO |
| רכיבי IO | N | זוגות ID-ערך |
ניתוח בשרת (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 היא פלטפורמת קוד פתוח שמכירה 200+ פרוטוקולי מעקב ומספקת REST API ו-WebSocket. ניתן לפרוס אותה תוך 2–3 ימים, מהיר פי 30–60 מפיתוח פלטפורמת שרת מותאמת אישית (3–4 חודשים).
לפי התיעוד הרשמי, Traccar תומכת ב-200+ פרוטוקולים. GitHub: Traccar
| פרמטר | Traccar | פלטפורמה מותאמת אישית |
|---|---|---|
| זמן עד השקה | 2–3 ימים | 3–4 חודשים |
| תמיכה בפרוטוקולים | 200+ (מובנה) | יש לכתוב כל אינטגרציה |
| זמן אמת | 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>
}מיקומים בזמן אמת — Traccar WebSocket (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 } ):
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 הוא הסטנדרט לאנדרואיד, 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. קשר את המכשיר דרך 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> } .
נתוני CAN וטלמטיקה מתקדמת
דרך יציאת OBD-II או אוטובוס CAN אנו מקבלים: רמת דלק, קילומטראז' מ-ECU, סל"ד, עומס, קודי DTC, טמפרטורה. נתונים מגיעים ב-IO Elements של רשומת AVL לפי מזהה IO. עבור Teltonika: ID 12 = הצתה, ID 67 = מהירות CAN, ID 82 = רמת דלק CAN. בשרת נשמר מיפוי; הלקוח מקבל שדות בעלי שם כבר.
התראות ואזעקות
התראות מוגדרות בשרת ונשלחות דרך FCM או APNS. התראות צי אופייניות:
- חריגת מהירות X קמ"ש
- יציאה מגיאופנס בשעות לא פעילות
- סרק ממושך עם מנוע פועל (בזבוז דלק)
- סוללה חלשה (< 11.8 V)
- בלימה / האצה חדה
- אובדן תקשורת עם המכשיר למשך > 5 דקות
בצד הלקוח: עדכון התראות עם סינון, ניווט למפה בזמן האירוע.
שלבי פיתוח לאפליקציית טלמטיקה
- ביקורת צי מעקב — קביעת פרוטוקולים נתמכים, תדירות שליחת נתונים, פרמטרי IO.
- הגדרת שרת Traccar — התקנה, הגדרת פרוטוקולים, הגדרת התראות ודוחות.
- פיתוח לקוח מובייל — ממשק למפה, דוחות, התראות, הגדרות גיאופנס. יישום חיבור WebSocket.
- אינטגרציה עם נתוני CAN — אם נדרשת טלמטיקה מתקדמת, חיבור OBD-II או אוטובוס CAN.
- בדיקות על מכשירים אמיתיים — אימות יציבות בעומסים שונים.
- העלאה ל-App Store ו-Google Play — הכנת מטא-דאטה, מעבר ביקורת.
כל שלב מסתיים בהדגמה ללקוח. לאחר ההשקה, אנו מספקים חודש תמיכה.
לוחות זמנים והערכת עלויות
אפליקציה בסיסית על Traccar: 8–12 שבועות. פלטפורמה מותאמת אישית עם נתוני CAN ו-white label: 4–6 חודשים. ההשקעה האופיינית נעה בין $15,000 ל-$45,000, ולקוחות מחזירים את ההשקעה בתוך השנה הראשונה באמצעות הפחתת זמן השבתה וחיסכון בדלק של 10-15%. אנו מבטיחים אינטגרציות מוסמכות ומפחיתים סיכון פיתוח באמצעות ניסיון מוכח.
מה כלול בעבודה
כשאתם משתפים איתנו פעולה, אתם מקבלים: קוד מקור מלא (iOS & Android), תיעוד API, מדריכי פריסה לשרת Traccar, גישה לסביבת הדגמה, חודש תמיכה לאחר ההשקה והדרכה למוקדנים שלכם. כל התוצרים נבדקים ביסודיות ומגיעים עם אחריות של 30 יום כנגד ליקויים.







