GNSS Die RTK-Technologie kann in vielen Anwendungen eingesetzt werden. Normalerweise werden einige Messungen durchgeführt und diese dann zur Analyse auf einen Computer exportiert. Dies ist der häufigste Fall.
Für bestimmte Anwendungen müssen Sie Ihre GNSS-RTK-Daten jedoch möglicherweise in Echtzeit an Ihren Computer/Server senden, damit Sie sofort Maßnahmen ergreifen können, ohne mehrere Stunden auf die Verarbeitung der Daten warten zu müssen.
Zu den gängigen Anwendungen, bei denen die Position in Echtzeit an einen Server gesendet werden muss, gehören: Flottenmanagement und Logistik, Mitfahrdienste und öffentliche Verkehrsmittel, Anlagenverfolgung, Wildtierüberwachung usw.
In diesem Tutorial erklären wir, wie Sie mit Node-RED, einem beliebten Tool für visuelle Programmierung, einen Server einrichten, damit Sie Ihr eigenes Projekt starten können. Außerdem erfahren Sie, wie Sie Ihren GNSS-Empfänger und Ihr Plug-In konfigurieren, um die Daten an diesen Server zu senden.
Erforderliche Hardware
- Remote-Linux-Server
Obwohl wir in unserem Beispiel das oben genannte verwenden, können Sie Node-RED auch lokal auf einem Windows-/Linux-Computer, auf einem RaspberryPi, Docker, Android, in der Cloud usw. ausführen. - Android smartphone
- RTK Portable Bluetooth Kit
- Alternativ kann jeder andere GNSS-Empfänger mit 4G NTRIP Master, WiFi NTRIP Master or Ethernet NTRIP Master Plugins
Erforderliche Software
- GNSS Master App für Android
Installation von Node-RED
Remote-Linux-Server
In unserem Fall verwenden wir die AlmaLinux-Distribution.
Öffnen Sie ein Terminal für Ihren Server und führen Sie die folgenden Befehle aus:
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
Sie können überprüfen, ob die Installation erfolgreich war, indem Sie Folgendes eingeben:/usr/local/bin/node-red --version
Wenn alles in Ordnung ist, wird die Version auf dem Terminal angezeigt.
Andere Geräte/Betriebssysteme
Anweisungen finden Sie auf der offiziellen Node-RED-Projektseite für verschiedene Systeme.
Öffnen Sie den TCP-Port auf Ihrem Server
Dies ist möglicherweise nicht immer notwendig, aber Sie müssen möglicherweise den TCP-Port öffnen, um eingehende Verbindungen zuzulassen.
Wir werden in diesem Beispiel den TCP-Port 2222 verwenden. Sie sollten in Ihr Serverterminal Folgendes eingeben:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Führen Sie Node-RED aus
Geben Sie diesen Befehl ein: /usr/local/bin/node-red &
Gehen Sie zu Ihrem Browser und geben Sie Folgendes ein:
172.123.123.123:1880
Dabei muss 172.123.123.123 die IP-Adresse Ihres Servers sein.
Wenn alles in Ordnung ist, sollten Sie ungefähr Folgendes sehen:
Bereiten Sie Ihren ersten Flow vor
In Node-RED werden Projekte als Flows bezeichnet.
Wir werden einen neuen Flow vorbereiten, um auf eingehende TCP-Verbindungen zu lauschen und alles, was empfangen wird, in ein Debug-Fenster zu drucken.
Suchen Sie im linken Bereich nach dem Knoten mit dem Namen TCP in, ziehen Sie es per Drag & Drop auf die Flow-Leinwand.
Suchen Sie auch die debuggen Knoten und verbinden Sie sie wie folgt miteinander:
In Node-RED werden Projekte als Flows bezeichnet.
Wir werden einen neuen Flow vorbereiten, um auf eingehende TCP-Verbindungen zu lauschen und alles, was empfangen wird, in ein Debug-Fenster zu drucken.
Suchen Sie im linken Bereich nach dem Knoten mit dem Namen TCP in, ziehen Sie es per Drag & Drop auf die Flow-Leinwand.
Suchen Sie auch die debuggen Knoten und verbinden Sie sie wie folgt miteinander:
Doppelklicken Sie auf den TCP-Eingangsknoten und legen Sie den TCP-Port fest, auf dem Sie lauschen möchten, in diesem Beispiel: 2222.
Auch auf Stream-Strings einstellen, die durch \r\n getrennt sind.
Nachdem Sie dies getan haben Klicken Sie auf die Schaltfläche Bereitstellen oben rechts auf dem Bildschirm.
Mit dieser Schaltfläche werden die Blöcke nach jeder Änderung ausgeführt.
Verbinden Sie Ihren GNSS-Empfänger mit Node-RED
RTK Portable Bluetooth Kit mit Android-Gerät
- Verbinden Sie Ihr tragbares Bluetooth-Kit über BT mit Ihrem Android-Gerät.
- Öffne GNSS Master App, stellen Sie eine Verbindung zum BT-Modul in der GNSS-Empfängerverbindung her.
- Korrektureingabe bei Bedarf einstellen
- Wählen Sie unter „Receiver Data Output“ „TCP Client“ aus und geben Sie die IP-Adresse Ihres Servers in das Feld „TCP Address“ und 2222 in das Feld „TCP Port“ ein. Klicken Sie auf „Connect“.
- Das ist alles. Wenn Sie in Node-RED auf das Debug-Fenster doppelklicken, sollten Sie ungefähr Folgendes mit allen empfangenen Daten sehen:
Andere GNSS-Empfänger mit 4G-, WiFi- oder Ethernet-Plugins
Mit einem anderen GNSS-Empfänger können Sie die gleichen Ergebnisse auch ohne Android-Gerät erzielen.
Stellen Sie sicher, dass Sie die Nachrichten, die Sie an Ihren Server senden möchten, an den COM-Port des XBee-Plugins ausgeben. Normalerweise möchten Sie mindestens Folgendes senden: NMEA GGA.
Konfigurieren Sie dann Ihr 4G, WiFi oder Ethernet NTRIP Master Plugins mit der TCP-Client-Funktionalität mit den gleichen Parametern wie zuvor, TCP-Server ist Ihre Server-IP-Adresse, TCP-Port ist 2222.
So einfach ist das 🙂
Machen Sie etwas mit den Daten
Ok, bisher nicht sehr aufregend, oder?
Es ist in Ordnung, Live-NMEA-Streams auf Ihrem Server zu sehen, aber wir möchten einige der Funktionen von Node-RED sehen.
Im nächsten Beispiel zeigen wir Ihnen, wie Sie den Eingabestrom analysieren, um den Breiten- und Längengrad zu erhalten, und wir stellen den aktuellen Standort in einer Karte mit einer Spur dar, die alte Standorte anzeigt.
Löschen Sie zunächst Ihren aktuellen Flow.
Klicken Sie oben rechts auf das Menü > Palette verwalten > Installieren > suchen nach node-red-contrib-web-worldmap und installieren Sie es.
Gehen Sie zurück zum Menü > Importieren > Zwischenablage und fügen Sie den folgenden Code ein:
[
{
"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": []
}
]
Sie sollten so etwas sehen:
Doppelklicken Sie auf den Weltkartenknoten.
Wählen Sie in der Dropdown-Liste „Kartenliste“ OpenStreetMap oder eine andere Ebene aus und klicken Sie auf „Fertig“:
Drücken Sie auf Einführung .
Sie können von Ihrem Browser aus hier auf die Live-Karte zugreifen:
172.123.123.123:1880/Weltkarte/
wobei die IP-Adresse mit der Ihres Servers übereinstimmen muss.
Sie sehen eine Karte mit einer Markierung, die den Standort Ihres GNSS-Empfängers anzeigt. Die Aktualisierung erfolgt in Echtzeit. Sie können nach Belieben hinein- und herauszoomen.
Wir empfehlen Ihnen, sich jeden Knoten in Ihrem Flow anzusehen, um besser zu verstehen, was sie tun, sie zu ändern und zu sehen, was sich ändert.
Sie finden zahlreiche Tutorials und KI-Tools helfen Ihnen auch, wenn Sie etwas Fortgeschritteneres tun möchten.
Viel Spaß!
Wenn Sie Node-RED herunterfahren möchten, gehen Sie bitte wie folgt vor:iptables -A INPUT -p tcp --dport 2222 -j REJECT
tippe ps aux | grep node , suchen Sie den Knotenprozess, wenn und beenden Sie den Prozess durch:kill NODE_PROCESS_ID
und
