2013-12-01 4 views
0

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

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

Я инициализировать периферийное так:

_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 который запутать меня.

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

ответ

0

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

+0

Привет, Максим, не могли бы вы рассказать подробнее. Как это сделать. Большое спасибо – NikoTung

+0

Не могли бы вы предоставить дополнительную информацию о том, как вы это сделали? Я попытался использовать один CBPeripheralManager для рекламы как маяковых, так и пользовательских данных службы путем слияния словаря, предоставленного API Beacon, в мой собственный словарь рекламы, но он, похоже, не работает. Маяк рекламируется, но мой сервис не кажется доступным. –

+0

Этот вопрос указывает, что вы говорите, не работает (http://stackoverflow.com/questions/19351856/ios-corebluetooth-ibeacon-advertise-an-ibeacon-and-a-peripheral-service-concu?rq=1). Это то же самое, что и мой опыт. Опять ... как вы это сделали? –

0

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

+0

Вы проверили эксперимент, что это работает? –

Смежные вопросы