Обновление (10 / 08 / 2026): У нас есть большой запас всех наших продуктов, найти нас также в и    Как получить расценки

Как настроить сервер Node-RED для удаленного приема NMEA

Технология GNSS RTK может использоваться во многих приложениях. Обычно для этого производятся измерения, которые затем экспортируются на компьютер для анализа данных. Это наиболее распространенный случай.
Однако для некоторых приложений вам может потребоваться отправлять данные GNSS RTK на ваш компьютер/сервер в режиме реального времени, чтобы вы могли немедленно предпринять действия, не дожидаясь нескольких часов, пока обработаются данные.

К популярным приложениям, требующим отправки данных о местоположении в режиме реального времени на сервер, относятся: управление автопарком и логистика, заказ поездок и общественный транспорт, отслеживание активов, мониторинг дикой природы и т. д.

В этом уроке мы объясним, как настроить сервер с помощью Node-RED, популярного инструмента для визуального программирования, чтобы вы могли начать свой собственный проект, а также рассмотрим, как настроить приемник GNSS и плагин для отправки данных на этот сервер.

Требуемое оборудование

  • Удаленный сервер Linux
    Хотя в нашем примере мы будем использовать вышеизложенное, вы также можете запустить Node-RED локально на машине Windows/Linux, на RaspberryPi, Docker, Android, Cloud и т. д.
  • Android smartphone
  • RTK Portable Bluetooth Kit
  • В качестве альтернативы можно использовать любой другой приемник GNSS с 4G NTRIP Master, WiFi NTRIP Master or Ethernet NTRIP Master плагины

Необходимое программное обеспечение

  • GNSS Master приложение для Android

Установка Node-RED

Удаленный сервер Linux

В нашем случае мы используем дистрибутив 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 — это IP-адрес вашего сервера.
Если все в порядке, вы должны увидеть что-то вроде этого:

Подготовьте свой первый поток

В Node-RED проекты называются потоками.
Мы подготовим новый поток для прослушивания входящих TCP-соединений и вывода всего полученного в окно отладки.

Найдите на левой панели узел, называемый TCP в, перетащите его на холст потока.
Искать также отлаживать узел и соедините их вместе следующим образом:

В Node-RED проекты называются потоками.
Мы подготовим новый поток для прослушивания входящих TCP-соединений и вывода всего полученного в окно отладки.

Найдите на левой панели узел, называемый TCP в, перетащите его на холст потока.
Искать также отлаживать узел и соедините их вместе следующим образом:

Дважды щелкните по узлу TCP и задайте порт TCP, который вы хотите прослушивать, в этом примере: 2222.
Также установите для потоковой передачи строк, разделенных \r\n.

После этого нажмите кнопку «Развернуть» в правом верхнем углу экрана.
Эта кнопка запустит блоки после любого изменения.

Подключите ваш GNSS-приемник к Node-RED

RTK Portable Bluetooth Kit с устройством Android

  1. Подключите портативный комплект Bluetooth к устройству Android через Bluetooth.
  2. Открыто GNSS Master приложение, подключитесь к модулю BT в разделе «Подключение приемника GNSS».
  3. При необходимости задайте корректирующий ввод.
  4. В разделе «Вывод данных приёмника» выберите «TCP-клиент» и введите IP-адрес сервера в поле «TCP-адрес» и 2222 в поле «TCP-порт». Нажмите «Подключиться».
  5. Вот и все, если дважды щелкнуть по окну отладки в Node-RED, то вы должны увидеть что-то вроде этого со всеми полученными данными:

Другие GNSS-приемники с модулями 4G, WiFi или Ethernet

Если у вас есть другой приемник GNSS, вы также можете добиться тех же результатов, даже без устройства Android.
Убедитесь, что сообщения, которые вы хотите отправить на сервер, выводятся на COM-порт плагина XBee; обычно рекомендуется отправлять как минимум сообщения в формате NMEA GGA.

Затем настройте 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)}<br>Lon: ${lon.toFixed(6)}<br>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://<host>:1880/worldmap",
    "info": "",
    "x": 330,
    "y": 90,
    "wires": []
  }
]

    
   

Вы должны увидеть что-то вроде этого:

Дважды щелкните узел карты мира.
В раскрывающемся списке «Карта» выберите OpenStreetMap или другой слой, нажмите «Готово»:

Нажмите Развертывание .
Доступ к карте в реальном времени можно получить из браузера здесь:
172.123.123.123:1880/карта мира/
где IP-адрес должен совпадать с адресом вашего сервера.

Вы увидите карту с маркером, указывающим местоположение вашего GNSS-приемника, обновляющуюся в режиме реального времени. Вы можете увеличивать/уменьшать масштаб по своему усмотрению.

Мы рекомендуем вам взглянуть на каждый из узлов в вашем потоке, чтобы лучше понять, что они делают, изменить их и увидеть, что меняется.

Вы найдете множество обучающих программ, а инструменты искусственного интеллекта также помогут вам, если вы захотите сделать что-то более продвинутое.

Удачи!

Если вы хотите завершить работу Node-RED, выполните следующие действия:
iptables -A INPUT -p tcp --dport 2222 -j REJECT

напишите ps aux | grep node , найдите процесс узла if и завершите процесс с помощью:
kill NODE_PROCESS_ID

РТК-помощник

Найдите лучшие товары для вашего применения, задав всего несколько вопросов.

Если вам понравился этот контент, вы можете подписаться на нас в Twitter, YouTube, Facebook or LinkedIn чтобы оставаться в курсе подобного контента.

Есть вопросы или пожелания?
Связаться с нами! Мы ответим <24 часов!

Контакты ArduSimple
Закрыто

Получите доступ к своему аккаунту и заказам.

Or

ArduSimple – Высокоточное RTK-оборудование и решения для геодезических работ, упрощенные в использовании

Хотите узнать больше о GPS и RTK?

Если вы сейчас заняты, наши инженеры могут отправить вам 3 коротких электронных письма, в которых подробно объяснят все, что вам нужно знать для начала вашего проекта.