Das iPhone erkennt beim erneuten Verbinden keine Dienste auf einem Bluetooth LE-Tag

8

Ich arbeite an einer Bluetooth LE-Anwendung für iOS. Ich benutze das Core Bluetooth Framework innerhalb von iOS, um die gesamte Kommunikation abzuwickeln.

Frage & amp; Beschreibung:

Wenn ich trotz zahlreicher Verbindungen und Verbindungsabbrüche ein einzelnes Tag verwende, verbindet sich das einzelne Tag nahtlos und das Telefon erkennt seine Dienste.

Wenn sich mehrere Bluetooth LE-Tags zum ersten Mal verbinden, werden sie nahtlos verbunden und das Telefon erkennt ihre Dienste.

Wenn die Tags getrennt und dann wieder mit dem Telefon verbunden werden, sind die Tags gut miteinander verbunden. Aber eines der beiden Tags (entweder eins) scheint seine Dienste nicht zu bewerben. Wenn die App geöffnet ist und das Tag erneut verbunden wird, ruft die DiscoverServices -Methode nicht den didDiscoverServices -Delegaten auf.

Warum passiert das nur, wenn eine Verbindung mit mehreren Geräten stattfindet?

Ich habe peripheres.delegate korrekt eingestellt. Ich habe alles versucht, einschließlich wiederholter Wiederverbindung, wiederholte DiscoverServices Aufrufe an das Tag. Nichts scheint zu funktionieren.

Wie kann ich eine Verbindung mit mehreren Tags zum Telefon herstellen und trotzdem alle Dienste finden?

Bitte helfen Sie

Danke, Danke Manju

    
Manju Kiran 17.08.2012, 11:08
quelle

8 Antworten

1

Es stellt sich heraus, dass der Befehl, den ich an das Gerät ausgegeben habe, in der Delegatmethode didDiscovercharacteristicsForService war, die die Verbindungsinstabilität verursacht hat.

Wenn Sie mit ähnlichen Problemen konfrontiert sind, schlage ich vor, dass Sie die Delegate-Methode ohne jegliche Intervention ( jeder Art ) abschließen und das CBPeripheral an eine andere Funktion übergeben, die von Ihnen für die Übergabe von Werten / Ausgabe eines Befehls verwendet wird die Geräte.

Danke trotzdem Wilhemsen.

Also sind die Schritte wie folgt ..
1 & gt; Suche nach Tag,
2 & gt; Wenn in Reichweite, CONNECT to Tag
3 & gt; Wenn Verbunden, rufen Sie die DISCOVER-Services-Methode auf (nicht unterbrechen) 4 & gt; IN DidDiscoverServices, rufen Sie DISCOVER Merkmale Methode
auf ..
Warten Sie in der DidDiscoverCharacteristics-Methode, bis alle Merkmale ermittelt wurden. Rufen Sie dann am Ende eine Funktion in Ihrem Code auf, die die notwendigen Einstellungen vornehmen wird.
...
Codebeispiel

%Vor%     
Manju Kiran 29.08.2012, 05:17
quelle
20

Ich hatte das gleiche Problem, erkannte aber, dass ich delegate nicht auf CBPeripheral setzte, nachdem didConnectPeripheral aufgerufen wurde.

%Vor%     
jhalla14 16.04.2014 17:28
quelle
11

Ich hatte ein ähnliches Problem mit CoreBluetooth, um mich mit Bluetooth LE-Geräten zu verbinden, in meinem Fall mit iOS-Geräten (Peripheriegeräten) von meinem Mac (zentral) aus.

Wenn ich Sie richtig verstehe, ist das Muster ziemlich konsistent, das erste Mal, dass ich meine Mac-App zum Debuggen verwende, erkennt und verbindet sie immer mit Bluetooth-LE-Geräten (Peripheriegeräten), vor allem entdeckt sie auch ihre Dienste / Eigenschaften fein. Das Problem beginnt mit dem zweiten Durchlauf (zum Beispiel, ändern Sie etwas Code, drücken Sie cmd-R, um das Debug neu zu starten). Die Zentrale erkennt immer noch Peripheriegeräte und stellt eine Verbindung zu ihnen her, jedoch werden keine Dienste / Merkmale gefunden. Mit anderen Worten, die Delegierten peripheral:didDiscoverServices: und peripheral:didDiscoverCharacteristicsForService:error: werden nie aufgerufen.

Die Lösung nach vielen Versuchen und Fehlern ist überraschend einfach. Es scheint, dass CoreBluetooth services und characteristics für Peripheriegeräte zwischenspeichert, die immer noch verbunden sind. Obwohl es lokal aussieht, als wäre es mit der App verbunden, unterhält das Peripheriegerät immer noch eine Bluetooth-Verbindung zum System. Für diese Art von Verbindungen müssen Sie die Dienste und Merkmale nicht (wieder) entdecken, sondern greifen direkt auf das Peripherieobjekt zu. Suchen Sie nach nil , um zu erfahren, ob Sie diese entdecken sollten. Da das Peripheriegerät wie erwähnt in einem Zustand ist, der zwischen Verbindungen liegt, ist es am besten, vor dem Verbindungsversuch cancelPeripheralConnection: right aufzurufen. Der Kern davon, wie folgt, vorausgesetzt, wir haben bereits entdeckt, dass die Peripherie zu verbinden:

%Vor%

Dies funktioniert gut für mich für einen CBCentralManager in Mac App. Habe es nie in iOS getestet, aber ich gehe davon aus, dass es ziemlich ähnlich sein sollte.

    
P.L. 03.02.2014 14:58
quelle
0

Ich mache alles, was Sie in Ihrer Antwort sagen, aber ich sehe dieses Problem von Zeit zu Zeit. Meine Vermutung ist, dass Core Bluetooth in einen seltsamen Zustand gerät, wahrscheinlich aufgrund einer bestimmten Reihenfolge von Verbindung, Abonnement und Trennung.

Die einzige Möglichkeit, das Problem zu beheben, besteht darin, das iOS-Gerät neu zu starten. Dieses Problem kann jedoch in iOS 7.1 behoben werden.

    
Mark 20.01.2014 16:05
quelle
0

Ich habe das gleiche Problem. es scheint ungefähr 1/3 der Zeit in meinem Fall zu vorkommen. Ich habe die Lösung von P.L. aber ich hatte keinen Erfolg auf iOS. Es gibt vielleicht viele bewegliche Teile hier, die zu diesem Problem beitragen können (Bluetooth-Geräte-Firmware, CoreBluetooth usw.), aber ich habe es gelöst, indem ich einfach die Geräte verfolgt habe, die in einem NSMutableDictionary und der Verwendung von GCD zu Service- / Merkmalserkennung ausstehen Überprüfen Sie, ob die Entdeckung in angemessener Zeit abgeschlossen wurde und versuchen Sie es gegebenenfalls erneut. So etwas wie das:

%Vor%

Dann, wenn peripheral:didDiscoverServices:error zurückruft, entferne ich es aus meinem pendingConnectionDevices-Wörterbuch. Das scheint ziemlich gut zu funktionieren. Ich habe es bis zu dreimal gesehen, bis ich Erfolg hatte. Ich hoffe, das hilft.

    
Grahambo 12.04.2014 20:54
quelle
0

Manchmal ist es Hardware-Problem. Ich bin gerade auf einen Fall gestoßen, in dem die Hardware in einen Schlafmodus übergeht, der scanbar, verbindbar, aber für discoverServices überhaupt nicht zurückrufbar ist.

Es gibt auch eine Situation, die mir bei der Entwicklung von BLE die ganze Nacht widerfuhr und plötzlich wurde das Gerät für discoverServices zur Stille, egal was ich tat. Schließlich habe ich festgestellt, dass es normal wird, wenn ich mein iPhone5s neu starte.

Und eines Tages sagte mir der Bluetooth-Hardware-Ingenieur, dass die Spezifikation von BLE nur besagt, dass das Gerät innerhalb von 30 Sekunden wieder verbunden sein muss. Wenn ich mich also immer wieder verbinde und abtrenne, funktioniert es vielleicht nicht wie erwartet ... Was ich noch bezweifle.

    
Orange 28.01.2016 06:59
quelle
0

Meine Kopfschmerzen wurden durch den Mangel an starken Bezug auf periphere

verursacht

Also habe ich die Referenz hinzugefügt und das Problem ist weg

%Vor%     
HotJard 12.10.2016 10:10
quelle
0

Ich habe versucht, alle obigen Antworten anzuwenden, aber es funktionierte nicht für mich, weil mir CBPeripheralDelegate in der Klasse fehlte.

%Vor%     
Maihan Nijat 24.11.2017 01:03
quelle