1

여러 블루투스 주변 장치에서 iOS (BLE가있는 6 개)의 RSSI 표시기를 측량하려고합니다. 나는 scanForPeripheral와 RSSI를 얻을 수 있습니다 :많은 bluetooth 주변 장치의 RSSI 값을 새로 고침

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

[_manager scanForPeripheralsWithServices:nil 
           options:options]; 

과 함께 :

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

이 작동하지만 수신 패킷의 속도에 제어 할 수 없습니다 그 결과가 불확실 보인다.

는 내가 읽은 : https://stackoverflow.com/a/12486927/270209하지만 readRSSI와 결과가 더 안정적인 것 같다 장치에 연결되어있어 경우 내 비율은

모든 (보다 1 ~ 이초)에서 100ms로 가까이하지 않습니다.

스캔 모드에서 더 자주 업데이트하거나 둘 이상의 주변 장치에 연결하는 방법을 주변 장치에 "자극"하는 방법을 찾고 있습니다.

감사

편집 : 나는 또한

+0

가 무슨 뜻 수행 - (무효) centralManager : (CBCentralManager *) 중앙 didDiscoverPeripheral : (CBPeripheral *) 주변 advertisementData : (NSDictionary와 *) advertisementData RSSI :(NSNumber *) RSSI 메서드가 너무 빨리 호출되고 RSSI가 너무 자주 업데이트됩니다. –

+0

아니요, 실제로는 충분히 빨리 호출되지 않습니다. – luxcem

+0

어떤 장치를 실행하고 있습니까? – cbowns

답변

1

(iOS 기기에있어 가정 시작에 스캔이 더 많은 장치를 감지하고 업데이트가 더 자주 것 같다, 빨리 스캔 시작/중지하려고했습니다 :) CoreBluetooth는 의도적으로 안테나에서 활성화되는 속도를 제한 할 가능성이 높습니다. Bluetooth LE, Bluetooth Classic 및 Wi-Fi는 모두 iOS 장치의 동일한 안테나에 있으므로 무선 장치는 불필요한 잡담을 최소화하려고합니다. CoreBluetooth에서 업데이트 빈도를 제어하는 ​​옵션이나 방법을 추가하기 위해 버그를 신고 할 수는 있지만 기본 설계 목표는 다음과 같습니다. 1. 장치의 배터리를 불필요하게 소모하지 말고 2 다른 안테나의 라디오와 공존하십시오. (그들은 또한 애플 개발자 포럼에서 iOS BTLE 구현보다 더 높은 데이터 전송률을 원한다면 블루투스 클래식 또는이를 위해 설계된 것을 사용해야한다고 말했습니다 .BTLE은 저비용, 무엇보다 먼저 논리적으로 끝까지 다가갔습니다.)

4

나는 이미 이것을 알아 냈을 것입니다. coreLocation이있는 다른 iOS 기기를 사용하지 않는 경우 [self.myPeripheral readRSSI];을 사용하여 peripheralDidUpdateRSSI: 대리인에게 전화해야합니다.

didUpdateValueForCharacteristic:에서 RSSI 데이터 업데이트를 원하는만큼 자주 updateValue 대리인에서 호출 할 수 있습니다.

viewDidLoad에서는이 값이 필요하지 않습니다. NSDictionary *options = etc...이 NSDictionary는 didDiscoverPeripheral: 대리자에서 만들어집니다.

그래서 전체적인 흐름은 다음과 같습니다

확인 당신이 RSSI 데이터를 얻을 어디에 당신이 NSLog에 RSSI를 받고 그 ...

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

NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; 

if ([localName length] > 0){ 
    NSLog(@"Discovered: %@ RSSI: %@", peripheral.name, RSSI); 
    // your other needs ... 
} 

콜이 이후 여기 peripheralDidUpdateRSSI:는 YES로 값을 통지 설정 한 경우 업데이트가 지속적으로 발생하는 곳이다 [peripheral setNotifyValue:YES forCharacteristic:characteristic];

- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ 

//Call the peripheralDidUpdateRSSI delegate .. 
[self.myPeripheral readRSSI]; 

// do all of your other characteristic value updates here 
} 

readRSSI 당신이 당신의 UILabel의 (에 RSSI 업데이트를 수행하는 대리자를 호출합니다 또는 무엇을 사용하든) 이전 특성 값을 업데이트 할 때마다 :

- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error; 
{ 
_rssiLabel.text = [self.myPeripheral.RSSI stringValue]; 
NSLog(@"RSSI Method”); 
} 

charac 테리 스틱 값은 RSSI 값을 새로 고칠 필요가있는 타이밍에 루프를 실행하기 만하면됩니다.

0

실제로 지연은 peripheral.readRSSI()peripheralDidUpdateRSSI 사이입니다.

BLE 장치 자체의 RSSI 값을 읽고 iOS 장치로 보내는 것이 가장 좋은 방법이라고 생각합니다.

관련 문제