Интересные статьи об Apple, приложениях для iPhone и iPad, iTunes

Indoor навигация с iBeacon в iOS7

Indoor навигация с iBeacon в iOS7

В iOS7 появилась поддержка iBeacon. Интернет пестрит заголовками:

  • Почему iBeacon может быть самой важной функцией iOS7.
  • iBeacon откроет новую эру локационных приложений.
  • Как iBeacon может убить NFC.
  • iBeacon и будущее мобильных платежей.

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

Под катом я расскажу что такое iBeacon на самом деле, как его можно использовать и покажу пример приложения для навигации по нашему офису.

iBeacon это маячок транслирующий по Bluetooth Low Energy три параметра proximity UUID, major и minor. iOS7 упрощает работу с такими устройствами.

proximity UUID это уникальный 128 битный идентификатор, все маячки вашей компании или в пределах здания имеют одинаковый pUUID. major и minor это 16 битные беззнаковые целые для нумерации маячков в пределах одного pUUID. Это рекомендации Apple, вы можете задать абсолютно любые значения для этих параметров, но рекомендованная схема удобнее.

Доступен предзаказ на маячки от Estimote и Kontakt.

img

Один маячок стоит $30, работает два года от батарейки. Многие компании дорабатывают свои продукты для поддержки профиля iBeacon. Думаю, в течение трех месяцев появятся китайские аналоги по $10.iOS устройства могут выступать в роли маячка, это позволяет поиграть с новым API уже сейчас.

В Core Location Framework добавили три класса: CLBeacon, CLBeaconRegion и CLCircularRegion. В CLLocationManager появились методы isRangingAvailable, rangedRegions, requestStateForRegion, startMonitoringForRegion, startRangingBeaconsInRegion и соответствующие события в CLLocationManagerDelegate. startMonitoringForRegion теперь поддерживает не только GPS-регионы но и Bluetooth. О том как это использовать подробно написано в документации.

Фактически новое API предоставляет две возможности:

  1. Получение списка маячков в зоне видимости с определенным Proximity UUID (поиск можно сузить указав значение major или major/minor) при помощи метода startRangingBeaconsInRegion. API определяет расстояние до маячка (Immediate, Near, Far) и погрешность расстояния в метрах.
  2. Мониторинг региона. Когда пользователь заходит в зону действия маячка или покидает ее, возникают события didEnterRegion/didEnterRegion (метод startMonitoringForRegion). Причем мониторинг работает даже когда ваше приложение находится в фоне, при наступлении события приложение будет разбужено.

Использовать данные для получения координат устройства в помещении нельзя. В пояснении к погрешности расстояния (accuracy) прямо написано «Do not use it to identify a precise location for the beacon». Эксперименты подтверждают, данные не пригодны для триангуляции.

Возможные применения iBeacons:

  1. Навигация внутри помещений: развешиваем маячки в каждом помещении (одинаковый proximity UUID, разные major для этажей/отделов, разные minor для комнат). На карте отображаем ближайший к смартфону маячок.
  2. Интерактивный тур по музею: на каждый экспонат клеим маяков, при приближении к экспонату показываем дополнительную информацию о нем.
  3. Точное позиционирование в городе. Маячки развешиваем на памятники и объекты архитектуры. Целый город превращается в музей.
  4. Навигация для слепых. При обнаружении маячка проигрывать голосовое сообщение где пользователь находится и куда можно двигаться дальше.
  5. Локационные игры и квесты. Например, простая демо-игра "найди обезьяну"
  6. Скидки и акции в магазинах. Проходим мимо джинс (на стеллаже установлен маячок) и получаем сообщение о купи-две-пары-третья-в-подарок.
  7. Настойка оборудования. Не уверен, что это вообще связано с iBeacon, но с iOS7 Apple TV можно настроить прикосновением iPhone.
iPhone 4s+, iPad 3+ могут работать как маячок. Я решил написал простую навигацию по нашему офису, используя тестовые iOS устройства. Если у вас нет Xamarin.iOS или желания собирать приложение, попробуйте Estimote App. Приложение демонстрирует новые функции (потребуется два iOS устройства с Bluetooth LE).

Итак. Карта нашего офиса:


Для навигации нужны маячки с iOS7, я набрал тестовых устройств и разложил их в центре кабинетов 310, 311 и 312. Всего потребовалось 3 маячка и один приемник.

img


За основу возьмем демо-приложение Xamarin AirLocate. Оно умеет включать трансляцию proximity UUID, major и minor (параметры настраиваются) и отображать список доступных вокруг маячков с заданными pUUID.

Код приложения с навигацией по нашему офису доступен на github. Сразу хочу извиниться за ужасный код, я маркетолог и это мое первое iOS приложение.

Задаем маячкам одинаковый proximity UUID, major ставим равным номеру кабинета. Код включения маячка (в фоне не работает, нужно выключить автоблокировку):

<code class="cs">CLBeaconRegion region = new CLBeaconRegion (uuid, major.UInt16Value, minor.UInt16Value, Defaults.Identifier);
if (region != null)
      peripheralManager.StartAdvertising (region.GetPeripheralData (power));


AirLocate выдает список доступных маячков с расстоянием и точностью, пример из 312 кабинета (маячок из 310 не добивает).



Создадим MapViewController который будет рисовать прямоугольник над кабинетом, номер которого содержится в major ближайшего маячка.
<code class="cs">locationManager = new CLLocationManager ();
locationManager.DidRangeBeacons += HandleDidRangeBeacons;
locationManager.StartRangingBeacons (new CLBeaconRegion(Defaults.SupportedProximityUuids[0], "office_beacon"));

<code class="cs">void HandleDidRangeBeacons (object sender, CLRegionBeaconsRangedEventArgs e)
{
       drawRegion (e.Beacons [0]);
}

<code class="cs">switch ((int)(beacon.Major)) {
    case 310: 
        path.AddRect(roomCoords[0]);
	break;
    case 311: 
        path.AddRect(roomCoords[1]);
        break;
    case 312: 
        path.AddRect(roomCoords[2]);
       break;
}

(еще раз простите за ужасный код).

Теперь можно походить по офису и потестировать.

img

Работает!


Точность определения кабинета прекрасная, а вот скорость обновления не очень, если дойти обычным шагом в другой кабинет карта обновится секунд через 10-30.

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

В целом ничего революционного iBeacon из себя не представляет, но Apple определенно дала сильный толчок развитию локационных приложений. Для iOS7 они пишутся десятком строчек кода.


Картинка в шапке с сайта estimote.com, изображения маяков с сайтов производителей.

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

Автор: junk