Wie zu erkennen, wenn ein BLE-Gerät nicht in Reichweite ist, nicht mehr?
Verwende ich eine LeScanCallback (kann nicht mit der neueren scan-Methoden, weil ich die Entwicklung für die api-18. Nicht, dass es darauf ankommt, da das android-5.0+ - apis bieten nicht diese Funktionalität entweder) zu erkennen, wenn eine in der Nähe BLE-Gerät erkannt wird:
private BluetoothAdapter.LeScanCallback bleCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice bluetoothDevice, int i, byte[] bytes) {
discoveredDevices.add(bluetoothDevice);
}
};
Ich bin nicht koppeln oder verbinden mit den Geräten, denn das ist nicht nötig, ich will einfach sehen, welche Geräte in der Nähe.
Ich versuche zu machen, ein Dienst, der alle 5 Minuten oder so, nennt einen webserver zu aktualisieren, welche Geräte in der Nähe in diesem moment.
Schwierige Teil ist, dass das android-Gerät bewegt, so dass ein bluetooth-Gerät in der Nähe ist, gerade jetzt, vielleicht nicht in 5 Minuten. In diesem Fall, die ich brauche, um es zu entfernen aus discoveredDevices
.
Im Idealfall würde ich mag, um zu erhalten einen Rückruf, wenn ein bluetooth-Gerät in Reichweite vor, aber nicht mehr. Dieser Rückruf nicht vorhanden obwohl.
(Ich bin mir bewusst, dass der android.bluetooth.device.action.ACL_CONNECTED
und android.bluetooth.device.action.ACL_DISCONNECTED
Sendungen, aber diese sind wenn Sie die Verbindung zu einem bluetooth-Gerät, das ich nicht will.)
Option ist zu tun, einen frischen scan alle 5 Minuten, aber man kann nicht sagen, wenn alle Geräte in der Nähe entdeckt worden, so würden Sie zu tun haben, die eine zeitgesteuerte scan, z.B. scan für 5 Sekunden und dann schicken die gesammelten Daten an den webservice.
Das klingt schmutzig und riskant, weil man kann ja nie wissen, für sicher, dass alle Geräte in der Nähe entdeckt wurden, innerhalb der vorgegebenen Zeit, so würde ich sehr gerne vermeiden, tun Sie es so.
Gibt es einen anderen Weg, dies zu tun?
Bearbeiten
Einige Geräte ständig berichten die Entdeckung der nahe gelegenen bluetooth-Geräten, sogar dann, wenn Sie bereits entdeckt werden, bevor. Wenn diese Funktionalität wurde von universal konnte ich mein problem lösen, aber dieser ist gerätespezifisch.
Mein Handy den bluetooth-adapter zum Beispiel nur entdeckt Geräte in der Nähe einmal. Einige andere Geräte, die ich getestet habe, mit tun berichten kontinuierlich die gleichen Geräte in der Nähe, aber nicht alle Geräte haben, so kann ich nicht auf das verlassen, leider.
- Nie-scan auf einer Schleife, und eine Frist setzen, auf Ihren scan. Ein Gerät, das zuvor verfügbar war, haben möglicherweise bewegt sich außerhalb des Bereichs aus-und Weiterbildung zu Scannen, entlädt sich der Akku.Der Benutzer muss manuell eine Verbindung herstellen...
- Ich bin mir nicht sicher, ob ich verstehe, was du redest. Ich nicht Scannen möchte, mit einer Frist, so Frage ich nach anderen Möglichkeiten
- ich hatte das entwickelt, was Sie benötigen, nicht die saubere Art und Weise vielleicht, aber nicht finden bessere Optionen. Es kann getan werden, wenn du ein paar scans und die entsprechenden Geräte-Listen, wenn man bedenkt, wenn Gerät 'a' liegt in der Nähe der ersten und zweiten scans, legen Sie es in die endgültige Liste wird an den server gesendet, verwerfen diejenigen, die nicht auf den Listen der beiden scans
- das heißt, wenn Sie benötigen, senden Sie die Daten an server alle 5 Minuten, kann es 2 scans in 5 Minuten und eine Letzte Liste für die gängigen Geräte von den beiden, auf diese Weise können sehr präzise
- Ich sehe nicht den Vorteil der Verwendung einer zweiten Liste. Wie auch immer, das erfordert noch einen scan mit einem festen Zeit-limit, no?
- ja, Sie benötigen 2 scans zu erkennen, wenn ein ble-Gerät in Reichweite ist oder nicht, denn wenn das Gerät 'nicht in Reichweite' ist, dann gibt es keine Möglichkeit zu kommunizieren, wie auch immer... so Ironie in Kreisen mit nur einem scan
- ich Verstand nicht, Ihre Bearbeitung, in der Frage, was ist der Sinn des Geräte melden sich in der Nähe von Geräten, die einmal oder ständig ? glaube nicht, dass reporting -einmalig oder fortlaufend - ohne Scannen...
- Ich bin nicht der Kommunikation mit den Geräten, nur die Berichterstattung über die Anwesenheit von Ihnen. Was Sie tun, mit 2 scans kann getan werden, mit 1 scan, indem Sie einfach das löschen der Liste der Geräte in der Nähe nach jedem scan. Was ich meine "Berichterstattung" ist der Rückruf feuern, wenn ein Gerät geprüft wurde.
- ok, ich spreche für die Berichterstattung über die Geräte, die in der Nähe sind für eine gewisse Zeit.., dass wenn man mit 1-scan ist nur das senden der device list auf dem server, mit 2 scans in der gleichen Dauer, wenn Sie ein paar Geräte außer Reichweite gebracht wird, brauchen Sie nicht einbezogen werden in das, was an den server gesendet wird..das ist ein Weg zu finden, Geräte nicht in Reichweite ist - von der mobilen Ende.. sonst kann der server herausfinden, durch den Vergleich von Daten, die es erhält
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das klingt wie eine vernünftige Annahme, aber falsch.
Bluetooth low energy funktioniert in einer bestimmten Weise und BLE-Geräte haben einige Einschränkungen. Zum Beispiel, Sie haben eine Feste Auswahl an möglichen Werbe-Frequenzen, Temperaturen von 20 Millisekunden bis 10.24 Sekunden, in Schritten von 0,625 Millisekunden. Sehen hier und hier für weitere detaillierte Informationen.
Dies bedeutet, dass es kann nehmen bei den meisten 10.24 Sekunden, bevor das Gerät übertragen wird, eine neue Werbung Paket. BLE-Geräte in der Regel, wenn nicht immer, eine Möglichkeit bieten, für Ihre Besitzer zu passen Ihre Werbung-Frequenz, also die Frequenz kann natürlich variieren.
In Fällen, In denen Sie in regelmäßigen Abständen das sammeln von Daten über Geräte in der Nähe, wie deiner, es ist in Ordnung, verwenden Sie einen scan mit einer festen Frist, speichern, dass die Daten irgendwo sind, starten Sie den scan, sammeln Sie neue Daten, vergleichen Sie mit alten Daten --> die Ergebnisse erhalten.
Zum Beispiel, wenn ein Gerät gefunden wurde in scan-1, aber nicht in scan-2, können Sie davon ausgehen, dass das Gerät in Reichweite, aber nicht mehr.
Das gleiche gilt für den anderen Weg herum: wenn ein Gerät gefunden wurde in scan 4, aber nicht in scan 3, es ist eine neu entdeckte Gerät.
Schließlich, wenn ein Gerät gefunden wurde in scan 5, war nicht in scan 6, aber wieder gefunden wurde, die in der scan 7 ist es wieder entdeckt und können behandelt werden, wenn es sein muss.
Weil ich die Beantwortung meiner eigenen Frage hier, ich ' ll fügen Sie den code, den ich verwendet, um dies zu implementieren.
Ich habe die Scans durchgeführt, die in einem hintergrund-service, und die Kommunikation zu anderen teilen der app mit BroadcastReceivers.
Asset
ist eine benutzerdefinierte Klasse von mir, die einige Daten enthält.DataManager
ist eine benutzerdefinierte Klasse von mir, die - wie haben Sie es erraten - Daten handhabt.Dieser code ist nicht perfekt und könnte noch buggy sein, aber es wird zumindest geben Sie eine Idee oder ein Beispiel, wie dies umgesetzt werden kann.
Kann ich nur empfehlen, dieser Ansatz:
Verwenden
Map<BluetoothDevice, Long>
Struktur, die zum speichern der gefundenen Geräte, woLong
ist die Zeit der Erkennung des Gerätes (kannSystem.currentTimeMillis()
zum Beispiel).Dann im service (soweit ich das verstanden habe aus der Frage wird es implementiert eine Art von Aufgabe wiederholt) einfach extrahieren von Geräten, die basierend auf dem Zeitpunkt der Entdeckung.
Und Sie sind absolut Recht, es gibt keine Garantie, dass alle Geräte in der Nähe entdeckt wurden, innerhalb der vorgegebenen Zeit. Gerade dies ist aktuell für die Android-Geräte.
iOS Geräte es ist wiederum ein anderes Thema - Sie können Ihre BluetoothDevice Adresse in der runtime ohne erkennbare äußere Ursache.
Hoffe, dies wird Ihnen helfen sparen Zeit beim Debuggen.
Bearbeiten
Als Ergebnis der Forschung zu diesem Thema fand diese Diskussion auf code.google.com
Frage ist noch offen und es scheint, dass es im Zusammenhang mit den hardware-features und die nicht repariert werden können programmgesteuert. Außerdem scheint es, dass Fehler wird weiterhin auf problem-Geräte auch nach einem system-updates.
Also ein erneutes starten der scan in regelmäßigen Abständen werden könnten akzeptable Lösung für diesen Fall.