7

저에너지 블루투스 사양은 주변 장치가 한 번에 둘 이상의 중앙 장치에 연결할 수 있는지에 대해서는별로 말하지 않지만 내 경험 테스트에서는 그렇지 못하다고합니다.iOS CoreBluetooth Central Manager를 지속적으로 검색 하시겠습니까?

내 응용 프로그램이 주변 장치와 비 독점적 인 관계가 필요하므로 (다른 사람을 차단할 수있는 연결이 필요 없음) 지속적으로 RSSI 값을 업데이트해야하므로 주변 장치를 지속적으로 스캔하여 RSSI 값을 캡처하는 방법을 모색 중입니다 .

scanForPeripheralsWithServices 메서드는 특정 간격 동안 검색 한 다음 중지합니다. 가장 좋은 방법은 한 번에 3 초씩 검색하고 stopScan을 기다렸다가 몇 초간 기다린 다음 다시 스캔하는 것입니다. 반복.

누구든지 더 나은 방법을 가리킬 수 있습니까? 예를 들어 둘 이상의 센트럴에 연결하도록 주변 장치를 구성 할 수 있습니까?

답변

7

주변 장치가 둘 이상의 중앙에 연결할 수 없습니다. 그러나 RSSI를 캡처해야한다면 연결이 필요하지 않습니다. 장치에 대한 스캔이 기능을 사용하여 RSSI를 검색 할 수 있습니다 : 이전 답변으로

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

네,하지만 나는 계속해서 업데이트 된 RSSI를 얻을 필요가 :

(. 완전히 나를 위해 문제가 해결되지 않은 CBCentralManagerScanOptionAllowDuplicatesKey@YES에 설정)

를 클래스를 가정하면 CBCentralManagerDelegate 구현합니다. 센트럴 매니저가 주변 장치를 몇 차례 발견하고 재발견하면 스캔이 계속되는 경우에도 발견 한 (약 3 초 정도 인 것 같습니다) 발견을 멈추게됩니다. 내가 남긴 것은 업데이트 된 RSSI 값을 얻기 위해 반복적으로 스캔을 다시 시작해야한다는 것입니다. – Jonathan

+3

예, didDiscoverPeripheral 함수 내에서 스캔을 다시 시작할 수 있습니다. 그러면 RSSI를 빨리 영원히 얻을 수 있습니다. – Aboelseoud

+1

감사합니다. 그거야. 전원을 절약하기 위해 실제로는 100ms 후 스캔을 중지 한 다음 1 초마다 100ms 버스트를 수행합니다. 훌륭하게 작동합니다. – Jonathan

5

을, 당신은 단지 RSSI에 관심이 있다면 당신은 단순히 위임 방법으로 그것을 얻을 수 있습니다 : BTW

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

, 기본적으로 CBCentralManager은이 메서드를 한 번만 호출합니다. 애플이 꼭 필요하지 않을 경우이 옵션의 사용을 억제하는 것이 조심

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

: 당신이 CBCentralManager가 광고 패킷을 수신 할 때마다 호출이 콜백을해야하는 경우에는 옵션 CBCentralManagerScanOptionAllowDuplicatesKey 세트 YES에로 스캔을 시작합니다 .

은 참조 : iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

나는 기본적으로 그냥 스캔에게 광고가 처리 될 때마다 다시 시작이 코드에 이러한 유형의 문제를 해결했다. CBCentralManager 인스턴스가 주변 장치 청취를 중단하는 동일한 문제에 직면했습니다.

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