Core Bluetooth - постоянные обновления RSSI устройств в диапазоне - PullRequest
13 голосов
/ 28 марта 2012

Я только начал с базовой платформы bluetooth для iOS, и я разрабатываю приложение, которое должно постоянно сканировать устройства BLE, чтобы я мог получать их номер RSSI каждую минуту или около того.

В настоящее время у меня есть:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[manager scanForPeripheralsWithServices:nil options:options];

запускает сканирование моего приложения для устройств BLE и вызывает метод делегата при обнаружении устройства:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData);
    //Do something when a peripheral is discovered.

    rssiLabel.text = [RSSI stringValue];

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];}

этот метод возвращает мне номер RSSI периферийного устройства, который я могу отобразить. Последняя строка затем вызывает этот метод делегата:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals {

    NSLog(@"Currently known peripherals :");
    int i = 0;
    for(CBPeripheral *peripheral in peripherals) {
        NSLog(@"[%d] - peripheral : %@ with UUID : %@",i,peripheral,peripheral.UUID);

    }

     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
     [manager scanForPeripheralsWithServices:nil options:options];

}

Кажется, этот код работает и выполняет сканирование примерно каждую минуту, но я не совсем понимаю, почему он работает ...

Документация по ядру bluetooth довольно скудна, поэтому, если у кого-то есть какие-либо идеи о том, как это сделать, или есть лучший способ сделать то, что я пытаюсь сделать, я буду признателен за помощь!

Ответы [ 4 ]

20 голосов
/ 19 сентября 2012

Вы пытались изменить параметр сканирования на ДА?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber  numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[manager scanForPeripheralsWithServices:nil options:options];

Если вы сделаете это, вы получите обратный вызов didDiscoverPeripheral для каждого рекламного пакета, который просматривает ваш iPhone, который обычно составляет примерно каждые 100 мс (хотя я вижу, что время обратного вызова сильно варьируется для одного и того же устройства). Это включает в себя RSSI каждого устройства, которое он видит.

Это должно быть намного быстрее, чем ваша ~ 1 минута обновления.

3 голосов
/ 21 июля 2012

Насколько я понимаю, это должно делать то, что вы хотите.

Когда вы начали сканирование периферийных устройств с исходным вызовом, ваш делегат должен начать получать вызовы при обнаружении устройства BLE. Это будет продолжаться до тех пор, пока вы не остановите сканирование с помощью вызова

[manager stopScan];

Не думаю, что вам на самом деле нужен второй вызов метода scanForPeripheralsWithServices в вашем centralManager: метод didRetrievePeripherals, поскольку, насколько я знаю, сканирование не останавливается, пока вы не скажете это. Я все еще начинаю в этом, хотя, и может быть тайм-аут, который я еще не нашел.

Я почти уверен, что причина, по которой вам звонят раз в минуту, заключается в том, что устройство BLE только часто рекламирует. Если он будет рекламировать чаще, например, устройство в режиме обнаружения, я думаю, вы будете получать звонки чаще. Мне было бы интересно, если бы вы могли это подтвердить. Если устройство имеет режим обнаружения, вы можете попробовать запустить его, чтобы увидеть, ускоряются ли уведомления.

2 голосов
/ 26 июля 2012

Не следует выполнять непрерывное сканирование, так как это очень дорого для питания. Когда вы обнаружите устройства, вам будет возвращен массив объектов CBPeripheral. На CBPeripheral вы можете прочитать RSSI и получить обратный вызов при изменении RSSI. Смотрите следующую документацию: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

1 голос
/ 08 июля 2015

Swift Внедрение решения @Anders:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)])
...