2016-02-03 2 views
-1

Я на самом деле делаю приложение с использованием Bluetooth Low Energy.iOS - CoreBluetooth didDiscoverPeripheral называется только один раз

Мое приложение имеет 3 представления, каждый из которых отображает некоторые данные BLE.

Когда мой протокол протоколов Bluetooth был в первом представлении, проблем не было. Но я решил сделать класс и поместить в него свой код Bluetooth, поэтому я мог бы сделать глобальный класс для своих 2 других просмотров. Я использовал:

self.bluetoothManager = [BluetoothManager getInstance]; 

BluetoothManager, являющийся моим глобальным классом.

И вот проблема:

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

Этот метод разве перекручивание больше, это называется один раз только на старте. Я боюсь, что другие сервисы, такие как DiscoverCharacteristics или Notifications, не будут зацикливаться.

Edit: Это, как я создаю мой класс

+(BluetoothManager *)getInstance { 
    @synchronized(self) 
    { 
     if(instance==nil) 
     { 
      instance= [[BluetoothManager alloc] init]; 
     } 
    } 
    return instance; 
} 

- (id) init { 
    self.CentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_main_queue()]; 
    self.activePeripheral = [CBPeripheral alloc]; 
    self.discoveredPeripherals = [NSMutableArray new]; 
    self.resultValue = [[NSString alloc] init]; 
    return self; 
} 

- (void)centralManagerDidUpdateState:(CBCentralManager *)central 
{ 
    if (central.state != CBCentralManagerStatePoweredOn) { 
     return; 
    } 

    if (central.state == CBCentralManagerStatePoweredOn) { 
     // Scan for devices 
     [self.CentralManager scanForPeripheralsWithServices:nil options:nil]; 
     NSLog(@"Scanning started"); 
    } 
} 

Edit 2: До сих пор я не отправлял все методы класса, чтобы получить правильный вопрос, но каждые методы из CBCentralManager делегата реализован в мой класс ,

До сих пор я думаю, что моя проблема связана с потоками, поскольку единственное отличие в том, что мой класс больше не находится в главной очереди? Я попробовал несколько вещей, но я не уверен в потоках, если у кого-то есть решение или идея решить эту проблему, спасибо заранее.

+0

Возможно, нам нужен код 'BluetoothManager', части создания. – Larme

+0

Спасибо, добавил некоторые сведения о создании. –

+0

Где вы начинаете сканирование периферийных устройств. Что вы имеете в виду, это не «зацикливание»? Вы указали дубликат ключа для scanForPeripheralsWithServices? – Paulw11

ответ

-1

Если вызов didDiscoverPeripheral:... был вызван успешно, это означает, что вы все сделали правильно. Когда вы вызываете scanForPeripheralsWithServices:options:, iOS начинает сканирование окружения в поисках устройств BLE. Он будет делать это до тех пор, пока вы не вызовете stopScan явно или не отключите BT или не убьете свой экземпляр CBCentralManager. Некоторые периферийные устройства будут найдены сразу, для некоторых из них потребуется больше времени. Каждый раз, когда устройство обнаружено, вызывается didDiscoverPeripheral: callback. Когда это произойдет, вы должны решить, заинтересованы ли вы в нем, подключиться к нему и открыть его службы.

+0

Спасибо за объяснение! Но я помню, что 'didDiscoverPeripheral' работает до тех пор, пока я не остановлю сканирование. Я снова и снова находил одно и то же устройство (мое), что было неплохо, так как он показывал мне, что метод didedischeerererial был циклическим. Но теперь он больше не зацикливается, он просто сканирует один раз. –

+0

Я не думаю, что вы должны полагаться на «didDiscoverPeripheral» «looping» или предположить, что это хорошо. Возможно, действительно, этот обратный вызов будет сообщаться несколько раз за одно периферийное (я не совсем уверен, почему это происходит, возможно, изменение RSSI, кто знает), но в моей практике я всегда считал это мусором. Как только вы найдете свое периферийное устройство, вы можете сразу подключиться к нему и остановить сканирование. Единственная проблема, которая важна, заключается в том, что ваше периферийное устройство вообще не найдено, но я предполагаю, что это не так. –

+0

Я думал об этом, но потом я спросил себя: что, если я не найду прямо сейчас свое периферийное устройство, или если я забыл его подключить? Я на самом деле создаю массив с обнаруженным периферийным устройством, чтобы показать его в виде таблицы, а затем показать его, чтобы выбрать устройство. Это единственное, что меня беспокоит, что, если мне нужно снова сканировать для более периферийного? –

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