GNSS La technologie RTK peut être utilisée dans de nombreuses applications. Généralement, on prend des mesures, puis on les exporte vers un ordinateur pour analyser les données. C'est le cas le plus courant.
Mais pour certaines applications, vous devrez peut-être envoyer vos données GNSS RTK à votre ordinateur/serveur en temps réel, afin de pouvoir agir immédiatement sans attendre quelques heures pour traiter les données.
Les applications courantes qui nécessitent l'envoi de la position en temps réel à un serveur incluent : la gestion de flotte et la logistique, les services de covoiturage et les transports publics, le suivi des actifs, la surveillance de la faune, …
Dans ce tutoriel, nous expliquerons comment configurer un serveur avec Node-RED, qui est un outil populaire pour la programmation visuelle, afin que vous puissiez démarrer votre propre projet, nous verrons également comment configurer votre récepteur GNSS et votre plugin pour envoyer les données à ce serveur.
Matériel requis
- Serveur Linux distant
Bien que nous utiliserons ce qui précède dans notre exemple, vous pouvez également exécuter Node-RED localement sur une machine Windows/Linux, sur un RaspberryPi, Docker, Android, Cloud, … - Android smartphone
- RTK Portable Bluetooth Kit
- En alternative, tout autre récepteur GNSS avec 4G NTRIP Master, WiFi NTRIP Master or Ethernet NTRIP Master plugins
Logiciel requis
- GNSS Master application pour Android
Installation de Node-RED
Serveur Linux distant
Dans notre cas, nous utilisons la distribution AlmaLinux.
Ouvrez un terminal sur votre serveur et exécutez les commandes suivantes :
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
Vous pouvez vérifier si l'installation a réussi en tapant :/usr/local/bin/node-red --version
Si tout va bien, vous verrez la version affichée sur le terminal.
Autres appareils/systèmes d'exploitation
Vous pouvez trouver des instructions sur la page officielle du projet Node-RED pour différents systèmes.
Ouvrez le port TCP sur votre serveur
Cela n’est peut-être pas toujours nécessaire, mais vous devrez peut-être ouvrir le port TCP pour autoriser les connexions entrantes.
Nous utiliserons le port TCP 2222 pendant tout cet exemple, vous devrez taper sur votre terminal serveur :iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Exécuter Node-RED
Tapez cette commande: /usr/local/bin/node-red &
Accédez à votre navigateur et tapez :
172.123.123.123:1880
Où 172.123.123.123 doit être l'adresse IP de votre serveur.
Si tout va bien, vous devriez voir quelque chose comme ceci :
Préparez votre premier flux
Dans Node-RED, les projets sont appelés flux.
Nous allons préparer un nouveau flux pour écouter les connexions TCP entrantes et pour imprimer tout ce qui est reçu dans une fenêtre de débogage.
Recherchez sur le panneau de gauche, le nœud appelé TCP dans, faites-le glisser et déposez-le sur le canevas du flux.
Rechercher également le déboguer nœud et connectez-les ensemble comme ceci :
Dans Node-RED, les projets sont appelés flux.
Nous allons préparer un nouveau flux pour écouter les connexions TCP entrantes et pour imprimer tout ce qui est reçu dans une fenêtre de débogage.
Recherchez sur le panneau de gauche, le nœud appelé TCP dans, faites-le glisser et déposez-le sur le canevas du flux.
Rechercher également le déboguer nœud et connectez-les ensemble comme ceci :
Double-cliquez sur le nœud TCP et définissez le port TCP sur lequel vous souhaitez écouter, dans cet exemple : 2222.
Définissez également les chaînes de diffusion délimitées par \r\n.
Après avoir fait cela cliquez sur le bouton Déployer en haut à droite de l'écran.
Ce bouton exécutera les blocs après toute modification.
Connectez votre récepteur GNSS à Node-RED
RTK Portable Bluetooth Kit avec un appareil Android
- Connectez votre kit Bluetooth portable via BT à votre appareil Android.
- Open GNSS Master application, connectez-vous au module BT dans la connexion du récepteur GNSS.
- Définir l'entrée de correction si nécessaire
- Dans la section « Sortie des données du récepteur », sélectionnez « Client TCP » et saisissez l'adresse IP de votre serveur dans le champ « Adresse TCP » et « 2222 » dans le champ « Port TCP ». Cliquez sur « Connecter ».
- C'est tout, si vous double-cliquez sur la fenêtre de débogage dans Node-RED, vous devriez voir quelque chose comme ceci, avec toutes les données reçues :
Autres récepteurs GNSS avec connecteurs 4G, WiFi ou Ethernet
Si vous disposez d'un autre récepteur GNSS, vous pouvez également obtenir les mêmes résultats, même sans appareil Android.
Assurez-vous de sortir vers le port COM du plugin XBee les messages que vous souhaitez envoyer à votre serveur, généralement vous souhaitez envoyer, au moins, messages NMEA GGA.
Ensuite, configurez votre 4G, WiFi ou Ethernet NTRIP Master plugins avec la fonctionnalité client TCP avec les mêmes paramètres qu'auparavant, le serveur TCP est l'adresse IP de votre serveur, le port TCP est 2222.
C'est aussi simple que ça 🙂
Faites quelque chose avec les données
Ok, jusqu'ici ce n'est pas très excitant, n'est-ce pas ?
Il est possible de voir des flux NMEA en direct sur votre serveur, mais nous souhaitons voir certaines des fonctionnalités de Node-RED.
Dans l'exemple suivant, nous vous montrerons comment analyser le flux d'entrée pour obtenir la latitude et la longitude et nous tracerons l'emplacement en direct sur une carte avec une trace montrant les anciens emplacements.
Tout d’abord, supprimez votre flux actuel.
Cliquez sur le menu en haut à droite > Gérer la palette > Installer > rechercher node-red-contrib-web-carte-du-monde et l'installer.
Revenez au menu > Importer > Presse-papiers et collez le code suivant :
[
{
"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": []
}
]
Vous devriez voir quelque chose comme ceci:
Double-cliquez sur le nœud de la carte du monde.
Dans la liste déroulante des cartes, sélectionnez OpenStreetMap ou une autre couche, cliquez sur Terminé :
Appuyez sur la touche Déployer .
Vous pouvez accéder depuis votre navigateur à la carte en direct ici :
172.123.123.123:1880/carte du monde/
où l'adresse IP doit être la même que celle de votre serveur.
Vous verrez une carte avec un marqueur indiquant l'emplacement de votre récepteur GNSS, mis à jour en temps réel, vous pouvez zoomer/dézoomer à votre guise.
Nous vous recommandons de jeter un œil à chacun des nœuds de votre flux pour mieux comprendre ce qu'ils font, les modifier et voir ce qui change.
Vous trouverez de nombreux tutoriels et des outils d'IA vous aideront également si vous souhaitez faire quelque chose d'un peu plus avancé.
Amusez-vous!
Si vous souhaitez arrêter Node-RED, procédez comme suit :iptables -A INPUT -p tcp --dport 2222 -j REJECT
type ps aux | grep node , recherchez le processus du nœud si et tuez le processus en :kill NODE_PROCESS_ID