В моем приложении есть два переключателя, они могут превратить мое приложение в периферийное или центральное (две роли в соединении 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
который запутать меня.
Итак, что я могу сделать, чтобы приложение могло рекламировать две периферийные устройства и нормально работать.
Привет, Максим, не могли бы вы рассказать подробнее. Как это сделать. Большое спасибо – NikoTung
Не могли бы вы предоставить дополнительную информацию о том, как вы это сделали? Я попытался использовать один CBPeripheralManager для рекламы как маяковых, так и пользовательских данных службы путем слияния словаря, предоставленного API Beacon, в мой собственный словарь рекламы, но он, похоже, не работает. Маяк рекламируется, но мой сервис не кажется доступным. –
Этот вопрос указывает, что вы говорите, не работает (http://stackoverflow.com/questions/19351856/ios-corebluetooth-ibeacon-advertise-an-ibeacon-and-a-peripheral-service-concu?rq=1). Это то же самое, что и мой опыт. Опять ... как вы это сделали? –