GNSS RTK-teknologiaa voidaan käyttää monissa sovelluksissa. Yleensä otetaan joitakin mittauksia ja ne viedään tietokoneelle tietojen analysointia varten. Tämä on yleisin tapaus.
Mutta tietyissä sovelluksissa sinun on ehkä lähetettävä GNSS RTK -data tietokoneellesi/palvelimellesi reaaliajassa, jotta voit toimia välittömästi odottamatta muutaman tunnin käsittelyä.
Suosittuja sovelluksia, jotka vaativat reaaliaikaisen sijainnin lähettämisen palvelimelle, ovat: kalustonhallinta ja logistiikka, kyytipalvelut ja julkinen liikenne, omaisuuden seuranta, villieläinten seuranta jne.
Tässä opetusohjelmassa selitämme, kuinka palvelin määritetään Node-RED:llä, joka on suosittu visuaalisen ohjelmoinnin työkalu, jotta voit aloittaa oman projektisi. Käymme myös läpi, kuinka GNSS-vastaanotin ja -laajennus konfiguroidaan lähettämään dataa tälle palvelimelle.
Vaadittu laitteisto
- Etä-Linux-palvelin
Vaikka käytämme esimerkissämme yllä olevaa, voit ajaa Node-REDiä myös paikallisesti Windows/Linux-koneella, RaspberryPillä, Dockerilla, Androidilla, pilvessä jne. - Android smartphone
- RTK Portable Bluetooth Kit
- Vaihtoehtoisesti mikä tahansa muu GNSS-vastaanotin, jossa on 4G NTRIP Master, WiFi NTRIP Master or Ethernet NTRIP Master liitännäiset
Vaadittu ohjelmisto
- GNSS Master sovellus Androidille
Node-REDin asennus
Etä-Linux-palvelin
Meidän tapauksessamme käytämme AlmaLinux-jakelua.
Avaa palvelimellesi johtava terminaali ja suorita seuraavat komennot:
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
Voit tarkistaa asennuksen onnistumisen kirjoittamalla:/usr/local/bin/node-red --version
Jos kaikki on kunnossa, näet version terminaalissa.
Muut laitteet/käyttöjärjestelmät
Löydät ohjeet Node-RED-projektin viralliselta sivulta. eri järjestelmät.
Avaa TCP-portti palvelimellasi
Tämä ei välttämättä ole aina välttämätöntä, mutta saatat joutua avaamaan TCP-portin salliaksesi saapuvat yhteydet.
Käytämme tässä esimerkissä TCP-porttia 2222. Kirjoita palvelinpäätteelle:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Suorita Node-RED
Kirjoita tämä komento: /usr/local/bin/node-red &
Mene selaimeesi ja kirjoita:
172.123.123.123:1880
Missä 172.123.123.123 on oltava palvelimesi IP-osoite.
Jos kaikki on kunnossa, sinun pitäisi nähdä jotain tällaista:
Valmistele ensimmäinen työvirtasi
Node-REDissä projekteja kutsutaan Flow-projekteiksi.
Valmistelemme uuden työnkulun kuuntelemaan saapuvia TCP-yhteyksiä ja tulostamaan vastaanotetut tiedot debug-ikkunaan.
Vasemmanpuoleisessa paneelissa haetaan solmua nimeltä tcp sisään, vedä ja pudota se työntöalueelle.
Hae myös korjata virheet jstk solmu ja yhdistä ne toisiinsa näin:
Node-REDissä projekteja kutsutaan Flow-projekteiksi.
Valmistelemme uuden työnkulun kuuntelemaan saapuvia TCP-yhteyksiä ja tulostamaan vastaanotetut tiedot debug-ikkunaan.
Vasemmanpuoleisessa paneelissa haetaan solmua nimeltä tcp sisään, vedä ja pudota se työntöalueelle.
Hae myös korjata virheet jstk solmu ja yhdistä ne toisiinsa näin:
Kaksoisnapsauta solmun TCP-kohtaa ja aseta TCP-portti, jota haluat kuunnella, tässä esimerkissä: 2222.
Aseta myös striimaamaan merkkijonoja, jotka on erotettu \r\n-merkeillä.
Tämän jälkeen napsauta Ota käyttöön -painiketta näytön oikeassa yläkulmassa.
Tämä painike suorittaa lohkot minkä tahansa muokkauksen jälkeen.
Yhdistä GNSS-vastaanottimesi Node-REDiin
RTK Portable Bluetooth Kit Android-laitteella
- Yhdistä kannettava Bluetooth-pakettisi BT:n kautta Android-laitteeseesi.
- avoin GNSS Master sovelluksessa, yhdistä BT-moduuliin kohdassa GNSS-vastaanottimen yhteys.
- Aseta korjaussyöttö tarvittaessa
- Valitse Receiver Data Output -kohdasta TCP Client ja syötä palvelimesi IP-osoite TCP Address -kohtaan ja 2222 TCP Port -kohtaan. Napsauta Connect (Yhdistä).
- Siinä kaikki. Jos kaksoisnapsautat Node-RED:n debug-ikkunaa, sinun pitäisi nähdä jotain tällaista, kaikki vastaanotettavat tiedot:
Muut GNSS-vastaanottimet, joissa on 4G-, WiFi- tai Ethernet-liitännät
Jos sinulla on eri GNSS-vastaanotin, voit saavuttaa samat tulokset myös ilman Android-laitetta.
Varmista, että lähetät XBee-laajennuksen COM-porttiin viestit, jotka haluat lähettää palvelimellesi. Yleensä haluat lähettää ainakin seuraavat viestit: NMEA GGA.
Määritä sitten 4G-, WiFi- tai Ethernet NTRIP Master TCP-asiakastoiminnoilla varustetut laajennukset samoilla parametreilla kuin aiemmin, TCP-palvelin on palvelimesi IP-osoite, TCP-portti on 2222.
Niin yksinkertaista 🙂
Tee jotain datalla
Okei, ei kovin jännittävää tähän mennessä, vai mitä?
Palvelimellasi voi katsoa reaaliaikaisia NMEA-striimejä, mutta haluamme nähdä joitakin Node-RED:n ominaisuuksia.
Seuraavassa esimerkissä näytämme, kuinka syötetietovirran jäsentäminen leveys- ja pituusasteen selvittämiseksi mahdollistaa, ja piirrämme reaaliaikaisen sijainnin kartalle, jossa näkyy vanhat sijainnit.
Poista ensin nykyinen työnkulkusi.
Klikkaa oikean yläkulman valikkoa > Hallitse palettia > Asenna > hae solmu-punainen-contrib-verkkomaailmankartta ja asentaa sen.
Palaa valikkoon > Tuo > Leikepöytä ja liitä seuraava koodi:
[
{
"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": []
}
]
Sinun pitäisi nähdä jotain tällaista:
Kaksoisnapsauta maailmankartan solmua.
Valitse karttaluettelon alasvetovalikosta OpenStreetMap tai jokin muu taso ja napsauta Valmis:
paina Sijoittaa painiketta.
Voit käyttää reaaliaikaista karttaa selaimestasi täältä:
172.123.123.123:1880/maailmankartta/
jossa IP-osoitteen on oltava sama kuin palvelimesi IP-osoite.
Näet kartan, jossa on merkki, joka näyttää GNSS-vastaanottimesi sijainnin. Kartta päivittyy reaaliajassa. Voit zoomata sisään/ulos haluamallasi tavalla.
Suosittelemme, että tutustut jokaiseen työnkulkusi solmuun ymmärtääksesi paremmin, mitä ne tekevät, muokataksesi niitä ja nähdäksesi, mikä muuttuu.
Löydät runsaasti opetusohjelmia ja tekoälytyökalut auttavat sinua myös, jos haluat tehdä jotain hieman edistyneempää.
Have fun!
Jos haluat sammuttaa Node-RED:n, toimi seuraavasti:iptables -A INPUT -p tcp --dport 2222 -j REJECT
tyyppi ps aux | grep node , etsi solmuprosessi, jos , ja lopeta prosessi seuraavasti:kill NODE_PROCESS_ID