iPhone nicht entdecken Sie die Dienste auf einem Bluetooth-LE-Tags nach Wiederherstellung der Verbindung
Arbeite ich an einem Bluetooth-LE-Anwendung für iOS. Ich bin mit dem Core-Bluetooth-framework innerhalb von iOS, um alle Kommunikation.
Frage & Beschreibung:
Wenn ich einen einzelnen tag, trotz der zahlreichen verbindungen und Trennungen, die einzelne tag verbindet nahtlos, und das Telefon entdeckt it-services.
Auch, wenn mehrere Bluetooth-LE-tags verbinden zum ersten mal, Sie verbinden sich nahtlos und das Telefon entdeckt Ihre Dienste.
Wenn die tags getrennt werden und dann wieder eine Verbindung zum Telefon, die tags, die Verbindung in Ordnung. Aber eines der beiden tags (entweder eine) scheint nicht werben seine Dienste. ich.e, wenn die app geöffnet ist und der tag wieder her, die DiscoverServices Methode nicht aufrufen, die didDiscoverServices delegieren.
Warum ist das passiert nur wenn die Verbindung mit mehreren Geräten erfolgt.
Ich habe den Peripherie.delegieren richtig. Ich habe alles versucht, einschließlich der dabei wiederholt, re-connect, wiederholt DiscoverServices Aufrufe an den tag. Nichts scheint zu funktionieren.
Wie kann ich das wieder-verbinden Sie mehrere tags auf dem Handy und immer noch entdecken Sie alle Dienste.
Bitte helfen
Danke,
Manju
- Sollten Sie post-code für diese. corebluetooth ist ein bisschen buggy, und ich selbst hatte Mühe, die mit diesem Rückruf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem, aber gemerkt, dass ich nicht die Einstellung der
delegate
zuCBPeripheral
nachdidConnectPeripheral
genannt wird.Ich Stand vor einem ähnlichen Problem mit CoreBluetooth Verbindung zu Bluetooth-LE-Geräte, in meinem Fall die Verbindung zu iOS-Geräten (Peripherie) von meinem Mac (zentrale).
Wenn ich Sie richtig, das Muster ist ziemlich konstant, das erste mal, dass ich meine Mac-app für das debugging, die es immer erkannt, und eine Verbindung zu jedem bluetooth-LE-Geräte (Peripheriegeräte), die meisten wichtiger ist, es auch entdecken Sie Ihre Dienstleistungen/Merkmale fein. Das problem beginnt, auf die Sekunde ausführen (zum Beispiel, einige Codezeilen ändern, drücken Sie " cmd-R starten Sie den debug). Die zentrale erkennt Peripheriegeräte und Verbindung zu Ihnen, aber, es nicht zu entdecken Sie irgendwelche Dienste/Eigenschaften. In anderen Worten, die Delegierten
peripheral:didDiscoverServices:
undperipheral:didDiscoverCharacteristicsForService:error:
nie aufgerufen werden.Die Lösung nach einer Menge von Versuch und Fehler, ist überraschend einfach. Es scheint, dass CoreBluetooth-caches
services
undcharacteristics
für Peripheriegeräte, die sind immer noch verbunden, obwohl das lokal sieht es aus wie es gewesen war, getrennt werden, um die app, die Peripherie-immer noch behauptet, eine bluetooth-Verbindung zu dem system. Für diese Art der verbindungen, gibt es keine Notwendigkeit, um (re)entdecken Sie die Dienstleistungen und Merkmale, nur auf Sie zugreifen, direkt aus dem peripheren Objekt, prüfennil
zu wissen, wenn Sie sollten Sie zu entdecken. Auch, wie bereits erwähnt, da die Peripherie ist in einem Zustand, in zwischen-verbindungen, ist es am besten anrufencancelPeripheralConnection:
rechts, bevor Sie versuchen, zu verbinden. Der Kern von ihm wie folgend, davon aus, dass wir bereits vor der periphere verbindet:Dies funktioniert gut für mich für eine CBCentralManager in den Mac app. Nie getestet in iOS, aber ich nehme an, es sollte sehr ähnlich sein.
Stellt sich heraus, dass es war der Befehl, den ich sendete das Gerät in den"didDiscovercharacteristicsForService" delegate-Methode, die verursacht wurde die Verbindung instabil werden.
Wenn Sie vor ähnlichen Problemen, ich schlage vor, Sie lassen die delegate-Methode, die vollständig ohne jede intervention (jeglicher Art) und übergeben Sie die CBPeripheral zu einer anderen Funktion, die Sie entwickelt haben, zu übergeben, Werte /Ausgabe ein Befehl an die Geräte.
Trotzdem danke Wilhemsen.
Also die Schritte sind wie folgt..
1> Suche für den Tag,
2> Wenn in Reichweite ist, VERBINDEN Tag
3> Wenn Verbunden, nennen ENTDECKEN Sie die Dienstleistungen, die Methode (nicht unterbrechen)
4> IN DidDiscoverServices, rufen Sie ENTDECKEN Eigenschaften Methode
..
In DidDiscoverCharacteristics Methode, warten Sie, bis alle Eigenschaften werden entdeckt..
Dann , am Ende, aufrufen einer Funktion in Ihrem code, dass die notwendigen setup -..
...
Code-Beispiel
Habe ich das gleiche Problem. es scheint auftreten, etwa 1/3 der Zeit in meinem Fall. Ich habe versucht, die Lösung zur Verfügung gestellt von P. L. aber ich hatte keinen Erfolg auf iOS. Es gibt vielleicht viele bewegliche Teile hier am Werk, die dazu beitragen können, um dieses problem (bluetooth-Geräte-firmware, CoreBluetooth, etc.) aber ich löste es, indem Sie einfach den überblick über die Geräte, die anhängig sind, die Dienst/Merkmal Entdeckung in einem NSMutableDictionary und mit GCD zu prüfen, ob es fertig gestellt hatte, es ' s discovery in einer angemessenen Höhe der Zeit und versucht erneut, falls erforderlich. So etwas wie dieses:
Dann, wenn
peripheral:didDiscoverServices:error
ruft zurück, Entferne ich es von meinem pendingConnectionDevices Wörterbuch. Dieser scheint ziemlich gut zu funktionieren. Ich habe gesehen, es zu versuchen, zu entdecken, die Dienstleistungen, die bis zu 3-mal, bevor Sie Erfolg. Ich hoffe, das hilft.Manchmal ist es hardware-Problem. Ich habe gerade festgestellt Fall, dass die hardware wird Sie in einen Schlaf-Modus, die scannbarer, anschließbar, aber nicht zurück rufen, bei der alle für discoverServices.
Auch dort ist eine situation, die mir passiert ist bei der Entwicklung von BLE die ganze Nacht und plötzlich, das Gerät geworden ist Stille für discoverServices egal, was ich Tat. Schließlich fand ich es normal geworden, wenn ich neu starte mein iPhone5s.
Eines Tages die bluetooth-hardware-Ingenieur sagte mir, dass die Spezifikation der BLE nur sagt Gerät muss Anschließbare wieder innerhalb von 30 Sekunden. Also, wenn ich eine Verbindung herstellen und trennen Sie über und über wieder, es kann nicht wie erwartet funktioniert... Was ich immer noch bezweifle es.
War ich versucht, alle oben genannten Antworten, aber es funktionierte nicht für mich, weil ich fehlte
CBPeripheralDelegate
auf Klasse.Ich mache alles was Sie sagen in Ihrer Antwort, aber ich sehe immer noch dieses Problem von Zeit zu Zeit. Meine Vermutung ist, dass Core Bluetooth-Gerät in einen seltsamen Zustand, wahrscheinlich aufgrund einer bestimmten Sequenz von Anschluss -, Abonnements-und Abschaltung.
Die einzige Möglichkeit, die ich gefunden habe um das problem zu beheben ist, starten Sie das iOS-Gerät. Dieses Problem kann behoben werden in iOS 7.1 aber.
Meine Kopfschmerzen war verursacht durch Mangel an starken Bezug zu peripheren
Also ich habe den Verweis hinzuzufügen und das problem ist Weg