ГНСС РТК технологија се може користити у многим применама, обично бисте извршили нека мерења, а затим бисте их извезли у рачунар ради анализе података. Ово је најчешћи случај.
Али за одређене апликације, можда ћете морати да пошаљете своје GNSS RTK податке на рачунар/сервер у реалном времену, тако да можете одмах предузети акције без чекања неколико сати на обраду података.
Популарне апликације које захтевају слање позиције у реалном времену на сервер укључују: управљање возним парком и логистику, превоз путника и јавни превоз, праћење имовине, праћење дивљих животиња, ...
У овом туторијалу ћемо објаснити како да подесите сервер помоћу Node-RED-а, који је популаран алат за визуелно програмирање, тако да можете започети сопствени пројекат, такође ћемо покрити како да конфигуришете свој GNSS пријемник и додатак за слање података на овај сервер.
Потребан хардвер
- Удаљени Линукс сервер
Иако ћемо користити горе наведено у нашем примеру, Node-RED можете покренути и локално на Windows/Linux машини, на RaspberryPi-ју, Docker-у, Android-у, Cloud-у, ... - Андроид smartphone
- RTK Portable Bluetooth Kit
- Као алтернатива, било који други ГНСС пријемник са 4G NTRIP Мајстор, WiFi NTRIP Master or Ethernet NTRIP Master плугинс
Потребан софтвер
- GNSS Master апликација за Андроид
Инсталација Node-RED-а
Удаљени Линукс сервер
У нашем случају користимо AlmaLinux дистрибуцију.
Отворите терминал на вашем серверу и покрените следеће команде:
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
Можете проверити да ли је инсталација успешна тако што ћете откуцати:/usr/local/bin/node-red --version
Ако је све у реду, видећете верзију приказану на терминалу.
Остали уређаји/ОС
Упутства можете пронаћи на званичној страници пројекта Node-RED. различити системи.
Отворите TCP порт на вашем серверу
Ово можда није увек потребно, али можда ћете морати да отворите TCP порт да бисте дозволили долазне везе.
Користићемо TCP порт 2222 током целог овог примера, требало би да укуцате на терминалу вашег сервера:iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
Покрени Node-RED
Откуцајте ову наредбу: /usr/local/bin/node-red &
Идите у свој прегледач и откуцајте:
172.123.123.123:1880
Где 172.123.123.123 мора бити ИП адреса вашег сервера.
Ако је све у реду, требало би да видите нешто овако:
Припремите свој први ток
У Node-RED-у, пројекти се називају Flows (токови).
Припремићемо нови ток за слушање долазних TCP конекција и исписивање свега што је примљено у прозор за дебаговање.
Претражите на левом панелу, чвор под називом tcp у, превуците и испустите га на платно протока.
Претражите такође отклонити неисправност чвор и повежите их заједно овако:
У Node-RED-у, пројекти се називају Flows (токови).
Припремићемо нови ток за слушање долазних TCP конекција и исписивање свега што је примљено у прозор за дебаговање.
Претражите на левом панелу, чвор под називом tcp у, превуците и испустите га на платно протока.
Претражите такође отклонити неисправност чвор и повежите их заједно овако:
Двапут кликните на tcp у чвору и подесите TCP порт где желите да слушате, у овом примеру: 2222.
Такође подесите да се стрингови стримују раздвојени са \r\n.
Након што ово урадите кликните на дугме Распореди у горњем десном углу екрана.
Ово дугме ће покренути блокове након било какве измене.
Повежите свој ГНСС пријемник са Node-RED-ом
RTK Portable Bluetooth Kit са Андроид уређајем
- Повежите свој преносиви Блутут комплет путем БТ-а са својим Андроид уређајем.
- отворен GNSS Master апликацији, повежите се са БТ модулом у одељку Веза са ГНСС пријемником.
- Подесите унос за корекцију ако је потребно
- У пољу „Receiver Data Output“ (Излаз података пријемника), изаберите „TCP клијент“ и унесите IP адресу вашег сервера у поље „TCP адреса“ и 2222 у поље „TCP порт“. Кликните на „Повежи се“.
- То је све, ако двапут кликнете на прозор за дебаговање у Node-RED-у требало би да видите нешто овако, са свим примљеним подацима:
Остали ГНСС пријемници са 4Г, WiFi или Ethernet додацима
Ако имате други ГНСС пријемник, можете постићи исте резултате, чак и без Андроид уређаја.
Обавезно пошаљите поруке које желите да пошаљете на ваш сервер на COM порт XBee додатка, обично желите да пошаљете барем, НМЕА ГГА.
Затим, конфигуришите свој 4G, WiFi или Ethernet NTRIP Master додаци са TCP клијентском функционалношћу са истим параметрима као и раније, TCP сервер је IP адреса вашег сервера, TCP порт је 2222.
Једноставно је тако 🙂
Урадите нешто са подацима
ОК, за сада није баш узбудљиво, зар не?
У реду је видети уживо NMEA стримове на вашем серверу, али желимо да видимо неке од могућности Node-RED-а.
У следећем примеру, показаћемо вам како да анализирате улазни ток да бисте добили географску ширину и дужину и уцртаћемо локацију уживо на мапи са трагом који приказује старе локације.
Пре свега, обришите свој тренутни ток.
Кликните на горњи десни мени > Управљање палетом > Инсталирај > потражите node-red-contrib-web-worldmap и инсталирајте га.
Вратите се у мени > Увоз > Међуспремник и налепите следећи код:
[
{
"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": []
}
]
Требали бисте видети нешто овако:
Двапут кликните на чвор светске мапе.
У падајућем менију листе мапа изаберите OpenStreetMap или други слој, кликните на Готово:
Притисните Развити дугме.
Овде можете приступити мапи уживо из вашег прегледача:
172.123.123.123:1880/мапа света/
где IP адреса мора бити иста као и адреса вашег сервера.
Видећете мапу са маркером који приказује локацију вашег ГНСС пријемника, ажурирајући се у реалном времену, можете је увећавати/умањивати по жељи.
Препоручујемо вам да погледате сваки од чворова на вашем току како бисте боље разумели шта раде, изменили их и видели шта се мења.
Наћи ћете мноштво туторијала, а АИ алати ће вам такође помоћи ако желите да урадите нешто мало напредније.
Забавите се!
Ако желите да искључите Node-RED, урадите следеће:iptables -A INPUT -p tcp --dport 2222 -j REJECT
тип ps aux | grep node , пронађите процес чвора ако је и зауставите процес на следећи начин:kill NODE_PROCESS_ID
