2015-12-22 7 views
5

Mein Ziel ist es, das Android-Gerät wieder mit einem verbundenen BLE-Gerät zu verbinden, ohne Benutzereingriff in der gleichen Weise wie es für ein klassisches BT gepaartes Gerät tut (sogar funktioniert durch Power Cycles).Android: BLE-Geräte automatisch neu verbinden

Eine der Ideen von BTLE-Geräten ist, dass man Service-, Bonding- und Enable-Zustände spart, so dass eine Reconnect-Verbindung sehr schnell ist und sehr wenig Strom für das Peripheriegerät verbraucht.

Was ich getan habe, scheint zu funktionieren, aber es funktioniert schlecht.

Der erste Schritt besteht darin, eine Verbindung zu einem neuen Gerät herzustellen, eine Verbindung herzustellen und eine Verbindung herzustellen, indem der Parameter 'autoconnect' auf 'true' gesetzt wird. Wenn das Gerät die Verbindung trennt, rufen Sie nicht gatt.close(). Überall, wo ich hinsehe, sehe ich, dass man gatt.close() nennen soll. Aber wenn ich gatt.close() anrufe, wird die zentrale Android-App nie wieder verbunden. Ich habe das viele Male getestet.

Wenn ich gatt.close() nicht angerufen habe und den Android nicht ausgeschaltet habe, geschieht die automatische Verbindung normalerweise. Manchmal kann es lange dauern, besonders nach Version 5.0. Es ist jedoch unzuverlässig und es kann unzuverlässig sein aufgrund eines Scanzyklus mit sehr geringer Auslastung und dem Beenden der Werbung durch das Gerät, bevor ein Scanzyklus tatsächlich die Werbung erkennt. Ich bin mir nicht sicher, weil es keine Möglichkeit gibt, den Scanvorgang zu erkennen, wie es Werbung gibt! Es ist auch möglich, dass der Scan nach einer gewissen Zeit stoppt, aber es gibt keine Dokumentation darüber.

Also was ich denke, ich muss irgendwie die Hintergrund-Scan-Rate von Android zu einem höheren Arbeitszyklus (nur möglich in 5.0 und höher), wenn automatische Verbindung festgelegt wurde, aber ich weiß nicht wie um dies zu tun. Ich möchte meinen eigenen Scan nicht starten, aber irgendwie die von Android verwendete Hintergrund-Scanrate für die Wiederverbindung einstellen. Weiß jemand, wie man das macht? Weiß jemand wirklich wie autoconnect und gatt.close() funktionieren sollen?

Vielleicht war die automatische Verbindung nicht dazu gedacht, wie oben beschrieben wieder zu verbinden?

+0

Für eine Wiederverbindung müssen Sie immer werben oder scannen. Haben Sie das in der Kernspezifikation versucht? Viele der Fragen, die Sie stellen, sind da drin; wie "setze Hintergrundabtastrate auf einen höheren Arbeitszyklus", womit du wahrscheinlich Scanfenster und -intervall meinst, was durch Einstellen der Scanparameter gehandhabt wird. Die Art der Werbung ist ebenfalls wichtig (Verbindungslos, verbindbar). Bitte geben Sie einen Teil Ihres Codes an, der das Scannen/Anzeigen sowohl auf Ihrem Master als auch auf Ihren Peripheriegeräten behandelt. – Zimano

+0

@ Zimano Ich bin mir der Kernspezifikation bewusst. Ich habe eingebettete BLE-Collectors programmiert, und dort muss man all diese winzigen Details angeben. Auf der Android-Plattform hat man allerdings deutlich weniger Kontrolle (meist erleichtert das Leben) und man weiß oft nicht, was Android unter der Haube macht. Was ich nicht weiß ist, wie Android seine Scan-Rate konfiguriert, wenn ich den Autoconnect-Parameter auf True eingestellt habe. Es ist wahrscheinlich eine niedrige Auslastung, und es kann sich wahrscheinlich im Laufe der Zeit ändern, da die Verbindung unterbrochen ist. Was ich also tun möchte, ist herauszufinden, wie man diese Abtastrate auf einen höheren Arbeitszyklus konfiguriert. –

+0

@Zimano Ich nehme an, ich wäre sogar froh zu wissen, was die Abtastraten sind (ohne den Quellcode zu durchforsten).Ich habe viele Peripheriegeräte für medizinische Geräte und alle werben mit unterschiedlichen Geschwindigkeiten (selten gelenkt), aber diese sind mit einem Schnüffler leicht zu erkennen. –

Antwort

1

Nun, nach vielen Versuchen und Schwierigkeiten, bekomme ich am besten eine Android-Verbindung mit der einzigen Benutzeraktion, die zuerst das Gerät auswählt (wenn das Einstellungsmenü verwendet wird, dann die erste Paarung).

Sie müssen das gepaarte Ereignis in einem BroadcastReceiver abfangen und ein BluetoothDevice.connectGatt() ausführen, das autoconnect auf true setzt. Wenn das Gerät getrennt wird, rufen Sie gatt.connect() auf.

+1

Haben Sie einen Beispielcode, der dies implementiert? – linus

+1

@brian könnte bitte einen Beispielcode dafür bereitstellen. Das wird uns sehr helfen. –

+0

Oh Gees. Warum wurde ich nicht über diesen Kommentar informiert? Es ist ein Jahr alt! –