2016-11-23 2 views
0

Ich bekomme nicht den richtigen Signalwert für den Abstand zwischen dem iPhone und dem Bluetooth-Gerät. Ich habe das Peripheral Gerät mit dem folgenden Code verbunden.Ich bekomme nicht den richtigen Signalwert für den Abstand zwischen dem iPhone und dem Bluetooth-Gerät

- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ 

    if (central.state != CBCentralManagerStatePoweredOn) { 
     return; 
    } 

    switch (central.state) { 
     case CBCentralManagerStatePoweredOn:{ 
      centmanager = central; 
      NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
      [centmanager scanForPeripheralsWithServices:nil options:options]; 

      NSArray *uuidArray = @[uuid]; 
      NSArray *itemArray = [central retrieveConnectedPeripheralsWithServices:uuidArray]; 
      if ([itemArray count]>0) { 
       self.myPeripheral = [itemArray objectAtIndex:0]; 
       [centmanager connectPeripheral:self.myPeripheral options:nil]; 
      } 

      return; 
     } 
      break; 

     default: 
      break; 
    } 
} 

Und im Delegatmethode der CBCentralManagerDelegate, bekam ich den RSSI Wert, aber das ist nicht richtig und konsistent ist.

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


// Reject any where the value is above reasonable range 
    if (RSSI.integerValue > -15) { 
     NSLog(@"\n\n Above reasonable range and Range ==>>> %d",RSSI.integerValue); 
     return; 
     } 
// Reject if the signal strength is too low to be close enough (Close is around -22dB) 
    if (RSSI.integerValue < -35) { 
     NSLog(@"\n\n Out Of Range and Range ==>>> %d",RSSI.integerValue); 
     return; 
    } 
} 
+0

Sind Sie für den RSSI-Wert des angeschlossenen Gerätes suchen oder die Geräte in der Nähe? - centralManager: didDiscoverPeripheral: advertisementData: Die RSSI: -Methode gibt den RSSI-Wert der gescannten Geräte zurück, nicht des verbundenen Geräts. – Krrish

+0

Siehe http://stackoverflow.com/a/30174335/294949 – danh

+0

@Krrish Vielen Dank für die freundliche Antwort. Wie erreiche ich die Entfernung des angeschlossenen Bluetooth-Geräts? –

Antwort

1

Die CBCentralManager Delegatmethode:

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

Dies gibt die Anzeigedaten für die gescannten Peripheriegeräte heißt die Peripheriegeräte in Ihrer Nähe, aber nicht mit ihm verbunden. In den meisten Fällen stoppt eine App, sobald sie eine Verbindung zu einem Peripheriegerät herstellt, ihre Werbung (hängt jedoch von der Implementierung in der Hardware ab).

Erste RSSI von angeschlossenen Peripherie

Dies ist, was ich getan habe für mein Projekt Kontinuierlich Update von RSSI zu bekommen und es funktioniert.

verbunden Sobald

[self.connectedPeripheral setDelegate:self]; 
[self.connectedPeripheral readRSSI]; 

Dies ruft die CBPeripheralDelegate Methode

/*! 
* @method peripheral:didReadRSSI:error: 
* 
* @param peripheral The peripheral providing this update. 
* @param RSSI   The current RSSI of the link. 
* @param error  If an error occurred, the cause of the failure. 
* 
* @discussion   This method returns the result of a @link readRSSI: @/link call. 
*/ 
- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(nullable NSError *)error { 
    if([self.connectedPeripheral isEqualTo:peripheral]) { 
     // <Use the RSSI value> 

/* 
* Call the readRSSI method again after a certain time, I am using 
* RSSI_UPDATE_INTERVAL -> 5 secs 
* This will get you an update of RSSI continuously 
*/ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, RSSI_UPDATE_INTERVAL * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [peripheral readRSSI]; 
     }); 
    } 
} 
+0

Vielen Dank für die Lösung. Eigentlich habe ich diese Methode ausprobiert, um die RSSI zu lesen, aber die Methode readRSSI hat das zweite Mal nicht aufgerufen und ich habe keine Ahnung, dass ich diese Methode auch zum zweiten Mal mit der Zeitdauer aufrufen kann. Nochmals vielen Dank für den Code und Ihre großartige Idee. :) –

Verwandte Themen