iOS CoreBluetooth / iBeacon: CBPeripheralManager не может не рекламировать две рекламные данные внутри приложения

В моем приложении есть два переключателя, они могут превратить мое приложение в периферийное или центральное (две роли в соединении BLE). Когда роль приложения в качестве периферийного устройства, я инициализирую два CBPeripheralManagers, один для рекламы ibeacon, а другой для соединения BLE. Что я хочу сделать, так это то, что когда другое устройство, играющее роль центрального, входит в диапазон периферийного устройства, оно может обнаружить маяк, в то же время оно сканирует периферийное устройство, а затем подключается к периферийному устройству. Когда соединение устанавливается, центральное устройство отправляет некоторые данные к периферии.

Вот моя проблема:

Я запускаю периферийное устройство следующим образом:

_peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil]; // for BLE connection
_beaconPeripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
_beaconPeripheralData = [self.beaconRegion peripheralDataWithMeasuredPower:nil];

_beaconPeripheralManager startAdvertising:_beaconPeripheralData;
[_peripheralManager startAdvertising:@{ CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:UUID]] }];

центральный инициализировать следующим образом:

 NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:UUID];
_beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.nikotung.ibeacon"];
[_locationManager startMonitoringForRegion:self.beaconRegion];
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    [_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:UUID],[CBUUID UUIDWithString:BEACON_UUID]]
                                            options:@{ CBCentralManagerScanOptionAllowDuplicatesKey : @YES }];

Если я одновременно объявлю два периферийных устройства на центральной стороне, я никогда не смогу обнаружить периферийное устройство (_peripheralManager), а только маяк (_beaconPeripheralManager). делегат

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

никогда не звонил.

Но если я только включу _peripheralManager для рекламы, центральная сторона может обнаружить это и делегировать вызов.

Означает ли это, что мы не можем рекламировать два периферийных устройства одновременно, или размер даты ограничен.

В документе Apple говорится, что можно рекламировать только два ключа CBAdvertisementDataLocalNameKey и CBAdvertisementDataServiceUUIDsKey. Но я обнаружил, что _beaconPeripheralData содержит ключ kCBAdvDataAppleBeaconKey, что меня смущает.

Итак, что я могу сделать, чтобы приложение могло рекламировать два периферийных устройства и нормально работать.


person NikoTung    schedule 01.12.2013    source источник


Ответы (2)


я объединил рекламные данные для маяка и периферийного устройства и использовал их с 1 экземпляром диспетчера периферийных устройств; вроде работает на iOS (7.0), но не на OSX (10.9)

person Maxim Volgin    schedule 16.01.2014
comment
Не могли бы вы предоставить дополнительную информацию о том, как вы это сделали? Я попытался использовать один CBPeripheralManager для рекламы данных как маяка, так и пользовательских служб, объединив словарь, предоставленный API-интерфейсом маяка, с моим собственным словарем рекламы, но, похоже, это не работает. Маяк рекламируется, но мой сервис не кажется обнаруживаемым. - person Michael McGuire; 22.04.2014
comment
Этот вопрос указывает на то, что то, что вы говорите, не работает (stackoverflow.com/questions/19351856/). Это то же самое, что и мой опыт. Опять же... как вы этого добились? - person Michael McGuire; 25.04.2014

как периферийные данные маяка, так и периферийные данные для описания вашей службы BLE являются NSDictionary, вы можете объединить их в один с помощью NSMutableDictionary и транслировать требуемые данные как один.

person user3300457    schedule 02.03.2014