Как использовать телефон на Android в качестве GPS сенсора в Linux

Обычно настольные компьютеры и ноутбуки продаются без GPS чипа. Это можно объяснить тем, что стационарному устройству не нужно определять координаты. Тем не менее имеется несколько специализированных приложений, для которых нужен GPS, например: составление списка Точек Доступа Wi-Fi с их точными координатами. Конечно, можно купить внешний GPS приёмник, который обойдётся вам буквально в несколько долларов (от трёх долларов вместе с доставкой). Но есть ещё более бесплатный вариант — использовать GPS сенсор вашего телефона Android.

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

Протокол NMEA и демон GPS приёмников

Начнём с небольшой матчасти.

Как следует из Википедии:

NMEA 0183 (от «National Marine Electronics Association») — стандарт определяющий текстовый протокол связи морского (как правило, навигационного) оборудования (или оборудования, используемого в поездах) между собой. Стал особенно популярен в связи с распространением GPS-приёмников, использующих этот стандарт.

Говоря простым языком, NMEA это способ передачи координат и другой сопутствующей информации в виде специально организованных данных, передающихся в виде простого текста. Пример строк NMEA:

$GPGGA,042554.000,1227.4487,N,09958.6233,E,1,24,0.4,-0.6,M,-25.8,M,,*55
$GPGLL,1227.4487,N,09958.6233,E,042554.000,A,A*5B
$GPVTG,148.6,T,,M,0.0,N,0.0,K,A*06
$GPGSV,3,1,09,02,24,116,35,05,15,050,30,13,33,033,35,15,65,006,32*75
$GPGSV,3,2,09,20,16,295,35,21,21,328,32,24,37,155,40,25,10,213,38*7E
$GPGSV,3,3,09,29,63,257,33*4E
$GLGSV,2,1,05,66,14,021,27,67,42,330,28,81,78,124,14,82,43,340,28*69
$GLGSV,2,2,05,88,29,149,35*51
$BDGSV,4,1,13,201,42,103,29,203,74,126,30,204,21,097,37,206,68,014,26*63
$BDGSV,4,2,13,207,14,160,33,208,56,077,35,209,76,251,23,210,17,187,33*62
$BDGSV,4,3,13,213,61,021,31,214,18,265,32,216,74,359,29,221,41,358,26*69
$BDGSV,4,4,13,222,09,043,28*6C
$GPGSA,A,3,15,29,24,13,02,21,20,05,25,,,,0.8,0.4,0.6*32
$GNGSA,A,3,66,67,82,88,,,,,,,,,0.8,0.4,0.6*2D
$BDGSA,A,3,204,206,207,208,209,210,213,214,216,221,222,,0.8,0.4,0.6*1D
$GPRMC,042554.000,A,1227.4487,N,09958.6233,E,0.0,148.6,301019,,,A*6D
$PSAMCLK,2077,27517200,24,9693359,70115239,275172000*4F
$GPGGA,042555.000,1227.4487,N,09958.6233,E,1,24,0.4,-0.6,M,-25.8,M,,*54
$GPGLL,1227.4487,N,09958.6233,E,042555.000,A,A*5A
$GPVTG,148.6,T,,M,0.0,N,0.0,K,A*06
$GPGSV,3,1,09,02,24,116,35,05,15,050,30,13,33,033,35,15,65,006,32*75
$GPGSV,3,2,09,20,16,295,35,21,21,328,32,24,37,155,40,25,10,213,38*7E
$GPGSV,3,3,09,29,63,257,33*4E
$GLGSV,2,1,05,66,14,021,27,67,42,330,28,81,78,124,13,82,43,340,28*6E
$GLGSV,2,2,05,88,29,149,35*51
$BDGSV,4,1,13,201,42,103,29,203,74,126,30,204,21,097,37,206,68,014,26*63
$BDGSV,4,2,13,207,14,160,33,208,56,077,35,209,76,251,23,210,17,187,33*62
$BDGSV,4,3,13,213,61,021,31,214,18,265,32,216,74,359,29,221,41,358,26*69
$BDGSV,4,4,13,222,09,043,28*6C
$GPGSA,A,3,15,29,24,13,02,21,20,05,25,,,,0.8,0.4,0.6*32
$GNGSA,A,3,66,67,82,88,,,,,,,,,0.8,0.4,0.6*2D
$BDGSA,A,3,204,206,207,208,209,210,213,214,216,221,222,,0.8,0.4,0.6*1D
$GPRMC,042555.000,A,1227.4487,N,09958.6233,E,0.0,148.6,301019,,,A*6C
$PSAMCLK,2077,27517300,24,9693366,70176767,275173000*48
$PSAMDLOK,88,0x00F,0x000*59
$PSAMDLOK,152,0x3FF,0x000*1A
$PSAMDLOK,67,0x00F,0x000*58
$PSAMDLOK,160,0x3FF,0x000*1B
$PSAMDLOK,82,0x00F,0x00F*25
$PSAMDLOK,66,0x000,0x00F*59
$PSAMDLOK,159,0x3F8,0x3FF*6C
$GPGGA,042556.000,1227.4487,N,09958.6233,E,1,24,0.4,-0.6,M,-25.8,M,,*57
$GPGLL,1227.4487,N,09958.6233,E,042556.000,A,A*59
$GPVTG,148.6,T,,M,0.0,N,0.0,K,A*06
...........................................
...........................................
...........................................
...........................................
...........................................

Именно с использованием этого протокола мы будем отправлять GPS координаты с телефона на компьютер.

gpsd — это интерфейс демона для GPS приёмников. Дело в том, что GPS приёмники выводят данные в самом разном виде: некоторые из них поддерживают протокол NMEA, а некоторые используют свои собственные бинарные форматы. Если бы программы напрямую работали с GPS приёмниками, то каждой бы из них нужно было реализовывать поддержку каждого устройства. Для упрощения этой ситуации и используется gpsd, эта служба прослушивает входящие данные с GPS приёмников, причём поддерживает множество форматов и устройств. Служба gpsd автоматически определяет формат входящих данных, распознаёт их и делает доступными на сокете tcp://localhost:2947 (порт можно изменить в настройках) для любых программ в операционной системе. То есть если нужно, чтобы программа умела получать поток GPS данных, то достаточно в ней реализовать получение данных от tcp://localhost:2947 и понимание формата gpsd, и после этого программа сможет работать с большинством GPS приёмников!

В моём дистрибутиве следующие типы драйверов скомпилированы в gpsd:

				NMEA0183
				Ashtech
				Delorme TripMate
				Pre-2003 Delorme EarthMate
				Furuno Electric GH-79L4
n				Garmin NMEA
		c		MTK-3301
				OceanServer OS5000
				San Jose Navigation FV18
	b			True North
		c		Jackson Labs Fury
			*	AIVDM
n	b	c	*	EverMore
n			*	Garmin Serial binary
			*	Garmin USB binary
n	b		*	GeoStar
	b		*	GREIS
			*	iTalk
			*	Motorola Oncore
	b		*	Navcom NCT
n	b		*	SiRF
			*	Skytraq
n	b		*	SuperStarII
n	b		*	Trimble TSIP
				iSync
n	b	c	*	u-blox
	b		*	Zodiac
			*	NMEA2000
			*	RTCM104V2
			*	RTCM104V3
			*	Garmin Simple Text
			*	JSON slave driver
				PPS

Условные обозначения:

  • n: переключатель режимов
  • b: переключатель скорости
  • c: переключатель темпа
  • *: тип пакетов не-NMEA

Включённые возможности:

  • Экспорт сокетов
  • Экспорт совместной памяти
  • Экспорт DBUS
  • Функции службы времени
  • PPS

Как можно увидеть, многие устройства передают типы пакетов отличные от NMEA. Для некоторых устройств реализованы дополнительные функции подстройки переключения режима, скорости и темпа.

Как можно передать GPS данные на компьютер в реальном времени

Есть разные способы передавать данные от телефона в компьютер:

  • Bluetooth
  • USB
  • по сети (Wi-Fi, Интернет)

Самый простой способ — по сети. Bluetooth и USB требуют дополнительной настройки.

Для передачи по сети нужно, чтобы у телефона был доступный с компьютера IP адрес — в локальной сети Wi-Fi это довольно просто. Если же вы вдалеке от Wi-Fi роутера, то можно использовать в качестве Точки Доступа сам телефон — в этом случае он также будет доступен по IP с ноутбука. Даже если телефон далеко от компьютера, он всё равно может передавать GPS данные не имея белого IP — но для этого нужно, чтобы оба устройства были подключены к одной VPN.

Программы для передачи GPS с телефона на компьютер

Следующая таблица взята отсюда. Я не знаю, насколько она актуальная — вполне возможно, что когда я это пишу и уж тем более когда вы это читаете, появились новые программы для этой функции — кстати, пишите их в комментариях, если вы знаете другие программы.

Имя Через TCP порт Лицензия
ShareGPS Bluetooth, USB 50000 бесплатная
BlueNMEA Bluetooth, USB 4352 бесплатная
Solidsync Network/Bluetooth GPS Bluetooth, Wifi 25010 2.99 USD
Symarctic ExtGPS Bluetooth   бесплатная
Bluetooth GPS Output Bluetooth   пробный период 10 минут или 0.92 USD
GPS 2 Bluetooth v.4 Bluetooth   бесплатная, просто виджет

Я буду использовать программу Share GPS — просто потому, то она шла первой по списку и у меня с ней всё получилось. Хотя нужно отметить, программа скорее условно бесплатная: бесплатно можно создать только одно подключение, к этому одному подключению может подсоединиться только одно устройство, некоторые продвинутые функции доступны только в премиум версии. Но для наших целей бесплатных возможностей предостаточно.

Как узнать IP адрес телефона

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

Если ваш телефон и компьютер находятся в одной локальной сети, например, подключены к одному роутеру по Wi-Fi, либо телефон подключён по Wi-Fi, а ноутбук по проводу, то локальный IP телефона можно посмотреть перейдя в свойства Wi-Fi подключения:

Если вы находитесь вдали от роутера, то вы можете использовать телефон как Точку Доступа — в этом случае:

  • телефон и ноутбук окажутся вновь в одной локальной сети
  • ноутбук сможет использовать Интернет подключение телефона (например, для загрузки карт)

В этом случае, самый простой способ у знать IP адрес телефона, это выполнить команду на ноутбуке:

ip route show default

Пример вывода:

default via 192.168.43.1 dev wlo1 proto dhcp metric 20600

То есть телефон в этой ситуации выступает в качестве роутера и предыдущей командой мы посмотрели IP адрес этого роутера, который оказался 192.168.43.1.

Как настроить Share GPS

На вкладке GPS STATUS вы можете просмотреть текущий статус и координаты GPS.

Переходим в CONNECTIONS и нажимаем кнопку ADD

Снимаем галочку Setup by Activity

Кликаем на Data Type

и выбираем Standard NMEA format

Нажимаем OK.

Нажимаем на Connection Method и выбираем Use TCP/IP to send NMEA GPS to PC. The IP addresses of the devices are known:

Придумываем и вводим любое имя для подключения:

Нажимаем кнопку NEXT.

Здесь можно изменить порт, который по умолчанию установлен на 50000. Меня устраивает стандартный порт, поэтому я просто нажимаю OK.

Когда всё готово, нажмите на подключение, чтобы активировать его. Если подключение перешло в статус Listening, значит ваш телефон готов для отправки GPS информации. Если статус Idle, то значит соединение не активно (не используется и не прослушивает порт).

Проверка поступающих GPS данных по протоколу NMEA

На самом деле, телефон будет работать как простейший веб-сервер, который будет отправлять поток данных в виде простого текста. Поэтому работу можно проверить, к примеру, командой curl (укажите IP вашего телефона, а также укажите правильный порт, если вы изменили порт по умолчанию, либо используете другую программу):


curl 192.168.1.3:50000

Предыдущая команда завершилась ошибкой:

curl: (1) Received HTTP/0.9 when not allowed

Для исправления этой ошибки просто добавьте к вашей команде опцию --http0.9:

curl --http0.9 192.168.1.3:50000

Если пошёл поток данных, значит всё работает.

На телефоне статус поменялся на Connected.

Как запустить gpsd для получения GPS с телефона

Останавливаем предыдущую команду cURL, если вы этого ещё не сделали, поскольку в бесплатном варианте программа разрешает только одно подключение.

Теперь нужно установить gpsd.

В Debain, Kali Linux, Linux Mint, Ubuntu и их производные установка делается следующей командой:

sudo apt install gpsd gpsd-clients

В Arch Linux, BlackArch и их производные установка делается так:

sudo pacman -S gpsd

Для запуска gpsd используйте команду (в ней замените IP адрес и порт на свои значения):

gpsd -N tcp://192.168.1.3:50000

Опция -N нужна для того, чтобы служба не уходила в фон (не превращалась в демона). После отладки, когда вы убедитесь, что всё работает, опцию -N можно не использовать.

Если что-то не так — программа сразу завершает работу, либо работает, но в дальнейшем другие приложения не получают GPS информацию, то используйте опцию -D, после которой укажите число для увеличения уровня вербальности. Например, -D 1 для краткого вывода информации или -D 10 для очень подробного вывода:

gpsd -N -D 10 tcp://192.168.1.3:50000

Как проверить, работает ли gpsd

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

gpsmon

Эта программа будет показывать координаты, время, скорость, статус и другую сопутствующую информацию.

Карта на Linux для GPS. Запись трека движения на Linux по GPS

В качестве приложения, которое принимает GPS координаты и показывает расположение на карте, а также записывает путь движения, я буду использовать FoxtrotGPS — лёгкое и быстрое картографическое приложение.

FoxtrotGPS — это простое в использовании бесплатное приложение GPS/GIS с открытым исходным кодом, которое хорошо работает на небольших экранах и особенно подходит для сенсорного ввода. FoxtrotGPS находится в свободном доступе для публичного использования, распространения и изменения в соответствии с условиями GNU General Public License 2.0 (GPLv2).

Для установки FoxtrotGPS в Debain, Kali Linux, Linux Mint, Ubuntu и их производные выполните команду:

sudo apt install foxtrotgps

Для установки foxtrotgps в Arch Linux, BlackArch и их производные выполните команды:

gpg --recv-keys 894EF3C0A2C08D8B
git clone https://aur.archlinux.org/foxtrotgps.git
cd foxtrotgps/
makepkg -si

Запускаем программу:

foxtrotgps

Если служба gpsd запущена, то программа сразу покажет ваше расположение:

Меню программы:

1. Настройки

2. Полноэкранный режим (F11)

3. Увеличение карты

4. Уменьшение карты

5. Автоцентр на вашем расположении

6. Следующий репозиторий карт (поддерживается сразу несколько бесплатных карт!)

7. Предыдущий репозиторий карт

8. Включить запись маршрута

Настройка FoxtrotGPS

На первой вкладке настроек показывается

  • текущая скорость
  • средняя скорость
  • максимальная скорость
  • длина пути
  • время записи трека
  • данные GPS (координаты и время)
  • количество видимых спутников

На следующей вкладке можно включить или отключить запись маршрута. Если нажать кнопку Split, то запись продолжится в новый файл.

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

Карта по умолчанию в FoxtrotGPS выглядит так:

В FoxtrotGPS вы можете выбрать спутликовый вид от Google:

Ещё есть такой вариант:

А одна из карт показывает на водяных знаках необходимость использовать API:

Симуляция работы GPS приёмника

Некоторые программы, например, Google Earth, по известным только им причинам не работают с GPSD — они пытаются сканировать систему в поисках приёмника GPS.

Примеры таких устройств:

  • /dev/ttyS0 (serial device)
  • /dev/ttyUSB0 (USB устройства)
  • /dev/gpsd0 (Generic GPS device 0)

Вы можете имитировать работу таких устройств с помощью socat командами вида (IP, номера портов, а также номера устройств меняйте на свои):

sudo socat pty,link=/dev/ttyS0,raw tcp:192.168.1.3:50000
sudo socat pty,link=/dev/ttyUSB0,raw tcp:192.168.1.3:50000

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

sudo cat /dev/ttyUSB0

Но Google Earth у меня так и не заработала.

Если вы увидели какую-то ошибку в моих командах socat, либо вам удалось успешно работать с такими виртуальными устройствами в каких-либо программах, то просьба написать об этом в комментариях.

GPS в Bettercap

По умолчанию Bettercap использует устройство /dev/ttyUSB0 (можно поменять в настройках). Для того, чтобы симулировать будто бы GPS информация приходит от устройства /dev/ttyUSB0, запускаю следующую команду:

sudo socat pty,link=/dev/ttyUSB0,raw tcp:192.168.1.3:50000

Затем запускаем Bettercap

sudo bettercap

Внутри сессии Bettercap включаем GPS модуль и выводим текущие координаты:

gps on; sleep 5; gps.show

На моей системе эта команда успешно вывела информацию о координатах, качестве и количестве видимых спутников.

latitude:12.457478 longitude:99.977055 quality:1 satellites:24 altitude:-0.600000

GPS в Kismet

Kismet стала известной как программа для сбора информации о беспроводных точках доступа, в том числе с их привязкой к GPS координатам. В настоящее время программа бурно развивается и поддерживает множество источников радиосигналов, в том числе:

  • Wi-Fi
  • Bluetooth
  • SDR

Kismet может работать с разными источниками GPS, в том числе напрямую с GPS ресиверами или получая данные по сети.

Поддерживаемые типы GPS:

  • serial
  • tcp
  • gpsd
  • web
  • virtual

Пример настройки для получения данных от последовательного устройства:

gps=serial:device=/dev/ttyACM0,reconnect=true,name=LaptopSerial

Пример настройки для получения данных непосредственно из сети (можно подключиться к телефону вместо GPSD и получать поток GPS координат):

gps=tcp:host=192.168.1.3,port=50000

Пример настройки для считывания данных от GPSD службы:

gps=gpsd:host=localhost,port=2947,reconnect=true

Боле подробная информация на странице: https://www.kismetwireless.net/docs/readme/gps/

GPS приёмники для ноутбука

Если вам нужен внешний GPS приёмник для вашего ноутбука или компьютера, который вы можете подключить по USB и получать текущие координаты независимо от телефона, то вы можете выбрать любое из следующих устройств, благо цены на них невысокие:

Автоматический запуск службы GPSD с опциями и на определённом устройстве

При желании, вы можете выполнить настройку службы GPSD в файле /etc/default/gpsd:

# Default settings for gpsd.
START_DAEMON="true"
GPSD_OPTIONS=""
DEVICES=""
USBAUTO="true"

Укажите опции как значение GPSD_OPTIONS, а желаемое устройство, в том числе вида tcp://*, укажите в качестве значения DEVICES.

Для запуска в фоне службы:

sudo systemctl start gpsd.service

Для включения автоматического запуска gpsd при каждой загрузке компьютера:

sudo systemctl enable gpsd.service

Рекомендуется Вам:

One Comment to Как использовать телефон на Android в качестве GPS сенсора в Linux

Добавить комментарий

Ваш e-mail не будет опубликован.