UUID iBeacons отличаются на разных устройствах

Я разрабатываю приложение, которое будет использовать iBeacons для внутренней навигации, и обнаружил, что скорость вызова функции locationManager:rangingBeaconsDidFailForRegion:withError: недостаточно высока, поэтому я собираюсь добавить данные RSSI из centralManager:didDiscoverPeripheral:advertisementData:RSSI: CoreBluetooth.

И я обнаружил любопытный факт: когда я слушаю iBeacon с CoreLocation и регистрирую идентификатор периферии:

- (void)centralManager:(CBCentralManager *)central 
    didDiscoverPeripheral:(CBPeripheral *)peripheral 
    advertisementData:(NSDictionary *)advertisementData 
    RSSI:(NSNumber *)RSSI
{
    NSLog(@"%@, RSSI: %@", peripheral, RSSI);

о каждом маяке сообщается с другим UUID на разных устройствах:

A25804BD-D77A-5004-4C2C-301D996C7367 - my iPhone 5
843F4237-6059-9A5E-AA34-0BD92304BE1F - colleague's iPhone 5
77685805-C253-52BD-B787-8B95308834FB - other colleague's iPad mini

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

Почему UUID физически одного и того же маяка (не выключенного/включенного) отличается на разных устройствах? Это ожидаемое поведение? Если да, то как я могу отказаться от этого?


person Artem Abramov    schedule 17.06.2014    source источник
comment
Как ни странно, вы не можете видеть UUID iBeacon с основным bluetooth, вместо этого вы видите идентификатор стенда, назначенный стеком bluetooth принимающего телефона.   -  person Chris Stratton    schedule 17.06.2014


Ответы (1)


Вы не можете прочитать идентификаторы стандартных iBeacons, используя CoreBluetooth. Как сказал Крис Страттон в своем комментарии, UUID, который CoreBluetooth дает вам, представляет собой UUID устройства, который случайным образом генерируется iOS для каждого сеанса. Это не имеет ничего общего с iBeacon ProximityUUID.

Более подробная информация о том, почему вы не можете прочитать идентификаторы iBeacon с помощью CoreBluetooth, приведена здесь: http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html.

Это правда, что вы получаете измерение RSSI только для каждого обратного вызова locationManager:didRangeBeacons:inRegion:. Это реальное препятствие для выполнения пользовательской оценки расстояния. За кулисами iOS может собирать в 10 раз больше измерений для iBeacons, передающих на частоте 10 Гц. Вы правы в том, что вы можете получить больше измерений, используя CoreBluetooth, но проблема в том, что нет надежного способа выровнять, какие устройства Bluetooth, которые вы видите с помощью CoreBluetooth, соответствуют iBeacons, которые вы видите с помощью CoreLocation.

person davidgyoung    schedule 17.06.2014