7

低能量藍牙規範並沒有多說外圍設備是否可以同時連接到多箇中心,但是我的經驗測試告訴我他們不能。由於我的應用需要與外設(即沒有連接,會阻止其他設備)之間的非所有關係,並且需要不斷更新RSSI值,所以我正在尋求一種方法來連續掃描外設並捕獲它們的RSSI值。連續掃描iOS CoreBluetooth中央管理器?

scanForPeripheralsWithServices方法似乎掃描一定的時間間隔,然後停止。我相信我最好的選擇是每次掃描3秒,stopScan,等待(幾秒鐘),然後重新開始掃描。重複。

任何人都可以指出一個更好的方式嗎?例如,配置外設連接到多個Central?

回答

7

外圍設備無法連接到多箇中央設備。但是如果你需要捕獲RSSI,那麼你甚至不需要連接。掃描設備可以使用此功能檢索RSSI:

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

是的,但我需要不斷獲得更新的RSSI。我的發現是,一旦中央管理器發現並重新發現外設幾次,即使掃描繼續,它也會停止發現它(似乎大約3秒鐘)。我剩下的就是需要反覆重新啓動掃描以嘗試獲取更新的RSSI值。 – Jonathan

+3

是的,您可以重新啓動didDiscoverPeripheral函數中的掃描,並且您將快速獲取RSSI。 – Aboelseoud

+1

謝謝。這樣可行。爲了節省電力,我實際上在100ms後停止掃描,然後每秒鐘做100ms的爆發。很棒。 – Jonathan

5

至於以前的答案,如果你有興趣只在RSSI你可以簡單地把它搬進委託方法:

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

BTW,默認情況下,CBCentralManager只會調用一次該方法。如果你需要這個回調被稱爲每次CBCentralManager接收的廣播數據包時,你需要啓動掃描的選項CBCentralManagerScanOptionAllowDuplicatesKey設置爲YES

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}; 
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions]; 

當心蘋果阻止該選項的使用,如果不是絕對必要。

請參見:iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

我解決了這個類型的問題與此代碼,每個廣告被處理的時間基本上只是重新啓動掃描。我遇到了CBCentralManager實例停止監聽外設的問題。

(設置CBCentralManagerScanOptionAllowDuplicatesKey@YES沒有完全解決這個問題對我來說)

假設類實現CBCentralManagerDelegate:

- (id) init { 
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; 
    [self initScan]; 
} 

- (void) initScan { 
    [self.central stopScan]; 
    [self.central scanForPeripheralsWithServices:nil 
             options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]]; 
} 

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

    // 
    // Do stuff here 
    // 

    [self initScan]; 
}