GNSS Teknologi RTK dapat digunakan dalam berbagai aplikasi. Biasanya, Anda akan melakukan beberapa pengukuran, lalu mengekspornya ke komputer untuk menganalisis data. Ini adalah kasus yang paling umum.
Namun untuk aplikasi tertentu, Anda mungkin perlu mengirim data GNSS RTK ke komputer/server Anda secara real-time, sehingga Anda dapat segera mengambil tindakan tanpa menunggu beberapa jam untuk memproses data.
Aplikasi populer yang memerlukan pengiriman posisi waktu nyata ke server meliputi: manajemen armada dan logistik, transportasi online dan transportasi umum, pelacakan aset, pemantauan satwa liar, …
Dalam tutorial ini, kami akan menjelaskan cara menyiapkan server dengan Node-RED, yang merupakan alat populer untuk pemrograman visual, sehingga Anda dapat memulai proyek Anda sendiri, kami juga akan membahas cara mengonfigurasi penerima GNSS dan plugin untuk mengirim data ke server ini.
Perangkat keras yang diperlukan
- Server Linux jarak jauh
Meskipun kami akan menggunakan hal di atas dalam contoh kami, Anda juga dapat menjalankan Node-RED secara lokal di mesin Windows/Linux, di RaspberryPi, Docker, Android, Cloud, … - Android smartphone
- RTK Portable Bluetooth Kit
- Sebagai alternatif, penerima GNSS lainnya dengan 4G NTRIP Menguasai, WiFi NTRIP Master or Ethernet NTRIP Master plugin
Perangkat lunak yang diperlukan
- GNSS Master aplikasi untuk Android
Instalasi Node-RED
Server Linux jarak jauh
Dalam kasus kami, kami menggunakan distribusi AlmaLinux.
Buka terminal ke server Anda dan jalankan perintah berikut:
sudo dnf module reset -y nodejs
sudo dnf module enable -y nodejs:20
sudo dnf install -y nodejs npm gcc-c++ make
# then:
sudo npm i -g --unsafe-perm node-red
Anda dapat memeriksa apakah instalasi berhasil dengan mengetik:/usr/local/bin/node-red --version
Jika semuanya baik-baik saja, Anda akan melihat versi yang ditampilkan di terminal.
Perangkat/OS lain
Anda dapat menemukan petunjuk di halaman resmi proyek Node-RED untuk sistem yang berbeda.
Buka port TCP di server Anda
Ini mungkin tidak selalu diperlukan tetapi Anda mungkin perlu membuka port TCP untuk mengizinkan koneksi masuk.
Kami akan menggunakan port TCP 2222 dalam contoh ini, Anda harus mengetik di terminal server Anda:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Jalankan Node-RED
Ketikkan perintah ini: /usr/local/bin/node-red &
Buka peramban Anda dan ketik:
172.123.123.123:1880
Di mana 172.123.123.123 harus menjadi alamat IP server Anda.
Jika semuanya baik-baik saja, Anda akan melihat sesuatu seperti ini:
Siapkan aliran pertama Anda
Dalam Node-RED, proyek disebut Flow.
Kami akan menyiapkan alur baru untuk mendengarkan koneksi TCP yang masuk dan mencetak apa pun yang diterima ke dalam jendela debug.
Cari di panel kiri, node yang disebut tcp masuk, seret dan letakkan ke kanvas alur.
Cari juga men-debug simpul dan hubungkan keduanya seperti ini:
Dalam Node-RED, proyek disebut Flow.
Kami akan menyiapkan alur baru untuk mendengarkan koneksi TCP yang masuk dan mencetak apa pun yang diterima ke dalam jendela debug.
Cari di panel kiri, node yang disebut tcp masuk, seret dan letakkan ke kanvas alur.
Cari juga men-debug simpul dan hubungkan keduanya seperti ini:
Klik dua kali pada node tcp dan atur port TCP tempat Anda ingin mendengarkan, dalam contoh ini: 2222.
Tetapkan juga untuk mengalirkan string yang dibatasi oleh \r\n.
Setelah melakukan ini klik tombol Deploy di kanan atas layar.
Tombol ini akan menjalankan blok setelah modifikasi apa pun.
Hubungkan penerima GNSS Anda ke Node-RED
RTK Portable Bluetooth Kit dengan perangkat Android
- Hubungkan Perangkat Bluetooth Portabel Anda melalui BT ke perangkat Android Anda.
- Open GNSS Master aplikasi, sambungkan ke modul BT di Koneksi Penerima GNSS.
- Atur Input Koreksi jika diperlukan
- Pada Output Data Penerima, pilih Klien TCP dan masukkan alamat IP server Anda di Alamat TCP dan 2222 di Port TCP. Klik Sambungkan.
- Itu saja, jika Anda mengklik dua kali pada jendela debug di Node-RED Anda akan melihat sesuatu seperti ini, dengan semua data yang diterima:
Penerima GNSS lain dengan plugin 4G, WiFi atau Ethernet
Jika Anda memiliki penerima GNSS yang berbeda, Anda juga dapat memperoleh hasil yang sama, bahkan tanpa perangkat Android.
Pastikan untuk mengeluarkan ke port COM plugin XBee pesan yang ingin Anda kirim ke server Anda, biasanya Anda ingin mengirim, setidaknya, NMEA GGA.
Kemudian, konfigurasikan 4G, WiFi atau Ethernet NTRIP Master plugin dengan fungsionalitas klien TCP dengan parameter yang sama seperti yang telah kita lakukan sebelumnya, server TCP adalah alamat IP server Anda, port TCP adalah 2222.
Sesederhana itu 🙂
Lakukan sesuatu dengan data tersebut
Oke, sejauh ini tidak terlalu menarik kan?
Tidak apa-apa untuk melihat aliran NMEA langsung di server Anda, tetapi kami ingin melihat beberapa kemampuan Node-RED.
Pada contoh berikutnya, kami akan menunjukkan cara mengurai aliran input untuk mendapatkan lintang dan bujur dan kami akan memplot lokasi saat ini di peta dengan jejak yang menunjukkan lokasi lama.
Pertama-tama, hapus aliran Anda saat ini.
Klik menu kanan atas > Kelola palet > Instal > cari node-red-contrib-web-peta dunia dan menginstalnya.
Kembali ke menu > Impor > Papan Klip dan tempel kode berikut:
[
{
"id": "tab1",
"type": "tab",
"label": "GNSS Live Map + Track",
"disabled": false,
"info": ""
},
{
"id": "tcpInNmea2222",
"type": "tcp in",
"z": "tab1",
"name": "NMEA TCP 2222",
"server": "server",
"host": "",
"port": "2222",
"datamode": "stream",
"datatype": "utf8",
"newline": "\\r\\n",
"topic": "",
"base64": false,
"x": 150,
"y": 140,
"wires": [
[
"fnGGA"
]
]
},
{
"id": "fnGGA",
"type": "function",
"z": "tab1",
"name": "Filter GGA → {lat,lon}",
"func": "// Allman style\nfunction nmeaToDecimal(raw, hemi)\n{\n if (!raw || !hemi)\n {\n return null;\n }\n const isLat = (hemi === 'N' || hemi === 'S');\n const degDigits = isLat ? 2 : 3;\n const deg = parseInt(raw.slice(0, degDigits), 10);\n const min = parseFloat(raw.slice(degDigits));\n if (Number.isNaN(deg) || Number.isNaN(min))\n {\n return null;\n }\n let dec = deg + (min / 60.0);\n if (hemi === 'S' || hemi === 'W')\n {\n dec = -dec;\n }\n return dec;\n}\n\nif (typeof msg.payload !== 'string')\n{\n return null;\n}\n\nconst line = msg.payload.trim();\nif (!line.startsWith('$') || line.indexOf('GGA,') === -1)\n{\n return null;\n}\n\nconst f = line.split(',');\nconst lat = nmeaToDecimal(f[2], f[3]);\nconst lon = nmeaToDecimal(f[4], f[5]);\nif (lat == null || lon == null)\n{\n return null;\n}\n\nmsg.payload = { lat, lon };\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 410,
"y": 140,
"wires": [
[
"fnToWorldmap"
]
]
},
{
"id": "fnToWorldmap",
"type": "function",
"z": "tab1",
"name": "Marker + Track",
"func": "// Input: msg.payload={lat,lon}\n// Output1 → worldmap marker\n// Output2 → worldmap-tracks polyline (then wired into worldmap)\n\nif (!msg.payload || msg.payload.lat == null || msg.payload.lon == null)\n{\n return null;\n}\n\nconst lat = Number(msg.payload.lat);\nconst lon = Number(msg.payload.lon);\nconst name = \"GPS-1\"; // keep constant per device\nconst now = Date.now();\n\nconst base =\n{\n name: name,\n lat: lat,\n lon: lon,\n layer: \"GNSS\",\n time: now, // helps pruning\n icon: \"fa-location-arrow\",\n popup: `Lat: ${lat.toFixed(6)}
Lon: ${lon.toFixed(6)}
UTC: ${new Date(now).toISOString()}`\n};\n\nreturn [ { payload: base }, { payload: base } ];",
"outputs": 2,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 650,
"y": 140,
"wires": [
[
"worldmap",
"dbgMarker"
],
[
"tracks"
]
]
},
{
"id": "tracks",
"type": "worldmap-tracks",
"z": "tab1",
"name": "Track GNSS (layer GNSS)",
"depth": "1000",
"layer": "GNSS",
"doors": "",
"x": 930,
"y": 180,
"wires": [
[
"worldmap"
]
]
},
{
"id": "worldmap",
"type": "worldmap",
"z": "tab1",
"name": "Live Map (/worldmap)",
"lat": "0",
"lon": "0",
"zoom": "2",
"layer": "OSM",
"cluster": "",
"maxage": "",
"usermenu": "show",
"layers": "show",
"panit": "false",
"panlock": "false",
"zoomlock": "false",
"hiderightclick": "false",
"coords": "none",
"showgrid": "false",
"showruler": "false",
"showlayer": "true",
"showmenu": "true",
"path": "/worldmap",
"overlist": "DR,CO,RA,DN,HM",
"maplist": "OSM,Esri Terrain,Esri Satellite",
"mapname": "",
"mapurl": "",
"mapopt": "",
"kmlurl": "",
"devicelabel": "name",
"layercontrol": "false",
"x": 930,
"y": 120,
"wires": []
},
{
"id": "dbgMarker",
"type": "debug",
"z": "tab1",
"name": "Marker payload",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"statusVal": "",
"statusType": "auto",
"x": 930,
"y": 220,
"wires": []
},
{
"id": "hint",
"type": "comment",
"z": "tab1",
"name": "Send NMEA (\\r\\n delimited) to TCP 2222. Open http://:1880/worldmap",
"info": "",
"x": 330,
"y": 90,
"wires": []
}
]
Anda akan melihat sesuatu seperti ini:
Klik dua kali simpul peta dunia.
Pada daftar turun bawah Peta, pilih OpenStreetMap atau lapisan lain, klik Selesai:
Tekan Menyebarkan .
Anda dapat mengakses peta langsung di sini dari browser Anda:
172.123.123.123:1880/peta dunia/
di mana alamat IP harus sama dengan alamat IP server Anda.
Anda akan melihat peta dengan penanda yang menunjukkan lokasi penerima GNSS Anda, diperbarui secara real time, Anda dapat memperbesar/memperkecil sesuai keinginan.
Kami sarankan Anda mengamati setiap simpul pada alur Anda untuk lebih memahami apa yang mereka lakukan, memodifikasinya, dan melihat perubahan apa yang terjadi.
Anda akan menemukan banyak tutorial dan alat AI juga akan membantu Anda jika Anda ingin melakukan sesuatu yang sedikit lebih maju.
Have fun!
Jika Anda ingin mematikan Node-RED, silakan lakukan hal berikut:iptables -A INPUT -p tcp --dport 2222 -j REJECT
mengetik ps aux | grep node , temukan proses simpul jika dan hentikan proses dengan:kill NODE_PROCESS_ID