19 декабря 2009 в 12:18

Как определить «Где я?» в приложениях на Windows Mobile

Каким образом реализуются приложения, зависящие от местоположения сегодня? Как правило, на ум сразу приходит использование GPS-устройств, которые способны предоставлять координаты текущего местоположения. Однако, GPS устройства есть далеко не везде и не всегда. Давайте попробуем разобраться как реализовать более богатый способ определения текущего местоположения.

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

Каким образом реализуются приложения, зависящие от местоположения сегодня? Как правило, на ум сразу приходит использование GPS-устройств, которые способны предоставлять координаты текущего местоположения. Однако, GPS устройства есть далеко не везде и не всегда. Более того, применение GPS-устройств ограничивается тем, что их нельзя использовать внутри зданий и закрытых помещениях. Засчастую на этом этапе заканчиваются идеи относительно получения текущего местоположения. Однако, если задуматься, то существуют и другие источники получения этой информации. Поскольку в нашем случае речь идет о Windows Mobile, а устройства на базе этой операционной системы зачастую обладают GSM-модулем, то информацию о местоположении можно брать с базовых станций состовых операторов. Кроме того, не стоит забывать про сервисы определения местоположения по IP-адресу – на подобных устройствах мобильный интернет настроен в большинстве случаев.

Каждый из приведенных выше способов имеет собственные преимущества и недостатки. Поэтому каждый способ может работать только в определенных условиях и при определенных ограничениях. Наиболее правильный способ – использовать все приведенные ранее способы и объеденить преимущества этих способов в одном приложении.

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

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 может выглядеть следующим образом.

var gps = new NativeWrapperGps();
gps.LocationChanged += delegate(object sender, NativeWrapperGps.LocationChangedEventArgs args)
              {
                //..
              };
gps.Open();
// ..
gps.Close();


* This source code was highlighted with Source Code Highlighter.

Таким образом, мы можем работать с GPS-приемником в Windows Mobile и получать информацию о текущем местоположении.

Сотовые сети


Другим источником информации о текущем местоположении может служить информация, которая доступна от оператора сотовой связи. Поскольку сети беспроводной связи строятся по принципу «сот», то в каждый момент мы работаем с какой-либо конкретной базовой станцией. Каждая базовая станция имеет некий уникальный идентификатор, который определяет каждую базовую станцию. Этот идентификатор состоит из нескольких значений – 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 потребуется небольшая обертка над неуправляемой библиотекой.

public static class RilInterop
{
  public delegate void RilResultCallback(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam);
  public delegate void RilNotifyCallback(uint dwCode, IntPtr lpData, uint cbData, uint dwParam);
  [DllImport("ril.dll", EntryPoint = "RIL_Initialize")]
  public static extern IntPtr Initialize(uint dwIndex, RilResultCallback pfnResult, RilNotifyCallback pfnNotify, uint dwNotificationClasses, uint dwParam, out IntPtr lphRil);
  [DllImport("ril.dll", EntryPoint = "RIL_GetCellTowerInfo")]
  public static extern IntPtr GetCellTowerInfo(IntPtr hRil);
  [DllImport("ril.dll", EntryPoint = "RIL_Deinitialize")]
  public static extern IntPtr Deinitialize(IntPtr hRil);
}


* This source code was highlighted with Source Code Highlighter.

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

public class RilWrapper
{
  private static RilCellTowerInfo _towerDetails;
  private static readonly AutoResetEvent WaitHandle = new AutoResetEvent(false);
  public static CellTower GetCellTowerInfo()
  {
    IntPtr rilHandle;
    if (RilInterop.Initialize(1, CellDataCallback, null, 0, 0, out rilHandle) != IntPtr.Zero)
    {
      return null;
    }
    RilInterop.GetCellTowerInfo(rilHandle);
    WaitHandle.WaitOne();
    RilInterop.Deinitialize(rilHandle);
    return new CellTower
    {
      TowerId = Convert.ToInt32(_towerDetails.DwCellID),
      LocationAreaCode = Convert.ToInt32(_towerDetails.DwLocationAreaCode),
      MobileCountryCode = Convert.ToInt32(_towerDetails.DwMobileCountryCode),
      MobileNetworkCode = Convert.ToInt32(_towerDetails.DwMobileNetworkCode),
    };
  }
  public static void CellDataCallback(uint dwCode, IntPtr hrCmdID, IntPtr lpData, uint cbData, uint dwParam)
  {
    _towerDetails = new RilCellTowerInfo();
    Marshal.PtrToStructure(lpData, _towerDetails);
    WaitHandle.Set();
  }
}


* This source code was highlighted with Source Code Highlighter.

После вызова метода GetCellTowerInfo() будет возвращен объект, содержащий значения, которые характеризуют текущую базовую станцию. Как было сказано выше, для получения географических координат на основе этой информации необходимо использовать какую-либо общедоступную базу данных. Например, такую информацию содержит открытый сервис OpenCellId (opencellid.org). Используя этот ресурс можно получить координаты местоположения по информации о базовой станции. Используя заданный формат URL, можно обратиться к сервису и получить ответ в виде XML. Для распознования информации от этого сервиса создадим небольшой объект, выполняющий эти функции.

public class OpenCellIdProvider : ICellToGpsProvider
{
  public GpsLocation GetCoordinates(int cellId, int locationAreaCode, int mobileCountryCode, int mobileNetworkCode)
  {
    GpsLocation result = null;
    var doc = XDocument.Load(String.Format("http://www.opencellid.org/cell/get?key={4}&mnc={3}&mcc={2}&lac={1}&cellid={0}", cellId, locationAreaCode, mobileCountryCode, mobileNetworkCode, Key));
    if ((doc.Root != null) && (doc.Root.Attribute(XName.Get("stat")).Value == "ok"))
    {
      var cellInfoElem = doc.Root.Element(XName.Get("cell"));
      if (cellInfoElem != null)
      {
        result = new GpsLocation
        {
          Latitude = Convert.ToDouble(cellInfoElem.Attribute(XName.Get("lat")).Value.Replace('.', ',')),
          Longitude = Convert.ToDouble(cellInfoElem.Attribute(XName.Get("lon")).Value.Replace('.', ','))
        };
      }
    }
    return result;
  }
}


* This source code was highlighted with Source Code Highlighter.

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

GeoIp


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

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

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

public GpsLocation GetLocation()
{
  double? lat = null;
  double? lon = null;
  var html = GetHtml("http://www.geoiptool.com/en/");
  var lines = Regex.Matches(html.Replace("\r", " ").Replace("\n", " "), @"<tr>(.)+?</tr>", RegexOptions.IgnoreCase);
  foreach (Match line in lines)
  {
    try
    {
      if (line.Value.Contains("Longitude:"))
      {
        lon = Convert.ToDouble(Regex.Match(line.Value, @"<td(.)*?>(?<val>[0-9\.]+)</td>").Groups["val"].Value.Replace('.', ','));
      }
      if (line.Value.Contains("Latitude:"))
      {
        lat = Convert.ToDouble(Regex.Match(line.Value, @"<td(.)*?>(?<val>[0-9\.]+)</td>").Groups["val"].Value.Replace('.', ','));
      }
    }
    catch (FormatException)
    {
    }
  }
  return (lat != null) && (lon != null) ? new GpsLocation { Latitude = (double)lat, Longitude = (double)lon } : null;
}


* This source code was highlighted with Source Code Highlighter.

Таким образом, мы можем получить свое местоположение по IP-адресу.

Строим финальное приложение


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

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

public interface ILocationProvider
{
  GpsLocation GetLocation();
  string ProviderName { get; }
}


* This source code was highlighted with Source Code Highlighter.

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

public class LocationManager : ILocationProvider
{
  private readonly List<ILocationProvider> _providers = new List<ILocationProvider>();
  private string _lastProviderName = null;
  public void ClearProviders()
  {
    _providers.Clear();
  }
  public void RegisterProvider(ILocationProvider provider)
  {
    if (_providers.Contains(provider)==false)
    {
      _providers.Add(provider);
    }
  }
  public void RemoveProvider(ILocationProvider provider)
  {
    if (_providers.Contains(provider) == true)
    {
      _providers.Remove(provider);
    }
  }
  #region ILocationProvider Members
  public GpsLocation GetLocation()
  {
    GpsLocation result = null;
    _lastProviderName = null;
    foreach (var provider in _providers)
    {
      try
      {
        result = provider.GetLocation();
        if (result != null)
        {
          _lastProviderName = provider.ProviderName;
          break;
        }
      }
      catch (Exception ex)
      {
        continue;
      }
    }
    return result;
  }
  
  public string ProviderName
  {
    get { return _lastProviderName; }
  }
  #endregion
}


* This source code was highlighted with Source Code Highlighter.

Таким образом, для использования этого механизма необходимо зарегистрировать все необходимые провайдеры, а затем обратиться к объекту-менеджеру с вопросом «где я?». Например, этот код может выглядть так.

LocationManager manager = new LocationManager();
manager.RegisterProvider(new GpsLocationProvider());
manager.RegisterProvider(new CellLocationProvider(new OpenCellIdProvider()));
manager.RegisterProvider(new GeoIpLocationProvider());
var location = manager.GetLocation();


* This source code was highlighted with Source Code Highlighter.

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



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

Вместо заключения


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

Спасибо вам за то, что дочитали до конца и удачи при построении ваших приложений! :)

Исходные коды приложения:
LocationAwareApp.zip
+37
1471
41
Sergun 36,1

Комментарии (65)

0
lunatik42, #
Здорово! А определение местоположения по БСкам на всех телефонах работает? Яндекс-карты, например на мою тошибу ругаются и говорят, что определение местоположения не поддерживается.
0
Sergun, #
Можно попробовать на вашем телефоне. Если интересно — напишите мне на почту и попробуем.
0
borbelyua, #
та же проблема :( программы ориентированные для работы с ril возвращают нули для cellid и lac
0
ColorPrint, #
для WinMobile есть софт, забыл как называется, который устаналивается как виртуальный GPS и преобразует информацию о принимаемых БС в координаты по базе… соответственно с ним будет работать любой софт, поддерживающий GPS-приемники
0
vkurylovych, #
а вспомните пожалуйста :)
0
ColorPrint, #
Нашел дистрибутив у себя, файл называется VirtualGPS_SP_Setup.cab
В гугле поищите его, ссылок полно вроде с описанием настройки
+1
ColorPrint, #
Вот кажется их официальный сайт sites.google.com/site/virtualgpsorg/
0
vkurylovych, #
Спасибо!
+1
nooze, #
Раз уж речь об этом зашла — я вот ищу софтину под WM, которая бы переключала звуковые профили в зависимости от местоположения (по вышкам)
phonealarm не предлагать, во-первых это нереальный монстр, а во-вторых почему-то не заработала эту функция у меня в нём (я.карты работают хорошо)
–1
Sergun, #
Вы ищете freeware или готовы его купить?
0
nooze, #
Скорее freeware
Это было бы полезным дополнением, но не необходимость для меня
0
Sergun, #
так phonealarm — она же не freeware
0
nooze, #
Ну я должен был попробовать. Хотя бы узнать как это выглядит в работе.
0
Sergun, #
ну понятно.
если что встретится — напишу
0
nooze, #
Вот мне тут подсказали о программке CellProfileSwitcher
4pda.ru/forum/index.php?showtopic=70560

Буду пробовать
–16
dimsonclear, #
купите iPhone и не е**те мозг
+5
Sergun, #
а iphone тут при чем?
+2
Agent_Smith, #
Не обращайте внимания, очередной пациент с макофобией головного мозга.
+2
artizan, #
> Как определить «Где я?»

И заодно уже — «Кто я?». Иногда по утрам бывает крайне необходимо :)
+4
ArSoron, #
Start -> Settings -> Personal -> Owner Information
+2
artizan, #
В таком случае важно не «пере-инициализироваться» однажды утром с чужим телефоном :)
0
Antigluk, #
«Смотри, не перепутай, Кутузов» ))
+1
stepio, #
Есть еще вариант, когда местоположение определяют по WiFi — это, по сути, разновидность третьего способа, только сравнения айпи-адреса происходнит именно с базой точек доступа. Этот способ немного точнее, но сильно зависит от актуальности базы.
+1
Phaker, #
IP тут не при чем, чтобы его получить, нужно для начала подключиться к хот-споту :)
Местоположение определяется по списку видимых SSID.
0
stepio, #
Погуглил… Да, Вы правы, спасибо… Я не знал что все настолько круто :) А что тогда понимается под хот-спотом? Если у меня дома стоит зикселевский роутер, есть шанс что однажды он окажется в такой базе?
0
stepio, #
*даже без моего на то желания
+2
DC88, #
мой длинковский в гуглмапс оказался месяца через 2.
Сначала при включенном вайфае определял по соте (с точностью 3 с чем-то км), потом после того, как я gps-приемник включил и по дому походил, естественно, определял с точностью метров 10-20, без него опять 3 км.
Позже опять решил проверить, но без gps — показывает мой дом и пишет, что точность 90 метров. Из чего можно сделать вывод, что мой роутер-таки занесся в базу гугля
+1
Phaker, #
А как же определение местоположения по хот-спотам WiFi? Сейчас у многих он идет третьим в списке, после GPS и CellID.

Другие платформы, кстати, предоставляют приложениям координаты сразу по CellID и/или WiFi, если GPS еще не определился. Может, в седьмой версии такая благодать снизойдет и на WinMo?
0
stepio, #
Коллега :)
0
borbelyua, #
по незнанию принципа работы определения местоположения?
0
stepio, #
Не! По тому что сразу вспомнил про Wifi :) А Вы уж как-то слишком обобщили — кажется тут лишь я до конца не понимал принцип определения местоположения с помощью Wifi (а не местоположения вообще).
0
borbelyua, #
Зависит не от платформы, а от приложения(все же минимальные данные для достаточной точности расчетов вытянуть любая платформа дает).
С вайфаем проще. На примере Гугла это выглядит так code.google.com/intl/ru/apis/gears/geolocation_network_protocol.html#request
Передаются координаты с gps+параметры точки доступа. И вас посчитали:)
WM дает доступ для считывания всех необходимых данных, главное правильно считывать:)
0
stepio, #
Я ничего не говорил по поводу платформы и до конца не понял рассуждения г-на Phaker на этот счет, но думаю вы ошибаетесь.
Для примера, ссылка на список устройств поддерживающих определение местоположения в Google Maps Mobile — очевидно что это ДАЛЕКО не все платформы. Или Вы можете привести пример приложения (написать его сами), которое определит координаты Siemens M65 (Java 2 ME)? Сомневаюсь.
0
borbelyua, #
От того что гугл не написал приложения под все платформы это не значит, что это не невозможно + даже то что уже написано не всеми поддерживается на должном уровне.
Сименсы отдельный разговор, согласен без патча нельзя, те кому это надо патчат:)
P.S. еще есть такое подозрение, что гигант работает для массового рынка, а не эксклюзива.
0
stepio, #
Nokia — лишь «Symbian S 60 третьего выпуска или UIQ версии 3.0», Sony Ericson — только «некоторые последние модели», Samsung совсем нет… Что же тогда массовей?
А патчи — это и есть самые настоящие хаки.
0
borbelyua, #
Повторюсь, от того что у гугла не все гладко это не значит, что это нельзя реализовать. WM, symbian, android, iphone, Sony Ericson и Nokia предоставляют API для получения cellid, lac и mcc, не надо изобретать велосипед и считывать нужные блоки памяти. Патчи это сименс(и им подобные) которых уже не выпускают, соответственно ориентировать на них новые приложения грех.
–2
stepio, #
Я хоть на что-то ссылаюсь, а у Вас «голые» слова — скучно.
0
borbelyua, #
Учитесь читать документацию, она в сети в доступном виде лежит. И не надо устраивать демагогию.
0
stepio, #
Это вы начали ветку бесполезной демагогии глупым обвинением :) А читать документацию по всему подряд я не имею возможности — я не занимаюсь разработкой lokation-based сервисов, потому считаю что для общего развития мне вполне хватит общения на хабре и статей вроде гугловских, этой и всего остального что встречается в интернете и на что не нужно убить несколько дней чтоб как следует разобраться. Жаль что общение с Вами оказалось пустым.
0
stepio, #
Ваше утверждение было бы верно, если бы на всех платформах было универсальное API для доступа к LAC и CallID, но это не так — пока это чаще всего недокументированные хаки.
0
borbelyua, #
Очевидно, что универсального API для доступа к интерфейсу нет и никогда не будет. Хаков нет, все документировано разработчиками платформ.
–1
stepio, #
Почему очевидно? Объясните, пожалуйста — мне, например, не очень очевидно… По-моему, роль такого API могла бы частично сыграть Java 2 ME («частично», потому что все-таки не все ее поддерживают, надо признать) — ее поддерживает абсолютное большинство моделей, но… как-то не выходит. Видимо не зря.
0
borbelyua, #
Любая стандартизация на конкурирующем рынке непростая штука, это уже политика и очень сомнительно, что это в интересах мобильных производителей. Почему они должны идти на этот шаг? Они предоставляют свои api, которые «вписываются» в разрабатываемую ими архитектуру.
–1
TNK, #
А для чего скажите на милость программеру извращаться и брать эти данные с WinMo девайса через jav'у и ее api, когда можно без лишнего геморроя сразу взять их через апи платформы?
0
stepio, #
В этой ветке обсуждения мы отошли от WinMo и обсуждаем возможность получения этих данных вообще. В WinMo проблем нет, в других платформах — по-разному.
0
TNK, #
выши слова:«По-моему, роль такого API могла бы частично сыграть Java 2 ME («частично», потому что все-таки не все ее поддерживают, надо признать) — ее поддерживает абсолютное большинство моделей» вот winmo держит яву, а использовать ее апище глупо было бы. и в чём тогда его суть? у андроида с яфоном тоже явно свои апи, которые уже используются широко софтонаписателями
0
stepio, #
Вы правы, я отстал от жизни. Java уже не актуальна как и телефоны, которые поддерживают только ее. Просто я привык к таким телефонам, привык к их преобладанию на рынке… Сорри.
0
TNK, #
универсальное апище — это конечно хорошо, но в наших реалиях пока утопия…
0
Sergun, #
можете поподробнее про «другие платформы»?
0
Phaker, #
iPhone и Android, конечно :)
S60 по вайфаю пока местоположение не определяет, но по базовым станциям — уже.
Про остальные платформы не в курсе.
0
Antigluk, #
Хотспоты Wi-Fi это хорошо, но не везде они есть) У меня в городе например есть 5-6 точек от силы. Часто при поиске не находит ни единой сети.
0
Phaker, #
На самом деле, годятся любые точки, транслирующие SSID в эфир. Я прямо сейчас из своей квартиры вижу 13 соседских сетей, не считая своей. Это позволяет определить мое местоположение однозначно с точностью до десятка метров (там ведь еще и мощность сигнала учитывается).
+1
vadv, #
Товарищи с МЯК (Мобильный Яндекс Карты), прочтите внимательно этот топик, вам наверно пригодится!
Вы уже месяца три как не можете починить GPS на HP iPAQ Voice Messenger (GPS Intermediate Driver ).
0
borbelyua, #
с позиционированием в мобильных сетях у них тоже плохо
0
vadv, #
Вы сравнивали? У меня что GoogleMaps, МЯК одинаково плохо определяют положение по вышкам.
В этом больше, как мне кажется, виноваты ОпСоСы, точность несколько километров.
Хотя вроде и город не маленький…
0
borbelyua, #
ОСС ни чем не виноваты. Они не предоставляют услуги определения местоположения для ГуглМапс и МЯК. Ваше местоположение рассчитывается на основе собранной статистики от пользователей, которые пользуются данными приложениями + gps. Чем больше людей «засвелило» зону покрытия БС в которой вы находитесь, тем точнее определяется ваше местоположение. Это простым языком на пальцах:)
0
borbelyua, #
P.S.
>Вы сравнивали?
Сравниваю регулярно:)
0
Idris, #
А я определяю «Где я» оправляю команду *148# стоит 5 р. Мегафон-Кавказ. Приходит смска с адресом и ссылка на карту.
0
feodus, #
Неплохо было бы посмотреть реализации данной идеи на других платформах… Например на J2ME или (и) Android…
Интересная серия статей бы получилась.
+1
leviathan, #
В Андроиде определение местоположения — системная функция, все данные можно без проблем получить через пару API запросов, причем абстрагированно от способа их получения.
0
feodus, #
ах… да насколько я понял все АндроФоны оснащены GPS… Да?

Тогда с ними понятнее…

А J2ME?
0
leviathan, #
Там не только GPS, но и по вышкам GSM оператора определяет (более того, он и видимые wifi сети как-то использует — с выключенным GPS, но включенным WiFi он меня дома и в универе «видит» с точностью до сотни метров, тогда как по одним вышкам — около 500-700 метров). Причем что из этого используется и какие приложения могут эти данные видеть — все задается в настройках системы.
0
feodus, #
блин круто… Андроид мне все больше нравится…
+1
Infthi, #
по поводу RIL — я как-то наткнулся на следующий псто: 4pda.ru/forum/index.php?s=&showtopic=102296&view=findpost&p=2193271

и это печально

и насколько я понимаю, яндекс-карты для определения иестоположения используют как раз этот метод, и пока что ни на одном из трех бывших у меня wm-девайсов они определять положение по gsm не умели — при первом запуске показывали соответствующее сообщение («ваш аппарат...»)

хотя мб просто я неудачник
0
Nashev, #
Добавьте плиз в заголовок статьи упоминание .net CF

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.