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.


    Один маячок стоит $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 маячка и один приемник.


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

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

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

    CLBeaconRegion region = new CLBeaconRegion (uuid, major.UInt16Value, minor.UInt16Value, Defaults.Identifier);
    if (region != null)
          peripheralManager.StartAdvertising (region.GetPeripheralData (power));
    

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


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

    void HandleDidRangeBeacons (object sender, CLRegionBeaconsRangedEventArgs e)
    {
           drawRegion (e.Beacons [0]);
    }
    

    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;
    }
    
    (еще раз простите за ужасный код).

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


    Работает!

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

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

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


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

    Подписывайтесь на наш хабра-блог. Каждый четверг полезные статьи о мобильной разработке, маркетинге и бизнесе мобильной студии.
    Метки:
    Touch Instinct 46,72
    Разрабатываем мобильные приложения
    Поделиться публикацией
    Похожие публикации
    Комментарии 24
    • 0
      А есть какая-то статистика о точности измерения расстояния до датчика? Какова погрешность?
      • 0
        у меня статистики нет, но после экспериментов сложилось ощущение, что работает хорошо определение ближайшего маячка. Расстояние НЕ определяется, accuracy меняется как хочет, иногда достаточно просто стоять на месте и он будет расти.
        • 0
          Но ведь можно же запеленговать силу сигнала?
          • 0
            как? в API приходит rssi этого достаточно?
            • 0
              В теории RSSI достаточно, но в реальности сложно получить хорошую точность с минимальным количеством маячков. По стандарту Bluetooth предусмотрены высокие задержки для снижения энергопотребления, плюс выбор случайных каналов передачи. Мы потратили уйму времени на исследования, чтобы добиться приемлемых результатов.
        • 0
          Очень интересная идея, а как дела обстоят с другими платформами? Например, возможно ли реализовать функции маячка на обычный pc с linux'ом на борту и bluetooth адаптером? Есть ли возможность обнаруживать (или выступать в роли) маячки на телефонах с android'ом?
          • 0
            1. iBeacon только в iOS7 Хотя все производители маячков предлагают свои SDK и для других платформ (Estimote, Kontakt). Если нужно определять именно координаты в помещении то это к indoo.rs
            2. можно, нужен bluetooth low energy адаптер
            3. можно, но реализовывать протокол нужно самому или брать SDK производителей маячков
            • +2
              С другими платформами немного похуже. Microsoft еще не добавила общую поддержку Bluetooth 4.0 и Bluetooth LE в Windows 8, WP8 и Surface RT, ограниченная поддержка есть в Surface Pro. Про Lunix не знаю.
              Google добавила новые API в версию Andorid 4.3, но пока рынок начнет обновляться пройдет минимум 6-9 месяцев.

              Наша компания indoo.rs уже несколько лет занимается разработкой технологий и SDK для indoor навигации и позиционирования, если интересно — обращайтесь, расскажу.
              • 0
                Судя по всему, можно. Насколько я понял, BT 4.0 и соответствующие адаптеры в Линуксе уже поддерживаются =) К примеру, можно почитать немного про работу здесь:
                joost.damad.be/2013/08/experiments-with-bluetooth-low-energy.html
                stackoverflow.com/questions/15657007/bluetooth-low-energy-listening-for-notifications-indications-in-linux
              • +1
                Кстати, The Verge говорит, что Apple уже представила первое применение iBeacons для настройки Apple TV. Ссылка
                • 0
                  А как далеко Bluetooth LE вещают?
                  • 0
                    По стандарту — 50м в прямой видимости.
                  • +3
                    почему все тут на хабре постоянно извиняются за свой код? отличная статья, отличный пример и отличный код, нечего стесняться.
                    • 0
                      То есть для работы должен быть постоянно включен Bluetooth?
                    • +3
                      Эксперименты подтверждают, данные не пригодны для триангуляции.

                      Простите, но не могу не позанудствовать, особенно учитывая, что эта ошибка почему-то очень распространена, но о ней никто не говорит.
                      Триангуляция — это вычисление координат неизвестной точки, используя координаты двух известных и угол от каждой до неизвестной. То, что вы имели в виду (вычисление координат, используя три известные точки и расстояния до них), называет трилатерацией.
                      • +1
                        Они бы ещё API для изменения системных настроек предоставили — можно было бы включать-выключать WiFi, режим «не беспокоить» и т.п. в зависимости от наличия маяков поблизости.
                        • +1
                          Если это обычный блютус, то ни о каком убийстве nfc говорить нельзя. Инновационности тоже нет — локация по вайфай точкам доступа также давно известна, эта штука работает на той же идее. думаю, что скоро подобное будет и на андроиде, благо блютус везде есть.
                          • 0
                            Мне одному кажется, что 30 долларов (примерно 1 тысяча рублей) за один маячок – многовато?
                            • 0
                              Скажите, а гиперссылки в точках — это такой фильтр по возрасту/зрению/крепкости нервов?
                              • 0
                                это чтобы не уводить читателя от темы, но выбрасывать ссылки совсем было жать :)
                              • 0
                                Молодцы, что не пошли на поводу у хомячков и не внедрили NFC, а решили развить мысль дальше.
                                Вспоминается цитата Джони Айва:
                                Мы не цепляемся за малейшую возможность внедрить в устройствах 10 новых обрывков технологии, чтобы потом искать им применение
                                • 0
                                  Автор, это потрясающе!
                                  Я в восторге! В одном разрабатываемом проекте как раз это и нужно!

                                  Еще бы маяками затариться подешевле 30 баксов.
                                  • 0
                                    Умельцы уже делают сами маяки?

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

                                    Самое читаемое