Как использовать телефон на Android в качестве GPS сенсора в Linux. Часть 1
Life-Hack [Жизнь-Взлом]/ХакингОбычно настольные компьютеры и ноутбуки продаются без 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 с телефона на компьютер
Следующая таблица взята отсюда. Я не знаю, насколько она актуальная — вполне возможно, что когда я это пишу и уж тем более когда вы это читаете, появились новые программы для этой функции — кстати, пишите их в комментариях, если вы знаете другие программы.

Я буду использовать программу 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
Эта программа будет показывать координаты, время, скорость, статус и другую сопутствующую информацию.

Продолжение следует...