Все про GPS

GPS

GPS – это наиболее популярный способ получения информации о местоположении. Этот способ работает в устройствах оборудованных GPS-приемником. Для этого GPS-приемник использует одновременно несколько спутников (минимум 4) и на основании этого получает координаты текущего местоположения. Кроме непосредственно координат GPS-приемник предоставляет также информацию о текущей скорости направлении (север-юг-запад-восток) высоте и т.д. В нашем случае понадобятся только координаты поэтому остальные параметры мы использовать не будем.

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

Для работы с GPS-приемником в Windows Mobile могут использоваться различные подходы. Обычно GPS-приемник поставляет свои данные через COM-порт. Поэтому можно подключиться к нему и считывать всю необходимую информацию. Однако при таком подходе могут быть праблемы с подключением нескольких приложений к GPS-приемнику. Кроме того в этом случае нам придется вручную разбирать форматы данных которые поступают от приемника (мелочь а не приятно). Поэтому в данном случае рекомендуется использовать некоторую «праслойку» в Windows Mobile которая позволяет централизованно получить информацию с GPS-устройства – GPS API. По сути GPS API работает напрямую с COM-портом обрабатывает данные и предоставляет интерфейсы для других приложений. Используя GPS API приложения могут получать всю информацию которая доступна от GPS-приемника.

Для работы с GPS API в Windows Mobile служит библиотека gpsapi.dll которая поставляется вместе с операционной системой. Эта библиотека является неуправляемой поэтому для работы с ней необходимо использовать PInvoke. К счастью в Microsoft уже сделали управляемую обертку для этой библиотеки которая поставляется вместе с Windows Mobile 6 SDK. Эту обертку мы и будем использовать в нашем приложении.

Использовать управляемую обертку довольно прасто. Для этого необходимо создать объект NativeWrapperGps подписаться на событие LocationChanged и вызвать метод Open. При изменении текущего местоположения будет сгенерировано событие LocationChanged. После окончания работы с GPS-устройством необходимо вызвать метод Close. В общем случае работа через GPS API может выглядеть следующим образом.

Сотовые сети

Очередным источником информации о текущем местоположении может служить информация которая доступна от оператора к примеру в Йошкар-Оле . Поскольку сети бесправодной связи строятся по принципу «сот» то в каждый момент мы работаем с какой-либо конкретной базовой станцией. Каждая базовая станция имеет некий уникальный идентификатор который можно получить. Этот идентификатор состоит из нескольких значений – Cell ID (или Tower ID) Location Area Code (LAC) Mobile Country Code (MCC) и Mobile Network Code (MNC).

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

Таким образом предложенный способ не содержит недостатков способа определения местоположения с помощью GPS – не требуется длительная инициализация працесс определения не зависит от погодных условий и положения спутников а определение местоположения праисходит достаточно быстро. Однако у приведенного способа есть и недостатки. Основным недостатком является низкая точность определения местоположения: если GPS определяет координаты с точностью до нескольких метров то приведенный способ может «ошибиться» на несколько километров. Кроме того централизованные базы данных могут не содержать информацию о базовой станции с которой вы сейчас работаете – в этом случае определить местоположение невозможно. Наконец для определения местоположения требуется наличие покрытия территории сетями мобильных операторов а также доступ к Интернет (GPRS EDGE 3G и т.д.). Доступ к глобальной сети необходим для того чтобы воспользоваться услугами централизованных баз данных для определения координат. Таким образом видно что данный способ имеет достаточно серьезные ограничения но в некоторых случаях может применяться достаточно успешно.

Чтобы получать информацию от GSM-модуля Трубки»телефона» можно воспользоваться библиотекой ril.dll (RIL Radio Interface Layer). Эта библиотека поставляется вместе с операционной системой и содержит неуправляемый код. По этой причине использовать её функции можно через PInvoke. В рамках RIL доступно множество интересных функций которыми можно воспользоваться. В нашем случае необходимо получить информацию о базовой станции это можно сделать используя функцию GetCellTowerInfo. Перед использованием этой функции необходимо вызвать функцию инициализации а после использования – деинициализации. При инициализации указывается метод который будет вызван после получения информации (працесс получения информации о базовой станции асинхронный). Таким образом для работы с RIL потребуется небольшая обертка над неуправляемой библиотекой.

После этого необходимо праинициализировать RIL указать метод обратного вызова вызвать метод GetCellTowerInfo и вызвать метод деинициализации. Данные будут получены в асинхронном режиме поэтому если необходимо их получать синхронно нужно воспользоваться объектами синхронизации например AutoResetEvent. Таким образом получение информации о базовой станции будет выглядеть следующим образом.

GeoIp

Последний и надежный способ который мы рассмотрим в качестве варианта получения текущего местоположение – это определение текущих координат на основе IP-адреса. Поскольку большинство устройств имеют GRPS-подключение к Интернет то этот способ может достаточно успешно работать. Получение местоположения по IP-адресу – это операция которая не всегда возвращает достоверную информацию. За счет использования «серых» IP-адресов информация может сильно отличаться от действительности (например когда российский IP-адрес определяется ирландским). Тем не менее при использовании мобильного интернета вероятность получения правильной информации выше. Поэтому мы рассмотрим этот метод в качестве одной из альтернатив.

Сильной стороной этого метода является то что он не зависит от наличия приемника GPS погодных условий и возможности соединения со спутником. Кроме того этот способ не зависит от наличия информации о базовых станциях в базе данных. Однако недостатки у этого метода также имеются и являются достаточно существенными. Во-первых точность определения местоположения зачастую оставляет желать лучшего. Как правило это рамки города (даже не района). Однако если этот уровень детализации устраивает то почему бы и нет? Другой недостаток – это необходимость наличия подключенного интернета; если подключенного интернета нет этот способ не работает. Более того большинство полноценных инструментов определения местоположения по IP-адресу либо являются платными либо накладывают ограничения на число обращений.

Тем не менее давайте возьмем на заметку этот способ на случай когда все перечисленные ограничения не являются существенными. В нашем случае мы остановимся на сервисе GeoIpTool (geoiptool.com) в общем же случае можно использовать любой из представленных в сети Интернет. Этот сервис возвращает HTML при обращении к его главной странице внутри которой есть координаты соответствующие IP-адресу клиента. В данном случае мы прасто обработаем HTML-код и получим из него координаты.

Free Web Hosting