2012-03-28 9 views
13

menzil içinde cihazların sabit RSSI güncellemeler yani.Çekirdek Bluetooth - Sadece iOS için çekirdek bluetooth çerçevesi ile başladı ve ben onların RSSI numarayı her dakika alabilir veya böylece sürekli BLE cihazları taramak için gereken bir uygulama geliştiriyorum

Şu anda var:

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

bu BLE cihazlar için benim app tarama yapmaya başlar ve bir cihaz keşfedilir bu temsilci yöntemini çağırır:

- (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]];} 

bu yöntem bana çevreselin RSSI numarasını aldığı görüntüleyebilirim.

- (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]; 

} 
Bu kod çalışma ve bir tarama kabaca her 1 dakika yapıyor gibi görünüyor, ama çalışma neden tam olarak bilmiyorum

...

belgeleri: Son satır sonra bu temsilci yöntemini çağırır Çekirdek bluetooth üzerinde oldukça seyrek var, bu yüzden herkesin bunu nasıl yapacağına dair bir fikri varsa ya da başarmaya çalıştığım şeyi yapmanın daha iyi bir yolu varsa, bu yardımdan memnun olurum!

+0

ne sıklıkla RSSI güncellenir ... çalışıyor gibi görünüyor? DÜZENLEME: Bir dakika mı?Bağlanmadığınızda bir zaman aşımı olduğunu düşünüyorum, böylece tekrar taramayı başlatır. – chwi

+0

Sadece belgeleri okuyamaya başladım, bu yüzden daha da uzağınızdasınız. Soru, neden delege yönteminde didRetrievePeripherals adlı scanForPeripheralsWithServices çağrılıyorsunuz? CBCentralManager ayrıldıktan sonra zaten diyorsunuz. Bu, bahsettiğiniz tekrarlı taramaya neden olabilir. – mkr707

+0

sadece> = 7.0 için iki sent'im: şu andan itibaren kullanılmaları gereken RetrievePeripheralsWithIdentifiers. –

cevap

20

Eğer EVET tarama seçeneğini değiştirerek denediniz: Aşağıdaki belgelere bakın?

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

Bunu yaparsanız Ben bu geri arama zamanlama aynı için çok farklılaştığını görebilirsiniz rağmen normalde (yaklaşık her 100 ms olacağını iPhone tarafından görülür her reklam paketi, ile "didDiscoverPeripheral" geri arama alacak cihaz). Bu, gördüğü her cihazın RSSI'sini içerir.

Bu

sizin ~ 1 dakika güncelleme oranı çok daha hızlı olması gerekir. @Anders çözümün

+1

Bu iki satır için Swift eşdeğeri nedir? – Gerard

+0

@Gerard: Aşağıdaki cevabımı inceleyin. – kbpontius

+1

Swift3: "manager.scanForPeripherals withServices: [sensorTagAdvertisingUUID], seçenekler: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber (value: true)])' – nablahero

3

Görebildiğim kadarıyla, bu istediğini yapmalı.

orijinal çağrıyla çevre birimleri için tarama başladı sizin temsilci bir BLE cihaz keşfedilir her aramaları almak için başlamalıdır. çünkü didRetrievePeripherals yöntemde, tarama doesn olarak bildiğim kadarıyla,: Eğer

[manager stopScan]; 

çağrısı ile taramayı durdurmak ben gerçekte centralManager içinde scanForPeripheralsWithServices ikinci çağrıyı gerek olduğunu sanmıyorum kadar bu devam edecek Söyleyene kadar durma. Yine de buna hala başlıyorum ve henüz bulamadığım bir zaman aşımı olabilir.

Ben BLE cihaz sık sık sadece reklam olduğu için bir dakika sonra yaklaşık bir çağrı nedeni eminim. Daha sık reklam yapıyorsa, keşif modunda bir cihaz gibi, aramaları daha sık alacağınızı düşünüyorum. Bunu doğrulayabilirseniz ilginç olurdum. Cihazda bir keşif modu varsa, bildirimlerin hızlanıp hızlanmadığını görmek için tetiklemeyi deneyebilirsiniz. o güç için çok pahalıya mal olduğu gibi

1

Swift Uygulama:

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