GNSS Technologie RTK se dá využít v mnoha aplikacích, obvykle se provede několik měření a ty se poté exportují do počítače k analýze dat. Toto je nejběžnější případ.
Ale u některých aplikací může být nutné odesílat data GNSS RTK do počítače/serveru v reálném čase, abyste mohli okamžitě podniknout kroky, aniž byste čekali několik hodin na zpracování dat.
Mezi oblíbené aplikace, které vyžadují odesílání polohy v reálném čase na server, patří: správa a logistika vozového parku, sdílená přeprava a veřejná doprava, sledování majetku, monitorování divoké zvěře atd.
V tomto tutoriálu si vysvětlíme, jak nastavit server s Node-RED, což je oblíbený nástroj pro vizuální programování, abyste mohli začít s vlastním projektem. Také se podíváme na to, jak nakonfigurovat váš GNSS přijímač a plugin pro odesílání dat na tento server.
Požadovaný hardware
- Vzdálený Linuxový server
I když v našem příkladu použijeme výše uvedený postup, Node-RED můžete spustit i lokálně na počítači s Windows/Linuxem, na RaspberryPi, Dockeru, Androidu, cloudu atd. - Android smartphone
- RTK Portable Bluetooth Kit
- Alternativně lze použít jakýkoli jiný GNSS přijímač s 4G NTRIP Mistr, WiFi NTRIP Master or Ethernet NTRIP Master Pluginy
Požadovaný software
- GNSS Master aplikace pro Android
Instalace Node-RED
Vzdálený Linuxový server
V našem případě používáme distribuci AlmaLinux.
Otevřete terminál na vašem serveru a spusťte následující příkazy:
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
Úspěšnost instalace můžete zkontrolovat zadáním:/usr/local/bin/node-red --version
Pokud je vše v pořádku, uvidíte verzi zobrazenou na terminálu.
Jiná zařízení/OS
Pokyny naleznete na oficiální stránce projektu Node-RED. různé systémy.
Otevřete TCP port na vašem serveru
To nemusí být vždy nutné, ale pro povolení příchozích připojení budete možná muset otevřít TCP port.
V celém tomto příkladu budeme používat TCP port 2222, na terminálu serveru byste měli zadat:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Spustit Node-RED
Zadejte tento příkaz: /usr/local/bin/node-red &
Přejděte do prohlížeče a zadejte:
172.123.123.123:1880
Kde 172.123.123.123 musí být IP adresa vašeho serveru.
Pokud je vše v pořádku, měli byste vidět něco takového:
Připravte si první tok
V Node-RED se projekty nazývají Flows (toky).
Připravíme nový tok pro naslouchání příchozím TCP spojením a výpis přijatých dat do ladicího okna.
Vyhledejte v levém panelu uzel s názvem TCP v, přetáhněte jej na plátno toku.
Hledejte také ladit uzel a propojte je takto:
V Node-RED se projekty nazývají Flows (toky).
Připravíme nový tok pro naslouchání příchozím TCP spojením a výpis přijatých dat do ladicího okna.
Vyhledejte v levém panelu uzel s názvem TCP v, přetáhněte jej na plátno toku.
Hledejte také ladit uzel a propojte je takto:
Dvakrát klikněte na tcp v uzlu a nastavte TCP port, na kterém chcete naslouchat, v tomto příkladu: 2222.
Nastavit také streamování řetězců oddělených \r\n.
Po tom klikněte na tlačítko Nasadit v pravé horní části obrazovky.
Toto tlačítko spustí bloky po jakékoli úpravě.
Připojte svůj GNSS přijímač k Node-RED
RTK Portable Bluetooth Kit se zařízením Android
- Připojte svou přenosnou Bluetooth sadu k zařízení Android přes Bluetooth.
- Otevřená GNSS Master V aplikaci se připojte k modulu BT v části Připojení přijímače GNSS.
- V případě potřeby nastavte korekční vstup
- V části Výstup dat příjemce vyberte možnost TCP klient a do pole TCP adresa zadejte IP adresu serveru a do pole TCP port hodnotu 2222. Klikněte na Připojit.
- To je vše, pokud dvakrát kliknete na ladicí okno v Node-RED, měli byste vidět něco jako toto, se všemi přijatými daty:
Jiné GNSS přijímače s pluginy 4G, WiFi nebo Ethernet
Pokud máte jiný GNSS přijímač, můžete dosáhnout stejných výsledků, a to i bez zařízení se systémem Android.
Ujistěte se, že na COM port pluginu XBee jsou odesílány zprávy, které chcete odeslat na server, obvykle chcete odeslat alespoň NMEA GGA.
Poté nakonfigurujte 4G, WiFi nebo Ethernet NTRIP Master pluginy s funkcí TCP klienta se stejnými parametry jako dříve, TCP server je IP adresa vašeho serveru, TCP port je 2222.
Tak jednoduché 🙂
Udělejte něco s daty
Dobře, zatím to moc vzrušující není, že?
Je v pořádku sledovat živé NMEA streamy na vašem serveru, ale chceme vidět některé možnosti Node-RED.
V dalším příkladu si ukážeme, jak analyzovat vstupní proud pro získání zeměpisné šířky a délky a jak vykreslit aktuální polohu na mapě se stopou zobrazující staré polohy.
Nejprve smažte svůj aktuální tok.
Klikněte v pravém horním menu > Spravovat paletu > Instalovat > vyhledat mapa-světa-node-red-contrib-web a nainstalovat jej.
Vraťte se do menu > Import > Schránka a vložte následující kód:
[
{
"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": []
}
]
Měli byste vidět něco takového:
Dvakrát klikněte na uzel mapy světa.
V rozbalovací nabídce Mapa vyberte OpenStreetMap nebo jinou vrstvu a klikněte na Hotovo:
Stiskněte Nasazení .
K živé mapě se můžete dostat z prohlížeče zde:
172.123.123.123:1880/mapa světa/
kde IP adresa musí být stejná jako adresa vašeho serveru.
Zobrazí se mapa se značkou zobrazující polohu vašeho GNSS přijímače, která se aktualizuje v reálném čase a můžete si mapu dle libosti přibližovat/oddalovat.
Doporučujeme vám podívat se na každý z uzlů ve vašem toku, abyste lépe pochopili, co dělají, upravili je a zjistili, co se změní.
Najdete zde spoustu tutoriálů a nástroje umělé inteligence vám také pomohou, pokud chcete dělat něco trochu pokročilejšího.
Bavte se!
Pokud chcete vypnout Node-RED, proveďte následující:iptables -A INPUT -p tcp --dport 2222 -j REJECT
typ ps aux | grep node , najděte proces uzlu, pokud , a ukončete proces pomocí:kill NODE_PROCESS_ID
si
