GNSS RTK tehnologija može se koristiti u mnogim primjenama, obično biste izvršili neka mjerenja, a zatim ih izvezli na računalo za analizu podataka. Ovo je najčešći slučaj.
No za određene primjene možda ćete morati poslati svoje GNSS RTK podatke na svoje računalo/poslužitelj u stvarnom vremenu, tako da možete odmah poduzeti radnje bez čekanja nekoliko sati na obradu podataka.
Popularne aplikacije koje zahtijevaju slanje pozicije u stvarnom vremenu na poslužitelj uključuju: upravljanje voznim parkom i logistiku, usluge prijevoza i javni prijevoz, praćenje imovine, praćenje divljih životinja, ...
U ovom tutorialu objasnit ćemo kako postaviti poslužitelj s Node-RED-om, popularnim alatom za vizualno programiranje, tako da možete započeti vlastiti projekt, a također ćemo pokriti kako konfigurirati vaš GNSS prijemnik i dodatak za slanje podataka na ovaj poslužitelj.
Potreban hardver
- Udaljeni Linux poslužitelj
Iako ćemo u našem primjeru koristiti gore navedeno, Node-RED možete pokrenuti i lokalno na Windows/Linux računalu, na RaspberryPi-ju, Dockeru, Androidu, Cloudu, ... - Android smartphone
- RTK Portable Bluetooth Kit
- Kao alternativa, bilo koji drugi GNSS prijemnik s 4G NTRIP Majstorski, WiFi NTRIP Master or Ethernet NTRIP Master dodaci
Potreban softver
- GNSS Master aplikacija za Android
Instalacija Node-RED-a
Udaljeni Linux poslužitelj
U našem slučaju koristimo AlmaLinux distribuciju.
Otvorite terminal na vašem serveru i pokrenite sljedeće naredbe:
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
Možete provjeriti je li instalacija uspješna upisivanjem:/usr/local/bin/node-red --version
Ako je sve u redu, vidjet ćete verziju prikazanu na terminalu.
Ostali uređaji/OS
Upute možete pronaći na službenoj stranici projekta Node-RED. različiti sustavi.
Otvorite TCP port na svom serveru
To možda nije uvijek potrebno, ali možda ćete morati otvoriti TCP port kako biste omogućili dolazne veze.
U cijelom ovom primjeru koristit ćemo TCP port 2222, a vi trebate upisati na terminal vašeg servera:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Pokreni Čvor-RED
Upišite ovu naredbu: /usr/local/bin/node-red &
Idite u svoj preglednik i upišite:
172.123.123.123:1880
Gdje 172.123.123.123 mora biti IP adresa vašeg poslužitelja.
Ako je sve u redu, trebali biste vidjeti nešto ovako:
Pripremite svoj prvi tok
U Node-RED-u, projekti se nazivaju Flows (Tokovi).
Pripremit ćemo novi tok za slušanje dolaznih TCP veza i ispis svega što se primi u prozor za ispravljanje grešaka.
Pretražite na lijevoj ploči, čvor pod nazivom tcp u, povucite i ispustite ga na platno protoka.
Pretražite i otkloniti neispravnost čvor i spojite ih zajedno ovako:
U Node-RED-u, projekti se nazivaju Flows (Tokovi).
Pripremit ćemo novi tok za slušanje dolaznih TCP veza i ispis svega što se primi u prozor za ispravljanje grešaka.
Pretražite na lijevoj ploči, čvor pod nazivom tcp u, povucite i ispustite ga na platno protoka.
Pretražite i otkloniti neispravnost čvor i spojite ih zajedno ovako:
Dvaput kliknite na tcp u čvoru i postavite TCP port na kojem želite slušati, u ovom primjeru: 2222.
Postavi i za strujanje nizova razdvojenih s \r\n.
Nakon što je ovo učinio kliknite gumb Rasporedi u gornjem desnom kutu ekrana.
Ovaj gumb će pokrenuti blokove nakon bilo kakve izmjene.
Spojite svoj GNSS prijemnik na Node-RED
RTK Portable Bluetooth Kit s Android uređajem
- Spojite svoj prijenosni Bluetooth komplet putem BT-a na svoj Android uređaj.
- Otvoren GNSS Master aplikaciji, spojite se na BT modul u odjeljku Veza s GNSS prijemnikom.
- Po potrebi postavite unos za korekciju
- U odjeljku Izlaz podataka prijemnika odaberite TCP klijent i unesite IP adresu vašeg poslužitelja u TCP adresu i 2222 u TCP port. Kliknite Poveži se.
- To je sve, ako dvaput kliknete na prozor za otklanjanje pogrešaka u Node-RED-u trebali biste vidjeti nešto poput ovoga, sa svim primljenim podacima:
Ostali GNSS prijemnici s 4G, WiFi ili Ethernet dodacima
Ako imate drugačiji GNSS prijemnik, možete postići iste rezultate, čak i bez Android uređaja.
Obavezno pošaljite poruke koje želite poslati na svoj poslužitelj na COM port XBee dodatka, obično želite poslati barem NMEA GGA.
Zatim konfigurirajte svoj 4G, WiFi ili Ethernet NTRIP Master dodaci s funkcionalnošću TCP klijenta s istim parametrima kao i prije, TCP poslužitelj je IP adresa vašeg poslužitelja, TCP port je 2222.
Jednostavno kao to 🙂
Učinite nešto s podacima
Ok, zasad nije baš uzbudljivo, zar ne?
U redu je vidjeti NMEA streamove uživo na vašem serveru, ali želimo vidjeti neke od mogućnosti Node-RED-a.
U sljedećem primjeru pokazat ćemo vam kako parsirati ulazni tok kako bismo dobili zemljopisnu širinu i dužinu te ćemo prikazati lokaciju uživo na karti s tragom koji prikazuje stare lokacije.
Prije svega, izbrišite svoj trenutni tok.
Kliknite na izbornik gore desno > Upravljanje paletom > Instaliraj > pretraži node-red-contrib-web-karta-svijeta i instalirati ga.
Vratite se na izbornik > Uvoz > Međuspremnik i zalijepite sljedeći kod:
[
{
"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": []
}
]
Trebali biste vidjeti nešto poput ovoga:
Dvaput kliknite čvor karte svijeta.
Na padajućem popisu Karta odaberite OpenStreetMap ili neki drugi sloj, kliknite Gotovo:
Pritisnite razviti tipku.
Ovdje možete pristupiti karti uživo iz svog preglednika:
172.123.123.123:1880/karta svijeta/
gdje IP adresa mora biti ista kao i adresa vašeg poslužitelja.
Vidjet ćete kartu s oznakom koja prikazuje lokaciju vašeg GNSS prijemnika, ažurirajući se u stvarnom vremenu, a možete je zumirati po želji.
Preporučujemo vam da pogledate svaki od čvorova na vašem toku kako biste bolje razumjeli što rade, modificirali ih i vidjeli što se mijenja.
Naći ćete mnoštvo tutorijala, a AI alati će vam također pomoći ako želite napraviti nešto malo naprednije.
Zabavite se!
Ako želite isključiti Node-RED, učinite sljedeće:iptables -A INPUT -p tcp --dport 2222 -j REJECT
vrsta ps aux | grep node , pronađite proces čvora ako je i završite proces na sljedeći način:kill NODE_PROCESS_ID