Ich habe seit dem iOS 8 Update ein Problem, momentan ist meine App mit einem BLE Gerät verbunden und liest den RSSI dank eines Timers und der ReadRSSI
Methode periodisch.
Die Methode readRSSI
wird aufgerufen (mit einem Haltepunkt überprüft), bis zu diesem Punkt ist alles in Ordnung.
Gemäß der Dokumentation sollte der Aufruf von readRSSI
den Rückruf auslösen
Diese Delegate-Methode wird jedoch nicht jedes Mal aufgerufen. 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?
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 ein ähnliches Programm, benutze das iPhone, um mich mit einem BLE-Beacon zu verbinden, und benutze [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 wenn ich das Bluetooth auf meinem iPhone neu starte, 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 mich wieder verbinde, kann die Methode readRSSI immer noch korrekt aufgerufen werden.
Ich hoffe, das kann helfen. Ich warte auch auf eine Antwort für diese seltsame Sache.
Ich bin kürzlich auf dieses Problem gestoßen und hatte mehrere Probleme, die es verursacht haben. Hier sind die Lösungen in Checklistenform, von den einfachsten zu den komplexesten:
CBCentralManager
wird keinen starken Bezug auf peripheral
haben, Sie müssen ihn selbst behalten. peripheral.delegate
. peripheral(peripheral:didReadRSSI:error:)
implementieren und nicht die alte. readRSSI
nur für Geräte verwenden, die mit Ihrer Zentrale verbunden sind.
[CBCentralManagerScanOptionAllowDuplicatesKey : true]
übergeben, wenn Sie scanForPeripheralsWithServices(_:options:)
ausführen. Wie in diese Antwort . central.retrieveConnectedPeripheralsWithServices
. Diese Methode gibt "verbundene" Geräte zurück, aber die Funktion readRSSI
funktioniert noch nicht, bis Sie tatsächlich connectPeripheral(_:options:)
aufrufen. Obwohl sie mit dem iPhone / iPad / AppleWatch verbunden sind, sind sie nicht mit verbunden zentral, sehr nervig. Das letzte war das große Problem für mich, ich hatte gehofft das "nächste" verbundene oder entdeckte Gerät zu wählen, konnte aber den RSSI nicht auf dem neuesten Stand halten. Die Dokumentation sagt auch nichts.
Was ich gemacht habe, war, ein großes Wörterbuch mit allen Geräten zu erstellen, die von [UUID : Device]
indiziert sind (das Gerät ist ein Wrapper für CBPeripheral
). Geräte, die über Discovery hinzugefügt werden, erhalten ihren RSSI über de discover-Methode und die verbundenen über einen GCD-Timer in der Bluetooth-Queue, die readRSSI
aufruft und ihren eigenen RSSI-Wert aktualisiert.
Ich habe 8.0, es funktioniert gut.
%Vor%Da oben in iOS 8 veraltet ist und der andere Delegierte versucht wird, wird dies gemeldet.
%Vor%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 beide Methoden verwende, wird didReadRSSI in iOS 8 & amp; peripheralDidUpdateRSSI wird in iOS 7 aufgerufen.
Aktualisieren Sie nicht auf iOS 8.0.2, bis Apples etwas für RSSI bereitstellt.
Hat jemand die Betaversion von iOS 8.1 getestet?
Sieht so aus, als ob 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 ReadRSSI.
Beachten Sie auch: Das Gerät muss im verbundenen Zustand sein, um Befehle auszugeben, sonst erhalten Sie: CoreBluetooth [API MISUSE] CBPeripheral kann Befehle nur im verbundenen Zustand akzeptieren.
Tags und Links ios bluetooth ios8 bluetooth-lowenergy core-bluetooth