Спільне використання сирих GPS-даних NMEA в мережі з кількома клієнтами

Хоча в репозиторії OpenWrt є програми, такі як gpsd для роботи з GPS-приймачами, іноді ви можете бути обмежені у використанні програм, які можуть обробляти лише сирі дані NMEA 0183 через послідовний порт. Ця стаття покаже вам, як надати ваш GPS-приймач з сирими NMEA повідомленнями, застарілим програмам, таким як Microsoft MapPoint.

Для окремих користувачів використання пакету ser2net, який вже міститься в репозиторії OpenWrt, може бути більш доцільним. У цій статті розглядається саме спільне використання даних у режимі лише для читання з кількома клієнтами.

Вам знадобиться пристрій OpenWrt з сумісним послідовним, UART або USB-портом, що дозволяє обмін даними з GPS-приймачем. Також має бути причина використовувати сирі NMEA-дані, інакше ви б не читали цю статтю.

  • netcat (nc з Busybox не вміє слухати порти)
  • coreutils-stty (для встановлення швидкості послідовного порту)

На клієнтському комп’ютері вам знадобиться програмне забезпечення для створення віртуального послідовного порту. Компанія Perle пропонує безкоштовне ПЗ для майже всіх операційних систем, доступне тут: TruePort.

GPS-приймачі передають велику кількість речень, але всі дані про місцезнаходження містяться в рядку GPGGA. Вам потрібно знати і/або налаштувати частоту надсилання цього “речення” (раз на секунду, двічі на секунду...) і, якщо можливо, вимкнути інші “речення”. Garmin надає ПЗ для налаштування своїх пристроїв на своєму вебсайті.

Ви також можете протестувати частоту через наступні команди, припустимо ваш пристрій знаходиться на /dev/ttyS0:

stty -F /dev/ttyS0 4800 sane
cat /dev/ttyS0

Запустіть на ~10 секунд, порахуйте кількість GPGGA рядків, поділіть на кількість секунд — отримаєте частоту.

Потрібно створити щонайменше три скрипти: один для зчитування сирих даних, один для їх очищення та окремий скрипт для кожного клієнта, який підключатиметься.

Перший скрипт зчитує сирі GPS-дані у файл в /tmp:

/root/gpspullraw.sh

#!/bin/sh

stty -F /dev/ttyS0 4800 sane
cat /dev/ttyS0 > /tmp/gpsdata-raw.txt

Цей файл не можна напряму передавати у netcat, бо ПО очікує CRLF, а тут лише LF. Тому треба “очистити” файл у формат, який сприйматимуть інші пристрої. Якщо ваш GPS передає лише GPGGA з частотою 1Hz, цей скрипт підійде:

/root/gpscleanraw.sh

#!/bin/sh
## чекаємо, поки raw-дані з’являться
while [ ! -e /tmp/gpsdata-raw.txt ]
do
  sleep 1
done

while true
do
  tail -n5 /tmp/gpsdata-raw.txt | grep -v "^$" | tail -n1 | tr '\n' '\r' >> /tmp/gpsdata-clean.txt
  echo -n -e '\n' >> /tmp/gpsdata-clean.txt
  sleep 1
done

Якщо ваш GPS передає більше ніж GPGGA, збільшіть перший tail, щоб включити останній GPGGA, і додайте `grep GPGGA`. Якщо передає двічі на секунду — другий tail поставте на 2. Якщо рідше — збільшіть sleep. Повторювати “речення” не варто, але й втрачати їх теж.

Останній крок — надати зовнішнім користувачам доступ до цих даних через netcat у циклі. Оберіть порти, наприклад 2001, 2002…

/root/gps2001.sh

#!/bin/sh
## чекаємо на появу очищених даних
while [ ! -e /tmp/gpsdata-clean.txt ]
do
  sleep 1
done

while true
do
  /usr/bin/tail -f /tmp/gpsdata-clean.txt | netcat -l -p 2001
done

Цикл потрібен, бо netcat завершує роботу після закриття сокета. Netcat також припиняє слухати порт після підключення, тому створіть окремий скрипт для кожного клієнта на різних портах. З міркувань безпеки ви можете обмежити, до яких IP прив’язується netcat.

Зробіть скрипти виконуваними та додайте до автозапуску:

/etc/rc.local (додайте перед `exit 0`)

/root/gpspullraw.sh &
/root/gpscleanraw.sh &
/root/gps2001.sh &

Процедура описана для Windows 7 x64, але має бути актуальною для інших ОС.

  1. Встановіть TruePort.
  2. Додайте адаптер TruePort через Management Tool, вказавши IP вашого OpenWrt.
  3. В Management Tool відкрийте порт → Configuration → Settings.
  4. Встановіть “Initiate connection to device server” з портом 2001 (чи іншим).
  5. На вкладці Advanced зніміть галочку “Send keepalive packets”.
  6. У диспетчері пристроїв → властивості порту → швидкість: 4800.
  7. Також у диспетчері → “Advanced” → поставте галочку “Use FIFO Buffers”.

Тепер у вас є послідовний порт, що транслює GPS-дані з OpenWrt! Передайте цей порт вашій картографічній програмі.

  • Перевірте правильність налаштування швидкості (тут: 4800).
  • Перевірте `cat /dev/ttyS0` — чи є NMEA-дані.
    • Якщо порожньо — можливо, TX і RX переплутано. Спробуйте Null Modem-кабель.
    • TTL ≠ Serial. UART-порт потребує особливого підключення.
  • Спробуйте підключитися Telnet-ом до порту 2001.
  • Відкрийте в PuTTY новий COM-порт — чи є потік GPS-даних.
  • Дані зберігаються в /tmp — можливий крах при переповненні ramdisk. Це рішення призначене для роботи протягом кількох днів. Щоб час від часу очищати та перезапускати скрипти, використовуйте etc/crontabs/root.
  • Не протестовано з USB-приймачами або нестандартними baud rate. Результати можуть відрізнятися — оновіть цю сторінку, якщо протестуєте.
  • [http://esr.ibiblio.org/?p=801 Чому NMEA 0183 — поганий протокол і що з цим робити]
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2025/05/31 21:24
  • by vazaz