2013-08-14 7 views
5

Sorry für den langen Titel, aber wir haben ein ziemlich interessantes Problem mit Corebluetooth für iOS. Wir rufen einen Anruf zum Abrufen von Peripheriegeräten in CBCentralManager auf und können das zuvor gekoppelte Gerät finden.Der Versuch, zuvor gepaarte Bluetooth-Geräte in der IOS-App abzurufen, wird nicht mit einem Fehler beantwortet, wenn das Gerät ausgeschaltet ist

Dies geschieht jedoch obwohl das Gerät ein- oder ausgeschaltet ist. Ich kann nichts in der Dokumentation von Apple finden, warum es das Gerät finden kann, wenn es ausgeschaltet ist und es nicht unter Einstellungen -> Bluetooth -> Geräte angezeigt wird. Ich vermute, dass Apple diese Informationen zwischenspeichert, kann aber keine Dokumentation finden, um dies zu bestätigen. Wenn das Gerät ausgeschaltet ist und wir den Verbindungsaufruf ausführen, wird das Programm weiterhin normal ausgeführt, aber der Delegat für didFailToConnect wird nie aufgerufen. Wenn das Gerät eingeschaltet wird, wird es sofort verbunden.

Gibt es eine Möglichkeit, einen Timeout-Parameter zu übergeben, wenn Sie versuchen, eine Verbindung zu einem Gerät herzustellen? Wenn nicht, was wäre die beste Lösung für die erneute Verbindung zu einem zuvor verwendeten Gerät für eine Anwendung (wir speichern das letzte verbundene Gerät in der App).

Antwort

7

Zwei Punkte, die Sie brauchen, um über retrievePeripherals: und connectPeripheral:

1.) retrievePeripherals: versucht zu wissen, das CBPeripheral Objekt im Zusammenhang mit der UUID Sie liefern abzurufen. Selbst wenn das ble-Gerät ausgeschaltet ist (oder auf der anderen Seite des Landes), gibt retrievePeripherals: immer noch eine Instanz von CBPeripheral zurück, die Sie connectPeripheral: anrufen können. Dies geschieht absichtlich, so dass Sie einen Anruf an ein Peripheriegerät senden können, das nicht einmal in der Nähe ist und immer noch automatisch eine Verbindung zu ihm herstellt, wenn es wieder in Reichweite kommt. Es erzeugt im Grunde eine Markierung innerhalb des Systems Bluetooth, so dass es, wenn das Gerät tatsächlich gesehen wird, wissen wird, dass es sich mit ihm verbinden sollte.

2.) connectPeripheral: wird nicht Timeout, es sei denn, der Kommunikationskanal ist mit dem tatsächlichen Gerät unterbrochen. Wenn das iOS-Gerät das Gerät nicht erkannt hat, wird es nicht fehlschlagen und sollte keine Zeitüberschreitung verursachen (es sei denn, es ist ein Fehler im System-Bluetooth aufgetreten).

Und wie für den Timeout-Parameter gibt es keinen dokumentierten Weg innerhalb der CoreBluetooth Rahmen. Sie können Ihre eigene Implementierung dafür erstellen, aber ich glaube, Sie wären besser dran, wenn Sie eine Liste der Peripherie-Uuids, die Sie tatsächlich genannt haben, auf connectPeripheral: und dann nur aus der Liste, wenn sie verbinden. Wenn Sie keine Verbindung mehr mit einem Peripheriegerät in der Liste herstellen möchten, rufen Sie cancelPeripheral: für diese UUID auf, rufen Sie andererseits connectPeripheral: auf und tauschen Sie die Einträge aus. Gut zu gehen.

+0

Kann ich alle manuell gekoppelten Geräte in den Einstellungen abrufen? –