Gps определение порта android

Передача GPS данных(NMEA) с Android на Windows

Введение

Под windows имеются приложения, которые нуждаются в NMEA сообщениях от GPS устройства, передаваемых по COM порту. Под Android’ом же есть возможность с помощью API генерировать подобные сообщения. В целом была идея доставить данные на виртуальный COM порт с Android’a. Если вам интересно как это удалось реализовать, прошу под кат.

Что же надо было сделать?

Реализовать требовалось следующее:

  • Настроить TCP/IP соединение между устройством и ПК
  • Получить NMEA данные на Android’e
  • Передать их по UDP протоколу на компьютер
  • Принять на компьютере UDP пакет и отправить его на COM порт

TCP/IP соединение

Соединение было организовано с помощью Revers wired tether, для этого на телефоне были, получены права root и с помощью программки android-wired-tether было создано TCP/IP подключение к ПК. Почему же не по WiFi? Да, такая возможность есть, можно на windows 7 создать виртуальный WiFi адаптер и к нему уже подключится с Android’a. Но мой адаптер Atheros AR5B95 через 5 минут подключения уводил систему в синий экран, поэтому и было решено создать подключение все же по проводу + по нему еще и зарядка устройства происходит, что не мало важно при работе GPS(оно прожорливо в плане питания).

NMEA данные с Android, получение и отправка

Данные на Android получались следующим кодом:
//NMEA listener
LocationManager LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new LocationListener() <
@Override
public void onLocationChanged(Location loc) <>
@Override
public void onProviderDisabled(String provider) <>
@Override
public void onProviderEnabled(String provider) <>
@Override
public void onStatusChanged(String provider, int status,Bundle extras) <> >);

LM.addNmeaListener(new GpsStatus.NmeaListener() <
public void onNmeaReceived(long timestamp, String nmea) <
SendNmea2UDP(nmea);
>>);

И передавались в метод SendNmea2UDP который отправлял их на UDP порт ПК:
public void SendNmea2UDP(String nmeastring)
<
message = nmeastring;
msg_length=message.length();
messageB = message.getBytes();
nmeapacket = new DatagramPacket(messageB, msg_length,local,server_port);
try
<
socket.send(nmeapacket);
>
catch(Exception e) <>
>

NMEA данные на ПК

Для получения данных и отправку их на COM порт со стороны компьютеры, было на C# написано простенькое приложение.
С помощью программки Virtual Serial Ports Emulator, было создано два связанных виртуальных COM порта, на один из которых приходили данные от программы на ПК, а на втором виртуальном COM порту их уже можно принимать любым положением, которое в них нуждается.

Заключение

Если кому интересен исходный код программ, то он тут на Android и Windows

В итоге можно запустить программу, которая понимает NMEA данные с COM порта:

В низу справа программка, которая принимает UDP с Android’a и передает NMEA далее на виртуальный COM порт. Программка upd2com отправляет на 3 порт, а к примеру в данном случае SASПланета принимает с 4 порта (организовано это с помощью VSPE). Красненькая точка это где я сейчас тестирую все это.
Спасибо за внимание, надеюсь, статья была вам интересна.

Источник

GPS-монитор под андроид «KidsTrack»

Задача: наступает лето, дети все больше времени проводят где-то на улице, и я бы хотел знать, где они находятся. Идеальный вариант — я просто даю им с собой старый андроидный телефон, и затем наблюдаю за ними по карте на большом домашнем мониторе.
В этой статье я расскажу, почему и как я написал свое первое приложение для Андроид с функциями GPS «KidsTrack», и какие открытия при этом сделал. Статья будет полезна тем, кто недавно начал программировать под Android.

Читайте также:  Как форматировать андроид без настроек

Поиски на Google Play выдали мне сотни различных приложений с функциями GPS-мониторов. Я уж начал их было перебирать, но примерно на 2-м десятке я осознал, что затраты времени на выбор могут оказаться вполне сравнимыми с затратами времени на разработку. Ведь мои функциональные требования очень просты:

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

Это все!

Есть еще требования, которые не связаны с функциональностью, но которые не менее важны:

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

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

Одним словом, попробовав несколько приложений из Google Play, я решил написать трекер сам.

Далее, все тривиально: установил Android Studio, нарисовал единственный экран с 3-мя кнопками, написал, как мне казалось, сервис, отладил все в эмуляторе, затем в USB-дебаггере, вроде все заработало.

Но как только попробовал запустить на физическом устройстве — начались сюрпризы. О некоторых из них я хотел бы рассказать.

Сюрпризы управления питанием

Реальные андроид-устройства стремятся отключить себе питание при любой возможности. Постоянно получают питание лишь весьма примитивные системные часы (модуль мобильной связи здесь он не рассматривается). В часах есть регистр(ы), куда посредством AlarmManager можно записать время следующей пробудки процессора телефона. Если процессор не разбудят часы, то он так и будет продолжать спать ничего не делая. Сделано это по простой причине: включенный процессор разрядит батарею за час. Поэтому если надо, чтобы сервис что-то делал раз в минуту, то приемы десктопного программирования вроде Thread.sleep(60000) не подойдут, а вместо этого надо пользоваться AlarmManager, примерно вот так:

В этом примере мы программируем AlarmManager разбудить телефон через 1 минуту, и отправить интент START_ALARM всем приложениям, кто на него подписан.

Прием интентов во всех учебниках осуществляется объектом BroadcastReceiver, однако если нам нужно, чтобы:

  1. телефон пробуждался из глубокого сна
  2. запускал наш сервис,
  3. не засыпал до завершения работы

то BroadcastReceiver не подойдет, и вместо него надо использовать WakefulBroadcastReceiver — этот объект гарантировано не допустит впадения телефона в сон до тех пор, пока не будет вызван метод completeWakefulIntent. Во всяком случае у меня так и не получилось заставить BroadcastReceiver работать надежно на физическом устройстве.

Если ваш сервис теоретически может выходить в интернет через WiFi, то вам необходимо позаботится, чтобы у WiFi-модуля во время соединения тоже было включено питание, так как оно у него отдельное. Если этого не сделать, то бывает трудно понять почему приложение не работает на физическом устройстве: ведь при отладке на эмуляторе или устройстве, подключенном к дебаггеру через USB, питание модуля WiFi не выключается, и все отлично работает. Запретить отключать питание WiFi можно так:

Сюрпризы GPS

В первой версии приложения я сделал определение координат устройства только с использованием провайдера «GPS». И очень было мне удивительно наблюдать на сервере, как более 90% устройств не смогли определить координаты и присылали нули.
Как оказалось, GPS – довольно капризная технология с множеством ограничений, низкой скоростью и непредсказуемой точностью. При использовании традиционной GPS сенсор приемника должен получить данные обо всех GPS-спутниках (а их более 2х десятков), среди всех них выбрать наиболее подходящие, и уже по ним вычислять координаты. Получение данных и перебор могут занимать 5 минут и более, поэтому первый «холодный» старт GPS всегда самый медленный.
Если GPS-приемник имеет часы и помнит прошлые координаты и положения спутников, то он может использовать эти данные для определения тех спутников, к которым можно привязаться в данный момент. Поэтому повторный запуск GPS обычно происходит намного быстрее.
В современных смартфонах первоначальное грубое определение координат может осуществляться по близлежащим передающим сотовым вышкам, что так же позволяет ускорить «холодный старт» GPS. Для использования этого способа требуется разрешение на использование провайдера «network» в Manifest-е, так для определения я координат вышек может использоваться интернет.
Еще одна функция провайдера «network» — определять координаты по видимым WiFi — сетям. Определение осуществляется путем поиска координат видимых в данный момент сетей по их именам и MAC-адресам на серверах Google через интернет. Разумеется, в фоновом режиме и без лишних уведомлений идет и обратный трафик: телефон, когда определил свои координаты по GPS, может по-тихому послать данные об окружающих его WiFi-сетях на серверы Google, чтобы таким образом поддерживать актуальное состояние базы WiFi-сетей. Грустные размышления о потенциальной власти Google над владельцами Андроидов и WiFi-сетей оставим за рамками этой статьи…
Прояснив все эти нюансы я в авральном порядке подправил приложение, чтобы оно использовало не только провайдера «GPS» но и «network». После этого типичная последовательность вызовов метода onLocationChanged стала выглядеть так:

Читайте также:  Как восстановить удаленные файлы с планшета андроид

Я все-таки очень хотел задействовать GPS, так как обычно это самый точный способ, поэтому я установил время ожидания сигнала от GPS-сенсора 30 секундам, а если это первый пуск — 2-м минутам. И если GPS-сенсор так и не сработал, то используются координаты от провайдера «network». После этого изменения устройства стали присылать на сервер нормальные, ненулевые координаты.
Точность GPS также оказалась весьма условной. Например нередко точность координат, получаемых с сенсора неподвижного лежащего устройства может выглядеть так:

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

Отдельно стоит упомянуть питание GPS. Модуль GPS весьма прожорлив, поэтому в учебниках рекомендуют при вызове requestLocationUpdates не устанавливать слишком короткие параметры минимального интервала по времени и по расстоянию. Но в моих опытах с 3-мя различными физическими устройствами оказалось, что постоянно включенный модуль GPS садит батарею одинаково при различных параметрах. Потом уже я нашел где-то упоминание, что эти параметры влияют только на частоту вызова метода onLocationChanged, но не обязательно на энергопотребление самого сенсора.

Прочие сюрпризы

Google Play: Первая версия пролежала на Google Play два дня, после чего была заменена новой, с исправленным алгоритмом определения координат. Несмотря на то, что это произошло уже две недели назад, я на сервере продолжаю видеть, что очень часто продолжают происходить активации старой версии. Я уже и добавил сообщение о необходимости обновления на веб-странице мониторинга, но это не всегда помогает. Непонятно откуда вообще люди берут старую версию. Я не знаю чем это объяснить.

Пользователи: Почти треть пользователей, установивших приложение, никогда не открывала страницу, на которой устройство можно мониторить. Без страницы мониторинга приложение бесполезно, поэтому объяснить это феномен я тоже не могу.

Яндекс.Карты: Страница мониторинга изначально была реализована с использованием API Яндекс.Карт, так как там не требуется ID, и нет ограничений на количество загрузок карты в день. Но оказалось, что на слабых устройствах Яндекс.Карты или тормозят, или вообще не открываются. Пришлось эту страничку делать в 2-х вариантах: Яндекс.Карты для настольных компьютеров, и Google Maps для слабых мобильных устройств. Google Maps оказались существенно быстрее.

Источник

Как проверить работу GPS на Андроид смартфоне

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

Читайте также:  Управляй компьютерам с своего андроида

Для решения этого вопроса есть 2 варианта, простой с использованием приложения, и чуть сложнее с использованием стандартных возможностей вашего смартфона (инженерное меню).

Проверка и настройка GPS с помощью приложения

Исходя их всех приложений, которые мы перепробовали, самым простым и эффективным оказалось GPS Test. Данная программа сможет быстро помочь найти все спутники в вашем регионе, предварительно их настроить и, возможно, использовать другие функции.

Особенности программы GPS Test для Андроида

  • Показывает информацию о видимых спутниках;
  • Показывает активные спутники, используемые в данный момент;
  • Дает точные данные геопозиционирования;
  • Показывает точные координаты;
  • Дает данные о часовом поясе в месте расположения;
  • Указывает на положение спутников в небе;
  • Может служить электронным компасом;
  • Предоставляет самые разные данные, начиная от времени и даты, заканчивая высотой над уровнем моря;
  • Дает информацию о времени восхода и заката в том месте, где расположено устройство.

Как проверить состояние GPS-навигатора с помощью GPS Test

Открываем приложение, и если видим в левом верхнем углу надпись «3D Fix«, значит, навигатор работает корректно и все свои функции выполняет без малейших проблем. Показывает «No Fix«? К сожалению, с устройством неполадки и его слаженная работа невозможна.

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

Показывает «off»? Здесь все проще. Приемник просто отключен. Для его включения проделываем легкую процедуру: открываем «Настройки», переходим в пункт «Местоположение». Открывается новое меню под названием «Услуги определения местоположения». Всего предоставляется три режима:

  1. «По координатам сети»
  2. «Спутники GPS»
  3. Вспомогательные данные.

Для наиболее точного определения места, например, в автомобиле, рекомендуем активировать сразу все пункты. Из сетей лучше всего, конечно, работает Wi-Fi, но если условия этого не позволяют (нахождение на улице и т. д., как это обычно и бывает) — используйте мобильный интернет.

Настройка и регулировка GPS через инженерное меню

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

  1. Для этого необходимо переместиться в инженерное меню. Вводим код (там, где обычно пишем номер абонента) *#*#3646633#*#*;
  2. Далее нужно найти пункт YGPS (или что-то похожее);
  3. В итоге должна появиться карта, на которой будет много желтых точек. Они могут появиться не сразу.

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

Видео-инструкция

Плохая работа GPS спутников в помещении

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

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

Источник

Оцените статью