Sie können die WLAN-Standortfunktion des Wi-Fi RTT (Round-Trip-Time) API um die Entfernung zu RTT-fähigen WLAN-Zugangspunkten in der Nähe zu messen. Geräte mit WLAN Aware
Wenn Sie die Entfernung zu drei oder mehr Zugangspunkten messen, können Sie Multilaterationsalgorithmus ermittle die Geräteposition, die am besten zu diesen Messungen. Das Ergebnis ist in der Regel auf 1 bis 2 Meter genau.
Mit dieser Genauigkeit können Sie detaillierte standortbezogene Dienste entwickeln, z. B. Indoor-Navigation, eine eindeutige Sprachsteuerung (z. B. „Aktivieren Sie diese leicht") und standortbasierten Informationen (z. B. "Gibt es Sonderangebote für für dieses Produkt?“).
Das anfordernde Gerät muss zum Messen keine Verbindung zu den Zugangspunkten herstellen Entfernung mit Wi-Fi RTT. Aus Datenschutzgründen kann nur das Gerät, von dem die Anfrage gesendet wurde, um die Entfernung zum Zugangspunkt zu bestimmen. haben die Zugangspunkte nicht diese Informationen. WLAN-RTT-Vorgänge sind für Apps im Vordergrund unbegrenzt, für Hintergrund-Apps gedrosselt werden.
WLAN-RTT und die damit verbundenen Fine-Time-Measurement (FTM-Funktionen) IEEE 802.11-2016-Standard festgelegt. Für WLAN-RTT wird die genaue Zeit benötigt Messung von FTM, da es die Entfernung zwischen zwei und messen, wie lange ein Paket für einen Umlauf zwischen der und die Zeit mit der Lichtgeschwindigkeit multiplizieren.
Implementierungsunterschiede je nach Android-Version
WLAN-RTT wurde mit Android 9 (API-Level 28) eingeführt. Bei Verwendung dieses Protokolls Zur Bestimmung der Position eines Geräts durch Multilateration bei laufenden Geräten Unter Android 9 benötigst du Zugang zu vordefinierten Zugangspunkten Daten in Ihrer App. Es liegt an Ihnen zu entscheiden, wie diese Daten gespeichert und abgerufen werden.
Auf Geräten mit Android 10 (API-Level 29) und höher können AP-Standortdaten
dargestellt als
ResponderLocation
-Objekte, einschließlich Breitengrad, Längengrad und Höhe. Für WLAN-RTT-ZPs, die
support Location Configuration Information/Location Civic Report (LCI/LCR-Daten)
gibt das Protokoll während des Vorgangs ein ResponderLocation
-Objekt zurück.
Bereichsbestimmung.
Mit dieser Funktion können Apps APs direkt nach ihrer Position fragen. und müssen diese Informationen nicht im Voraus speichern. Ihre App kann also AP zu finden und ihre Positionen zu ermitteln, auch wenn diese zuvor nicht bekannt waren. beispielsweise wenn Nutzende ein neues Gebäude betreten.
Voraussetzungen
- Auf der Hardware des Geräts, von dem die Entfernungsanfrage gesendet wird, muss Folgendes implementiert werden: FTM-Standard 802.11-2016.
- Auf dem Gerät, das die Standortermittlungsanfrage stellt, muss Android 9 (API-Level) ausgeführt werden. 28) oder höher.
- Auf dem Gerät, von dem die Standortermittlungsanfrage gesendet wird, müssen Standortdienste aktiviert sein die WLAN-Suche aktiviert ist (unter Einstellungen > Standort).
- Wenn die App, die die Anfrage zur Bereichserkennung erstellt,
Android 13 (API-Level 33) oder höher benötigen,
NEARBY_WIFI_DEVICES
Berechtigung. Wenn eine solche App auf eine frühere Android-Version ausgerichtet ist, habenACCESS_FINE_LOCATION
Berechtigung erteilen. - Die App muss den Bereich der Zugangspunkte abfragen, während sie sichtbar oder in einen Dienst im Vordergrund. Die App kann nicht auf Standortinformationen aus der Hintergrund.
- Der Zugangspunkt muss den FTM-Standard IEEE 802.11-2016 implementieren.
Einrichten
Führen Sie die folgenden Schritte aus, um Ihre App für die Verwendung von WLAN-RTT einzurichten.
1. Berechtigungen anfordern
Fordern Sie im Manifest Ihrer App die folgenden Berechtigungen an:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- If your app targets Android 13 (API level 33)
or higher, you must declare the NEARBY_WIFI_DEVICES permission. -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
<!-- If your app derives location information from Wi-Fi APIs,
don't include the "usesPermissionFlags" attribute. -->
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
<!-- If any feature in your app relies on precise location
information, don't include the "maxSdkVersion"
attribute. -->
android:maxSdkVersion="32" />
Die Berechtigungen NEARBY_WIFI_DEVICES
und ACCESS_FINE_LOCATION
sind gefährlich
Berechtigungen erforderlich sind, sodass Sie sie jedes Mal zur Laufzeit anfordern müssen, wenn der Nutzer
einen RTT-Suchvorgang. Ihre App muss die Berechtigung des Nutzers anfordern,
Berechtigung, wenn die Berechtigung nicht bereits gewährt wurde. Weitere Informationen
zu Laufzeitberechtigungen finden Sie unter
App-Berechtigungen anfordern
2. Prüfen, ob das Gerät WLAN-RTT unterstützt
Um zu prüfen, ob das Gerät WLAN-RTT unterstützt, verwende die PackageManager API:
Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
3. Verfügbarkeit von WLAN-RTT prüfen
WLAN-RTT ist möglicherweise auf dem Gerät vorhanden, derzeit aber nicht verfügbar. Der Nutzer hat WLAN deaktiviert. Je nach Hardware und Firmware WLAN-RTT nicht unterstützen, wenn SoftAP oder Tethering aktiviert ist. verwendet wird. Um zu prüfen, ob WLAN-RTT derzeit verfügbar ist, rufen Sie isAvailable() enthalten.
Die Verfügbarkeit von WLAN-RTT kann sich jederzeit ändern. Deine App sollte eine BroadcastReceiver zum Empfangen von ACTION_WIFI_RTT_STATE_CHANGED die gesendet wird, wenn sich die Verfügbarkeit ändert. Wenn deine App die Übertragung empfängt sollte die App den aktuellen Verfügbarkeitsstatus prüfen und entsprechend reagieren.
Beispiel:
Kotlin
val filter = IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED) val myReceiver = object: BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (wifiRttManager.isAvailable) { … } else { … } } } context.registerReceiver(myReceiver, filter)
Java
IntentFilter filter = new IntentFilter(WifiRttManager.ACTION_WIFI_RTT_STATE_CHANGED); BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (wifiRttManager.isAvailable()) { … } else { … } } }; context.registerReceiver(myReceiver, filter);
Weitere Informationen finden Sie unter Nachrichten an alle.
Bereichsabfrage erstellen
Eine Anfrage zur Bereichserkennung (RangingRequest) wird erstellt von Hier wird eine Liste von ZPs oder Wi-Fi Aware-Peers angegeben, zu denen ein Bereich angefordert wird. In einem Anfrage zur Bereichserkennung; werden die Entfernungen zu allen Geräten gemessen und zurückgegeben.
Eine Anfrage kann beispielsweise den Parameter addAccessPoint() auf. , um einen Zugangspunkt anzugeben, zu dem die Entfernung gemessen werden soll:
Kotlin
val req: RangingRequest = RangingRequest.Builder().run { addAccessPoint(ap1ScanResult) addAccessPoint(ap2ScanResult) build() }
Java
RangingRequest.Builder builder = new RangingRequest.Builder(); builder.addAccessPoint(ap1ScanResult); builder.addAccessPoint(ap2ScanResult); RangingRequest req = builder.build();
Ein Zugangspunkt wird durch seine
ScanResult-Objekt, das auf
die Sie durch Aufrufen von
WifiManager.getScanResults()
Sie können
addAccessPoints(Liste
Genauso kann mit einer Anfrage zur Bereichserkennung ein Wi-Fi Aware-Peer über dessen MAC-Adresse hinzugefügt werden. oder ihr PeerHandle mit Hilfe von die addWifiAwarePeer(MacAddress-Peer) und addWifiAwarePeer(PeerHandle Peer). . Weitere Informationen zur Suche nach ähnlichen Geräten mit Wi-Fi Aware finden Sie in der WLAN-Dokumentation.
Bereichsauswahl anfordern
Eine Anwendung gibt mithilfe des WifiRttManager.startRanging() und Folgendes angeben: a RangingRequest zum Angeben der einen Executor, Callback-Kontext und eine RangingResultCallback um die Ergebnisse zu erhalten.
Beispiel:
Kotlin
val mgr = context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE) as WifiRttManager val request: RangingRequest = myRequest mgr.startRanging(request, executor, object : RangingResultCallback() { override fun onRangingResults(results: List<RangingResult>) { … } override fun onRangingFailure(code: Int) { … } })
Java
WifiRttManager mgr = (WifiRttManager) Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE); RangingRequest request ...; mgr.startRanging(request, executor, new RangingResultCallback() { @Override public void onRangingFailure(int code) { … } @Override public void onRangingResults(List<RangingResult> results) { … } });
Der Ranging-Vorgang wird asynchron durchgeführt und die Ranging-Ergebnisse werden die in einem der Callbacks der RangingResultCallback:
- Wenn der gesamte Bereichserkennungsvorgang fehlschlägt, onRangingFailure Callback wird mit einem Statuscode ausgelöst, der unter RangingResultCallback aus. Ein solcher Fehler kann auftreten, wenn der Dienst keinen Bereichserkennungsvorgang ausführen kann. aktiviert werden, z. B. weil WLAN deaktiviert ist, weil die Anwendung zu viele Bereichserkennungsvorgänge angefordert und gedrosselt wird. Berechtigungsproblem.
- Nach Abschluss des Bereichserkennungsvorgangs wird der onRangingResults (Ergebnisse) Callback wird mit einer Liste von Ergebnissen ausgelöst, die mit der Liste der -Anfragen mit jeweils einem Ergebnis. Die Reihenfolge der Ergebnisse unbedingt mit der Reihenfolge der Anfragen übereinstimmen. Beachten Sie, dass der Bereichserkennungsvorgang möglicherweise aber jedes Ergebnis kann immer noch darauf hinweisen, zu messen.
Bereichsergebnisse interpretieren
Jedes der Ergebnisse, die vom onRangingResults (Ergebnisse) Callback wird durch ein RangingResult-Objekt -Objekt enthält. Gehen Sie bei jeder Anfrage so vor:
1. Anfrage identifizieren
Identifizieren Sie den Antrag anhand der Informationen, die beim Erstellen des
RangingRequest:
Meistens eine MAC-Adresse im ScanResult
, die einen Zugriff identifiziert
Punkt. Die MAC-Adresse kann mithilfe der Methode
getMacAddress().
.
Die Liste der Bereichsergebnisse kann in einer anderen Reihenfolge als die der Peers sein (Zugriff Punkte) angegeben werden. Verwenden Sie daher die MAC-Adresse und nicht die Reihenfolge der Ergebnisse.
2. Ermitteln, ob die einzelnen Messungen erfolgreich waren
Um festzustellen, ob eine Messung erfolgreich war, verwenden Sie das
getStatus()
. Alle Werte außer
STATUS_ERFOLGREICH
zeigt einen Fehler an. Ein Fehler bedeutet, dass alle anderen Felder dieses Ergebnisses
(mit Ausnahme der oben genannten Anforderungsidentifikation) ungültig sind und die entsprechenden
Die Methode get*
schlägt fehl mit:
IllegalStateException -Ausnahme.
3. Ergebnisse für jede erfolgreiche Messung abrufen
Für jede erfolgreiche Messung können Sie Ergebniswerte mit dem
entsprechenden get
-Methoden:
Entfernung in mm und Standardabweichung des Messwerts:
RSSI der für die Messungen verwendeten Pakete:
Zeit in Millisekunden, zu der die Messung durchgeführt wurde (Zeitangabe) seit Start):
Anzahl der versuchten Messungen sowie deren Anzahl die erfolgreich waren (und auf denen die Entfernungsmessungen basieren):
getNumSuccessfulMeasurements() (Erfolgreich messen)
Android-Geräte, die WiFi-RTT unterstützen
In den folgenden Tabellen sind einige Smartphones, Zugangspunkte sowie Geräte für den Einzelhandel, die Lagerhaltung und das Distributionszentrum aufgeführt die WLAN-RTT unterstützen. Das ist alles andere als umfangreich. Wir empfehlen Ihnen, wenden Sie sich einfach an uns um Ihre RTT-fähigen Produkte hier aufzulisten.
Zugangspunkte
Hersteller und Modell | Supportdatum |
---|---|
Nest Wifi Pro (Wi-Fi 6E) | Unterstützt |
Compulab WILD AP | Unterstützt |
Google Wifi | Unterstützt |
Google Nest WLAN-Router | Unterstützt |
Google Nest Wifi-Zugangspunkt | Unterstützt |
Aruba AP-635 | Unterstützt |
Cisco 9130 | Unterstützt |
Cisco 9136 | Unterstützt |
Cisco 9166 | Unterstützt |
Cisco 9164 | Unterstützt |
Aruba AP-505 | Unterstützt |
Aruba AP-515 | Unterstützt |
Aruba AP-575 | Unterstützt |
Aruba AP-518 | Unterstützt |
Aruba AP-505H | Unterstützt |
Aruba AP-565 | Unterstützt |
Aruba AP-535 | Unterstützt |
Smartphones
Hersteller und Modell | Android-Version |
---|---|
Pixel 6 | 9.0 oder höher |
Pixel 6 Pro | 9.0 oder höher |
Pixel 5 | 9.0 oder höher |
Pixel 5a | 9.0 oder höher |
Pixel 5a (5G) | 9.0 oder höher |
Xiaomi Mi 10 Pro | 9.0 oder höher |
Xiaomi Mi 10 | 9.0 oder höher |
Xiaomi Redmi Mi 9T Pro | 9.0 oder höher |
Xiaomi Mi 9T | 9.0 oder höher |
Xiaomi Mi 9 | 9.0 oder höher |
Xiaomi Mi Note 10 | 9.0 oder höher |
Xiaomi Mi Note 10 Lite | 9.0 oder höher |
Xiaomi Redmi Note 9S | 9.0 oder höher |
Xiaomi Redmi Note 9 Pro | 9.0 oder höher |
Xiaomi Redmi Note 8T | 9.0 oder höher |
Xiaomi Redmi Note 8 | 9.0 oder höher |
Xiaomi Redmi K30 Pro | 9.0 oder höher |
Xiaomi Redmi K20 Pro | 9.0 oder höher |
Xiaomi Redmi K20 | 9.0 oder höher |
Xiaomi Redmi Note 5 Pro | 9.0 oder höher |
Xiaomi Mi CC9 Pro | 9.0 oder höher |
LG G8X ThinQ | 9.0 oder höher |
LG V50S ThinQ | 9.0 oder höher |
LG V60 ThinQ | 9.0 oder höher |
LG V30 | 9.0 oder höher |
Samsung Galaxy Note 10+ 5G | 9.0 oder höher |
Samsung Galaxy S20+ 5G | 9.0 oder höher |
Samsung Galaxy S20+ | 9.0 oder höher |
Samsung Galaxy S20 5G | 9.0 oder höher |
Samsung Galaxy S20 Ultra 5G | 9.0 oder höher |
Samsung Galaxy S20 | 9.0 oder höher |
Samsung Galaxy Note 10+ | 9.0 oder höher |
Samsung Galaxy Note 10 5G | 9.0 oder höher |
Samsung Galaxy Note 10 | 9.0 oder höher |
Samsung A9 Pro | 9.0 oder höher |
Google Pixel 4 XL | 9.0 oder höher |
Google Pixel 4 | 9.0 oder höher |
Google Pixel 4a | 9.0 oder höher |
Google Pixel 3 XL | 9.0 oder höher |
Google Pixel 3 | 9.0 oder höher |
Google Pixel 3a XL | 9.0 oder höher |
Google Pixel 3a | 9.0 oder höher |
Google Pixel 2 XL | 9.0 oder höher |
Google Pixel 2 | 9.0 oder höher |
Google Pixel 1 XL | 9.0 oder höher |
Google Pixel 1 | 9.0 oder höher |
Poco X2 | 9.0 oder höher |
Sharp Aquos R3 SH-04L | 9.0 oder höher |
Geräte für Einzelhandel, Lagerung und Vertrieb
Hersteller und Modell | Android-Version |
---|---|
Zebra PS20 | 10,0+ |
Zebra TC52/TC52HC | 10,0+ |
Zebra TC57 | 10,0+ |
Zebra TC72 | 10,0+ |
Zebra TC77 | 10,0+ |
Zebra MC93 | 10,0 und höher |
Zebra TC8300 | 10,0+ |
Zebra VC8300 | 10,0+ |
Zebra EC30 | 10,0+ |
Zebra ET51 | 10,0+ |
Zebra ET56 | 10,0 und höher |
Zebra L10 | 10,0+ |
Zebra CC600/CC6000 | 10,0+ |
Zebra MC3300x | 10,0+ |
Zebra MC330x | 10,0 und höher |
Zebra TC52x | 10,0+ |
Zebra TC57x | 10,0+ |
Zebra EC50 (LAN und HC) | 10,0+ |
Zebra EC55 (WAN) | 10,0+ |
WT6300 | 10,0+ |
Skorpio X5 | 10,0+ |