Table of Contents

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

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

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

Підготовка

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

Необхідні пакети

ПК-клієнт

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

Налаштування

Налаштування GPS-приймача

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! Передайте цей порт вашій картографічній програмі.

Вирішення проблем

Примітки