Как использовать телефон на 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, то значит соединение не активно (не используется и не прослушивает порт).
Если вы не получаете данных от программы, то в настройках Share GPS включите опцию «Create NMEA».
Проверка поступающих 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, либо вам удалось успешно работать с такими виртуальными устройствами в каких-либо программах, то просьба написать об этом в комментариях.
Для того, чтобы устройство /dev/ttyUSB0 было доступно пользователям без повышенных прав, выполните следующую команду:
sudo chown $USER /dev/pts/1
Смотрите также: Как пользоваться командой chown для смены владельца и группы файла в Linux
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 и получать текущие координаты независимо от телефона, то вы можете выбрать любое из следующих устройств, благо цены на них невысокие:
- BEITIAN BS-71U (поддерживает NMEA-0183)
- BEITIAN BS-70U (поддерживает NMEA-0183)
- BN-808 USB GPS Receiver (поддерживает NMEA-0183)
- BT-708 GPS Receiver (поддерживает NMEA-0183)
- BU353S4 (поддерживает NMEA-0183)
- VK-172
- VK-162
- gps usb receiver
Автоматический запуск службы 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
Связанные статьи:
- Как подменить своё реальное нахождение для приложений в телефоне (53.4%)
- Выбор компьютера и операционной системы для хакера (50.4%)
- Как из Windows просмотреть содержимое диска Linux и скопировать с него файлы (50.4%)
- Linux на флешке: установка и другие подсказки по использованию Linux на USB носителях (50.4%)
- Как в Linux взламывать пароли видеокартой и центральным процессором (50.4%)
- Установка Kali Linux (RANDOM - 7.4%)
Спасибо за статью.
На Android использовал это GPSd Client
https://f-droid.org/ru/packages/io.github.tiagoshibata.gpsdclient/
https://github.com/tiagoshibata/Android-GPSd-Client