iOS iBeacon: как программно получить все близостьUUID?

Я хочу программно посмотреть все closeUUID рекламных пакетов. В некоторых статьях говорится, что это невозможно на iOS, но возможно на Android. Но я не могу в это поверить, потому что я обнаружил, что фантастическое приложение «BLExplr» имеет эту функцию. Мне нужно реализовать функцию в моем приложении. Кто-нибудь знает, как это сделать или хорошие примеры? Любая помощь будет оценена.

(ОБНОВЛЕНИЕ 17.01.2014)

Я считаю, что ответ @davidgyoung правильный. B9407F30-F5F8-466E-AFF9-25556B57FE6D — это UUID маяка Estimote, но отображаемый UUID маяка Estimote в приложении BLExplr — это еще один идентификатор.

введите здесь описание изображениявведите здесь описание изображения


person zono    schedule 16.01.2014    source источник
comment
Я нашел еще одно приложение Light Blue. Это приложение имеет те же функции. Но я все еще не могу найти возможное решение. Нужно ли мне читать необработанные данные BLE с помощью Bluetooth framework..? (Я не уверен, возможно ли это или нет)   -  person zono    schedule 16.01.2014


Ответы (3)


К сожалению, вы не можете сделать это на iOS. Когда вы говорите, что BLExplr и LightBlue могут это делать, вы путаете UUID службы Bluetooth с UUID Proximity iBeacon. Это две очень разные вещи.

UUID службы Bluetooth виден iOS, но не имеет ничего общего с идентификаторами iBeacon и бесполезен для работы с iBeacon. Сервисный UUID генерируется iOS каждый раз при обнаружении устройства Bluetooth и остается неизменным только в течение времени, пока устройство Bluetooth находится в пределах досягаемости. Если вы уберете Bluetooth-устройство и вернете его позже, у него будет другой сервисный UUID.

Идентификаторы iBeacon (ProximityUUID, Major, Minor) встроены в текст объявления Bluetooth. Проблема на устройствах iOS заключается в том, что API-интерфейсы CoreBluetooth от Apple запрещают доступ к необработанному телу рекламы, поэтому никакое стороннее приложение не может прочитать эти идентификаторы. Apple разрешает доступ к этим идентификаторам только с помощью специальных API iBeacon CoreLocation, но эти API требуют, чтобы вы заранее знали UUID Proximity.

Извините, я знаю, что это не тот ответ, который вы хотите услышать! (Я тоже сожалею об этом!) Как бы то ни было, вы можете сделать это на Android, OSX Mavericks и Linux.

Подробнее см. здесь.

person davidgyoung    schedule 16.01.2014
comment
Большое спасибо! Ты прав! Я прикрепил снимок экрана BLExplr. Сервисный UUID отличается от Proximity UUID маяков Estimote. - person zono; 18.01.2014
comment
@davidgyoung Можете ли вы тогда сказать, как приложение Radius Networks «Locate» в AppStore может считывать мои значения UUID, Minor и Major без моего ввода? Я разрабатываю приложение, которому нужно получить неизвестный UUID, чтобы сравнить их с тем, что у меня есть в базе данных. Ваше здоровье - person Estevex; 01.12.2014
comment
Это невозможно. Приложение предварительно настроено с дюжиной или около того популярных UUID. У вас должен быть популярный на маяке. - person davidgyoung; 02.12.2014
comment
Хорошо спасибо. Мне удалось понять, как действовать дальше. Еще раз спасибо - person Estevex; 02.12.2014
comment
@ Estevex Вы нашли какое-нибудь решение? Я также хочу знать, как я обнаруживаю устройства-маяки, не зная uuid в ios. - person Akhtar; 08.08.2015
comment
@davidgyoung Можем ли мы получить UUID, основные и второстепенные данные из kCBAdvDataManufacturerData, если он настроен таким образом, что все эти детали могут быть включены в него? - person subin272; 16.10.2018

davidgyoung частично ошибается в том, что не может получить информацию iBeacon. На самом деле вы можете получить UUID близости в OS X, но не в iOS.

В advertisingData CBPeripheral должен быть ключ с именем kCBAdvDataManufacturerData; Это NSData, представляющий рекламную информацию iBeacon. Этот ключ доступен только в OS X.

Убедитесь, что 2-й байт равен 0x02, первые два байта равны 0x004c (76 в десятичном формате), а 4-й байт (в десятичном формате) + 4 равен длине данных (должно быть 25).

NSRanges (извините за синтаксис Mac)
UUID близости: NSMakeRange(4, 16)
Major: NSMakeRange(20,2)
Minor: NSMakeRange(22,2)

Чтобы убедиться, что вы все делаете правильно, вы можете записать значения в шестнадцатеричном виде (используйте строку формата %x) и убедиться, что они соответствуют description из NSData, откуда они пришли.

person Nate Symer    schedule 23.06.2014
comment
какие ibeacon'ы вы использовали для этого? это, кажется, не работает для маяков оценки. advertisementData = { kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = estimote; kCBAdvDataServiceData = { "Device Information" = <0ec9686a 05d8b60e c9686a>; }; } - person YarGnawh; 25.06.2014
comment
YarGnawh, я слежу за рекламными данными профиля iBeacon. Именно так рекламирует менеджер периферийных устройств CoreBluetooth. Могут быть и другие способы рекламы с помощью маяков. Estimote может искать kCBAdvDataServiceData и подключаться к маяку, а затем считывать характеристику, чтобы получить основной и второстепенный. - person Nate Symer; 03.07.2014
comment
Кроме того, голосование против ответа, который предоставляет правильную информацию, отвечающую на вопрос (особенно, когда другие просто отклоняют вопрос), глупо. - person Nate Symer; 03.07.2014
comment
Голосование за @Nathaniel Symer за предоставление правильной информации. Я думаю, что знаю причину, по которой ваш комментарий был отклонен. Вероятно, у людей, которые читают ваш пост, недостаточно информации об iBeacon. Похоже, что kCBAdvDataManufacturerData доступен только на устройствах, соответствующих профилю iBeacon Bluetooth (определенному Apple, если я не ошибаюсь), упомянутая информация также обсуждалась здесь. - person Mysteltainn; 13.10.2014
comment
продолжая вышеизложенное, @NathanielSymer должен добавить простое сообщение, например, UUID близости можно найти на устройствах, которые соответствуют протоколу iBeacon Bluetooth Profile, на advertisementData с ключом kCBAdvDataManufacturerData, и вы должны удалить davidyoung совершенно неправ... потому что это не так, он просто частично не прав, а частично прав. - person Mysteltainn; 13.10.2014
comment
Исправьте мой комментарий выше, davidyoung частично неправ. Из ответа он также указал идентификатор службы Bluetooth по сравнению с идентификатором iBeacon, что является довольно четким ответом. @NathanielSymer предоставил дополнительную информацию об идентификаторе iBeacon. - person Mysteltainn; 13.10.2014
comment
Я считаю, что этот метод будет работать на OSX, но не на iOS. Мои тесты показывают, что упомянутый выше ключ отсутствует на iOS для рекламы iBeacon. См. здесь: developer.radiusnetworks.com /2013/10/21/ - person davidgyoung; 05.11.2014

NSRange uuidRange = NSMakeRange(4, 16);
NSRange majorRange = NSMakeRange(20, 2);
NSRange minorRange = NSMakeRange(22, 2);
NSRange powerRange = NSMakeRange(24, 1);

Byte uuidBytes[16];
[data getBytes:&uuidBytes range:uuidRange];
NSUUID *uuid = [[NSUUID alloc] initWithUUIDBytes:uuidBytes];

int16_t majorBytes;
[data getBytes:&majorBytes range:majorRange];
int16_t majorBytesBig = (majorBytes >> 8) | (majorBytes << 8);

int16_t minorBytes;
[data getBytes:&minorBytes range:minorRange];
int16_t minorBytesBig = (minorBytes >> 8) | (minorBytes << 8);

int8_t powerByte;
[data getBytes:&powerByte range:powerRange];



return @{ @"uuid" : uuid,
          @"major" : @(majorBytesBig),
          @"minor" : @(minorBytesBig),
          @"power" : @(powerByte)
          };

но uuid - это DeviceUUID, а не ProximityUUID

person Jeanette Müller    schedule 26.01.2015
comment
каков тип данных этой переменной data, можем ли мы использовать массив kCBAdvDataServiceData прямо здесь? - person Kamal Upasena; 30.01.2015
comment
да, данные [advertisingData objectForKey:kCBAdvDataServiceData] - person Jeanette Müller; 09.02.2015