2014-09-26 16 views
8

Ich habe ein Problem seit dem iOS 8-Update, jetzt ist meine App mit einem BLE-Gerät verbunden und liest den RSSI dank eines Timers und der ReadRSSI-Methode regelmäßig.ReadRSS ruft nicht die Delegate-Methode

Die readRSSI Methode wird aufgerufen (mit einem Breakpoint überprüft), bis zu diesem Punkt ist alles in Ordnung.

die Dokumentation gemäß den readRSSI Aufruf sollte die Callback-

- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error 

Doch diese Delegatmethode jedes Mal aufgerufen wird, nicht auslösen. Aber wenn ich das Telefon Bluetooth ein- und ausschalte, bekomme ich die RSSI Updates zurück. Ist schon jemand auf dieses Problem gestoßen? Wie kann ich es beheben?

+0

Versuchen Sie die Verbindung zu den Peripheriegeräten per [meine Antwort auf eine ähnliche Frage] (http://stackoverflow.com/a/27030526/4272525). –

+0

Ich musste mein iPhone zurücksetzen, um es wieder in Betrieb zu nehmen, indem ich die Power- und Home-Taste gedrückt hielt. – marcelosalloum

Antwort

4

Ich habe das gleiche Problem, dachte zuerst, es könnte meine Schuld sein, aber später stellt sich heraus, dass es wirklich komisch ist.

Ich schrieb ähnliches Programm, mit iPhone zu einem BLE Beacon verbinden, und verwenden [CBPeripheral readRSSI], um die Signalstärke zu erhalten. Alles läuft reibungslos, wenn das BLE Beacon zum ersten Mal mit meinem iPhone verbunden wird. Wenn die Verbindung getrennt wird und die Verbindung erneut hergestellt wird, wird die Methode readRSSI nicht mehr aufgerufen. Erst nachdem ich das Bluetooth auf meinem iPhone neu gestartet habe, wird das Problem gelöst.

Ich starte das Programm im Debug-Modus, Schritt für Schritt, zu meiner Überraschung fand ich überhaupt kein Problem. Selbst wenn ich die Verbindung so oft abbringe und die Verbindung wieder herstelle, kann die Methode readRSSI immer noch korrekt aufgerufen werden.

Hoffe, das kann helfen. Ich warte auch auf eine Antwort für diese seltsame Sache.

+0

Danke für deine Antwort, ich habe gerade einen Apple Bug Report ausgefüllt, ich werde euch auf dem Laufenden halten –

+0

Also hat Apple gerade meinen Bug als Duplikat der # 18476971 geschlossen, aber ich kann nicht darauf zugreifen, also habe ich keine Ahnung von der Apple Untersuchung –

+0

Ich denke, sie haben das Problem bereits erkannt, es scheint, dass die BLE in iOS8 viele Probleme hat. –

1

Ich habe 8.0, es funktioniert gut.

-(void) startScanForRSSI{ 

    timerRSSI = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(detectRSSI) userInfo:nil repeats:YES]; 

} 

- (void)detectRSSI { 

    if (state == ...) { 
     peripheral.delegate = self; 
     [peripheral readRSSI]; 
    } else { 
     if (timerRSSI && [timerRSSI isValid]) { 
      [timerRSSI invalidate]; 
     } 
    } 
} 



- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error { 



    NSLog(@"Got RSSI update: %4.1f", [peripheral.RSSI doubleValue]); 


    NSNumber *rssiNum = peripheral.RSSI; 
} 

Da oben in iOS 8 veraltet ist, versuchen die anderen Delegaten, wird zurück melden.

-(void) peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error { 
    NSLog(@"Got RSSI update in didReadRSSI : %4.1f", [RSSI doubleValue]); 
} 

Dies scheint eine OSX-Delegate-Methode zu sein. Apple wird wahrscheinlich bald etwas in iOS für RSSI hinzufügen.

In iOS 8.0 funktioniert didReadRSSI. In der 8.0.2 Dokumentation ist es nicht unter iOS aufgeführt.

Wenn ich setzen beide Methoden didReadRSSI in iOS aufgerufen wird 8 & peripheralDidUpdateRSSI in iOS aufgerufen wird 7.

So aktualisieren nicht auf iOS 8.0.2 bis Äpfel etwas für RSSI bringt.

Hat jemand die Betaversion von iOS 8.1 getestet?

Sieht aus wie beim Scannen nach Geräten der RSSI nicht gelesen werden kann. Wenn der Aufruf von [CBCentralManager scanForPeripheralsWithServices ...] initiiert wurde, tritt kein Effekt von ReadRSSI auf (es werden keine Delegierten aufgerufen). Wenn jedoch [CBCentralManager stopScan] ausgegeben wird, reagiert die ReadRSSI.

Hinweis: Das Gerät muss im verbundenen Zustand sein, um Befehle auszugeben, andernfalls erhalten Sie: CoreBluetooth [API MISUSE] CBPeripheral kann nur Befehle annehmen, während es sich im verbundenen Zustand befindet.

2

Ich bin kürzlich auf dieses Problem gestoßen und ich hatte mehrere Probleme, die es verursacht haben.Hier ist die Lösungen in Prüfliste Art und Weise, von der einfachsten bis zu komplexen:

  1. Die CBCentralManager keinen starken Hinweis auf die peripheral halten, müssen Sie sie selbst halten.
  2. Stellen Sie sicher sind eigentlich die peripheral.delegate.
  3. Stellen Sie sicher, dass Sie die neue Methode peripheral(peripheral:didReadRSSI:error:) implementieren und nicht die alte.
  4. iOS 8.0.2 führte Probleme mit der obigen Methode ein, jede Version danach 8.1, 8.2, 8.3, funktioniert ohne Probleme (Was @ Gamma-Point erwähnt).
  5. Sie können nur readRSSI für Geräte, die an zentralen verbunden sind, so:
    1. Für Geräte, die durch Entdeckung abgerufen, können Sie [CBCentralManagerScanOptionAllowDuplicatesKey : true] passieren, wenn scanForPeripheralsWithServices(_:options:) tun. Wie in this answer gesehen.
    2. Auch gibt es eine gotcha mit der Methode central.retrieveConnectedPeripheralsWithServices. Diese Methode gibt "connected" Geräte zurück, aber die readRSSI noch Service Discovery funktioniert bis Sie tatsächlich connectPeripheral(_:options:) auf ihnen anrufen, so dass, obwohl sie mit dem iPhone/iPad/AppleWatch verbunden sind, sie nicht mit Ihre Zentrale verbunden sind, sehr ärgerlich.

Das letzte war das große Gotcha für mich, ich hatte gehofft, verbunden oder erkanntes Gerät, um „die nächste zu holen“, konnte aber die RSSI nicht behalten sie aktualisiert. Dokumentation sagt auch nichts.

Was ich getan habe, war, ein großes Wörterbuch mit allen Geräten zu erstellen, die von [UUID : Device] indiziert wurden (Gerät ist ein Wrapper für die CBPeripheral). Geräte hinzugefügt über Entdeckung erhielten ihre RSSI aktualisiert über de Methode zu entdecken, und die, die über einen GCD-Timer auf der Bluetooth-Warteschlange verbunden, die readRSSI Anrufe und ihre eigenen RSSI Lesen aktualisieren.

Verwandte Themen