В моем приложении есть два переключателя, они могут превратить мое приложение в периферийное или центральное (две роли в соединении 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
, что меня смущает.
Итак, что я могу сделать, чтобы приложение могло рекламировать два периферийных устройства и нормально работать.