Спільне використання сирих 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-приймача
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, але має бути актуальною для інших ОС.
- Встановіть TruePort.
- Додайте адаптер TruePort через Management Tool, вказавши IP вашого OpenWrt.
- В Management Tool відкрийте порт → Configuration → Settings.
- Встановіть “Initiate connection to device server” з портом 2001 (чи іншим).
- На вкладці Advanced зніміть галочку “Send keepalive packets”.
- У диспетчері пристроїв → властивості порту → швидкість: 4800.
- Також у диспетчері → “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 — поганий протокол і що з цим робити]