Real-Time Tracker App : How does it work ?

Jadi, beberapa bulan ini saya dan team sedang mengembangkan sebuah aplikasi untuk tracking kendaraan. Cara kerjanya mungkin hampir mirip seperti salah satu fitur di aplikasi-aplikasi Taksi/Ojek online. Yep, real-time tracking. Jadi user bisa secara real-time melihat sedang dimana driver mereka berada pada map dalam aplikasi.

Aplikasi tersebut memvisualisasikan lokasi dimana kendaraan yang kita pasangi GPS-Tracker tersebut berada. Pada tahap develop ini kita coba pasang di beberapa angkot di bandung. GPS-Tracker sendiri dibuat menggunakan Arduino dan GPS yang terkoneksi dengan sebuah modem. Untuk power-source nya mengambil dari accu pada angkot yang dipasangi GPS-Tracker tersebut. Sedangkan pada sisi end-user atau client menggunakan Android dengan OSMDroid sebagai librari petanya.

Secara garis besar, untuk sistem transmit, receive dan olah datanya saya gambarkan seperti berikut :

  • Anak panah menunjukan proses pengiriman dan penerimaan data.

Oke, mari kita bahas satu persatu.

GPS-Tracker

Seperti yang saya sebut diatas, device GPS-Tracker ini dibuat menggunakan Arduino yang terhubung dengan internet via modem. Kemudian di bundle dan dipasangkan pada angkot. Seperti yang terlihat di bagan, GPS-Tracker berperan sebagai Publisher dengan protocol MQTT dan mengirimkan data setiap n detik ke MQ Server . Data yang dikirim berupa geolocation; latitude dan longitude, Speed/kecepatan, tanggal dan jam. Untuk interval pengirimannya masih variatif, ada yang satu menit sekali, ada juga yang 30 detik sekali. Masih dalam tahap testing untuk diketahui pengaruhnya terhadap durabilitas. Tipe Antrian nya menggunakan metode topic, supaya lebih fleksibel dan untuk case seperti ini memang paling cocok menggunakan topic.

Rabbit MQ

Rabbit MQ berfungsi sebagai manajemen antrian, selengkapnya tentang RabbitMQ bisa Anda lihat di https://www.rabbitmq.com/. Bisa dibilang RabbitMQ ini adalah inti dari alur data, kemana dan akan dikemanakan data yang diterima oleh RabbitMQ tersebut. Jika kita lihat, RabbitMQ ini adalah stack paling depan dengan device sebelum ke end-user.

Subscriber

Subscriber ini berupa service atau daemon yang saya bangun diatas NodeJS. Subscriber ini berfungsi untuk meneruskan data yang dikirim GPS-Tracker ke stack selanjutnya. Subscriber ini subscribe ke exchange dan routing key dimana GPS-Tracker mengirimkan datanya, kemudian meneruskannya ke REST-API untuk diolah datanya. Subscriber ini bisa kita extend menjadi workers dengan menginstance lebih banyak subscriber.

REST-API

Rest-API ini juga dibangun diatas NodeJS. Sebenarnya kita bisa saja melakukan olah data pada Subscriber, namun kali ini saya harus menggunakan resource existing, sehingga mau tidak mau saya pakai. Untungnya antara subscriber dan rest-api masih dalam satu server, sehingga kita bisa handle untuk masalah koneksi. Namun tidak menutup kemungkinan kedepannya proses olah datanya diselesaikan langsung di subscriber tanpa lewat rest-api tergantung bagaimana nanti hasil testing. Rest-api berfungsi sebagai middleware ke database.

MongoDB

Yep, Mongo DB, tentu saja berfungsi sebagai medium penyimpanan data. Mongo DB dipakai karena alasan kecepatan dan karena struktur-nya yang noSQL memang dirasa cocok dengan struktur data yang dikirimkan GPS-Tracker.

Publisher

Sama seperti subscriber, publisher ini berupa service yang dibuat diatas NodeJS dan satu mesin dengan rest-api. Publisher ini mem-broadcast data setiap n detik, pada tahap ini data dikirim selama 3 detik sekali ke RabbitMQ. Memakai exchange type dengan tipe fanout, sehingga bisa banyak subscriber yang subscribe pada exchange ini. Data yang dikirim diambil dari Mongo DB via rest-api.

Android

Pada sisi end-user berfungsi menampilkan lokasi setiap kendaraan yang dipasang GPS-Tracker. Untuk librari petanya menggunakan OSMDroid pada OSMBonuspack. Cara kerjanya sederhana, pertama semua lokasi ditampilkan pada peta berupa marker. Kemudian marker tersebut lokasinya di-update setiap kali data yang baru datang, kurang lebih seperti berikut :

markers[i].setPosition(new GeoPoint(trackers[i].getData().get(0), trackers[i].getData().get(1)));

Jangan di map.clear(), karena semua overlay akan terhapus dan akan instance marker baru ketika data yang baru ditambahkan sebagai marker. Ada beberapa alasan kenapa kita butuh object marker : untuk bearing atau menentukan arah marker 360 derajat terhadap map dan juga untuk moving animation Sebagai visual bahwa objek bergerak .

markerAnimation.animate(mapset, markers[i],
new GeoPoint(trackers[i].getData().get(0), trackers[i].getData().get(1)),1500);

Karena kedua itu membutuhkan geopoint lama dan geopoint baru, kemudian untuk moving animation nya memang membutuhkan marker yang existing. Android ini subscribe ke fanout dimana data di broadcast selama 3 detik sekali. Sehingga Android cukup listen ke antrian tersebut untuk mendapatkan data secara real-time. Bayangkan jika proses ini dihandle oleh rest-api, kita butuh timer-task atau thread yang melakukan request ke endpoint rest-api selama n detik sekali.

Berikut beberapa screenshot aplikasinya :