Możesz użyć funkcji lokalizacji Wi-Fi dostępnej w Interfejs API Wi-Fi RTT (Round-Trip-Time) mierzyć odległość do pobliskich punktów dostępu Wi-Fi i peera, które obsługują RTT; Urządzenia z Wi-Fi Aware.
Jeśli mierzysz odległość do trzech lub więcej punktów dostępu, możesz użyć parametru algorytm powielania w celu oszacowania pozycji urządzenia, która najlepiej do niej pasuje. pomiarów. Wynik jest zwykle dokładny w zakresie 1–2 metrów.
Taka dokładność pozwala na tworzenie szczegółowych usług wykorzystujących lokalizację, takich jak jako nawigacji wewnątrz budynków, szczegółowe sterowanie głosem (na przykład „Włącz to „światła”) i informacji opartych na lokalizacji (np. „Czy są dostępne dla tej usługi?”).
Urządzenie wysyłające żądanie nie musi łączyć się z punktami dostępu, aby przeprowadzać pomiary w odległości za pomocą RTT Wi-Fi. Ze względu na ochronę prywatności tylko urządzenie wysyłające żądanie może aby określić odległość od punktu dostępu; punkty dostępu nie mają te informacje. Operacje RTT Wi-Fi nie są ograniczone w przypadku aplikacji działających na pierwszym planie, ale ograniczona dla aplikacji działających w tle.
RTT Wi-Fi i powiązane funkcje dokładnego pomiaru czasu (FTM) są standardem IEEE 802.11-2016. RTT w Wi-Fi wymaga dokładnej godziny pomiar dostarczony przez FTM, ponieważ oblicza odległość między dwoma urządzeń, mierząc czas potrzebny pakietowi na pokonanie tych urządzeń i mnożąc ten czas przez prędkość światła.
Różnice we wdrożeniu w zależności od wersji Androida
Protokół Wi-Fi RTT został wprowadzony w Androidzie 9 (poziom interfejsu API 28). W przypadku korzystania z tego protokołu do określania pozycji urządzenia za pomocą wieloopóźnienia przy włączonym urządzeniu Android 9: potrzebujesz dostępu do wcześniej określonych lokalizacji punktów dostępu. w Twojej aplikacji. To Ty decydujesz, jak chcesz przechowywać i odzyskać te dane.
Na urządzeniach z Androidem 10 (poziom interfejsu API 29) lub nowszym dane o lokalizacji punktu dostępu
reprezentowane jako
ResponderLocation
takich jak szerokość, długość i wysokość nad poziomem morza. Punkty dostępu RTT obsługujące sieć Wi-Fi,
obsługują informacje o konfiguracji lokalizacji i raporty o obliczaniu lokalizacji (dane LCI/LCR),
protokół zwróci obiekt ResponderLocation
podczas
proces określania zakresu.
Ta funkcja pozwala aplikacjom wysyłać zapytania do punktów dostępu, aby bezpośrednio prosić ich o podanie pozycji bez konieczności zapisywania tych informacji z wyprzedzeniem. Dzięki temu aplikacja może znajdować punkty dostępu i określać ich pozycję, nawet jeśli punkty te nie były wcześniej znane, na przykład gdy użytkownik wejdzie do nowego budynku.
Wymagania
- Sprzęt urządzenia wysyłającego żądanie określania zakresu musi implementować 802.11-2016 FTM.
- Urządzenie przesyłające żądanie określania zakresu musi mieć Androida 9 (poziom interfejsu API) 28) lub nowsze.
- Urządzenie przesyłające żądanie określania zakresu musi mieć włączone usługi lokalizacyjne i włączone skanowanie Wi-Fi (w sekcji Ustawienia > Lokalizacja).
- Jeśli aplikacja wysyłająca żądanie określania zakresu jest kierowana
Androida 13 (poziom API 33) lub nowszego, musi mieć
NEARBY_WIFI_DEVICES
uprawnienia. Jeśli taka aplikacja jest kierowana na starszą wersję Androida, musi mająACCESS_FINE_LOCATION
- Aplikacja musi wysyłać zapytania dotyczące zakresu punktów dostępu, gdy aplikacja jest widoczna lub w nie działa na pierwszym planie. Aplikacja nie może uzyskać dostępu do informacji o lokalizacji z .
- Punkt dostępu musi obsługiwać standard IEEE 802.11-2016 FTM.
Konfiguracja
Aby skonfigurować w aplikacji korzystanie z Wi-Fi RTT, wykonaj te czynności.
1. Poproś o uprawnienia
W pliku manifestu aplikacji poproś o te uprawnienia:
<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" />
Uprawnienia NEARBY_WIFI_DEVICES
i ACCESS_FINE_LOCATION
są niebezpieczne
uprawnień, więc musisz o nie prosić za każdym razem, gdy użytkownik chce
i wykonać operację skanowania RTT. Aplikacja musi wysłać do użytkownika żądanie
, jeśli uprawnienia nie zostały jeszcze przyznane. Więcej informacji na temat konfiguracji
o uprawnieniach czasu działania, zobacz
Poproś o uprawnienia aplikacji.
2. Sprawdź, czy urządzenie obsługuje Wi-Fi RTT
Aby sprawdzić, czy urządzenie obsługuje RTT w sieci Wi-Fi, użyj Interfejs API PackageManager:
Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
3. Sprawdzanie, czy dostępna jest funkcja RTT Wi-Fi
Funkcja RTT Wi-Fi może istnieć na urządzeniu, ale może być obecnie niedostępna, ponieważ użytkownik wyłączył Wi-Fi. W zależności od wyposażenia i oprogramowania układowego urządzenia funkcji, niektóre urządzenia mogą nie obsługiwać RTT Wi-Fi, jeśli funkcja SoftAP lub tethering w użyciu. Aby sprawdzić, czy funkcja RTT Wi-Fi jest obecnie dostępna, zadzwoń pod numer isAvailable().
Dostępność funkcji RTT w sieci Wi-Fi może się zmienić w każdej chwili. Aplikacja powinna zarejestrować Odbiornik transmisji aby otrzymać ACTION_WIFI_RTT_STATE_CHANGED, który jest wysyłany, gdy dostępność się zmieni. Kiedy aplikacja odbiera transmisję aplikacja powinna sprawdzić bieżący stan dostępności i dostosować odpowiednie zachowanie.
Na przykład:
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);
Więcej informacji znajdziesz w artykule Komunikaty.
Utwórz prośbę o zakres
Prośba o określenie zakresu (RangingRequest) utworzony przez określanie listy punktów dostępu lub elementów równorzędnych z modułem Wi-Fi Aware, do których jest żądane. W elemencie żądanie pojedynczego zakresu; odległość od wszystkich urządzeń jest mierzona i zwracana.
Na przykład w żądaniu można użyć funkcji addAccessPoint() aby określić punkt dostępu, do którego będzie mierzona odległość:
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();
Punkt dostępu jest identyfikowany przez
ScanResult, którego można użyć
uzyskanych dzięki wywołaniu
WifiManager.getScanResults().
Za pomocą
addAccessPoints(Lista
Podobnie żądanie określania zakresu może dodać równorzędną sieć Wi-Fi Aware za pomocą adresu MAC lub jego PeerHandle, przy użyciu addWifiAwarePeer(peer MacAddress) oraz addWifiAwarePeer(PeerHandle peer) metod weryfikacji danych. Aby dowiedzieć się więcej o odkrywaniu równorzędnych sieci Wi-Fi Aware, zobacz dokumentację Wi-Fi Aware.
Zakres żądań
Aplikacja wysyła żądanie określania zakresu za pomocą funkcji WifiRttManager.startRanging() oraz zapewnienie: RangingRequest, aby określić lub Wykonawca, który określa kontekst wywołania zwrotnego oraz Wywołanie zwrotneRangingResult aby otrzymać wyniki.
Na przykład:
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) { … } });
Operacja określania zakresu jest wykonywana asynchronicznie, a wyniki określania zwracany w jednym z wywołań zwrotnych RangingResultCallback:
- Jeśli operacja określania zakresu zakończy się niepowodzeniem, funkcja onRangingFailure, wywołanie zwrotne jest wywoływane z kodem stanu opisanym w RangingResultCallback. Taka awaria może wystąpić, jeśli usługa nie może wykonać operacji określającej zakres na przykład wówczas, gdy sieć Wi-Fi jest wyłączona, ponieważ aplikacja zażądał zbyt wielu operacji określania zakresu i został ograniczony lub z powodu z problemami z uprawnieniami.
- Po zakończeniu operacji określania zakresu funkcja onRangingResults, wywołanie zwrotne z listą wyników pasujących do listy – po jednym wyniku dla każdego żądania. Kolejność wyników nie jest muszą się zgadzać z kolejnością żądań. Pamiętaj, że operacja określania zakresu może ale każdy wynik może wskazywać na niepowodzenie danego pomiar skuteczności.
Zinterpretuj wyniki określania zakresu
Każdy z wyników zwróconych przez onRangingResults, wywołanie zwrotne jest określane przez funkcję RangingResult obiektu. Wykonaj te czynności przy każdym żądaniu.
1. Zidentyfikuj żądanie
Określ żądanie na podstawie informacji podanych podczas tworzenia
RangingRequest:
najczęściej jest to adres MAC podany w ScanResult
identyfikujący dostęp
. Adres MAC można uzyskać z wyniku określania zakresu za pomocą funkcji
getMacAddress(),
.
Lista wyników z przedziałem może mieć inną kolejność niż wyniki z grupy porównawczej (dostęp punktów) określonych w prośbie o zakres zakresu, więc należy użyć adresu MAC, identyfikować elementy porównawcze, a nie kolejność wyników.
2. sprawdzać, czy każdy pomiar się udał.
Aby sprawdzić, czy pomiar był udany, skorzystaj z
getStatus(),
. Dowolna wartość inna niż
STATUS_SUKCES
oznacza błąd. Błąd oznacza, że wszystkie pozostałe pola tego wyniku
(z wyjątkiem powyższego identyfikatora żądania) są nieprawidłowe, a odpowiadający im parametr
Metoda get*
zakończy się niepowodzeniem z
Wyjątek IllegalStateException .
3. Uzyskaj wyniki dla każdego udanego pomiaru
W przypadku każdego udanego pomiaru możesz pobrać wartości wyników za pomocą funkcji
odpowiednie metody get
:
Odległość w mm i odchylenie standardowe pomiaru:
RSSI pakietów używanych na potrzeby pomiarów:
Czas (w milisekundach) wykonania pomiaru (wskazujący czas od uruchomienia):
Liczba przeprowadzonych pomiarów i liczba pomiarów , które się udało (i na podstawie pomiaru odległości):
Urządzenia z Androidem obsługujące Wi-Fi-RTT
W tabelach poniżej znajdziesz listę wybranych telefonów, punktów dostępu oraz urządzeń do obsługi handlu detalicznego, magazynowania i dystrybucji. obsługujące Wi-Fi-RTT. Nie są one wyczerpujące. Zachęcamy do skontaktuj się z nami , aby wyświetlić produkty obsługujące RTT.
Punkty dostępu
Producent i model | Data wsparcia |
---|---|
Nest Wifi Pro (Wi-Fi 6E) | Obsługiwane |
Przeprowadź obliczenia WILD AP | Obsługiwane |
Wi-Fi od Google | Obsługiwane |
router Wi-Fi Google Nest | Obsługiwane |
Punkt Google Nest Wi-Fi | Obsługiwane |
Aruba AP-635 | Obsługiwane |
Cisco 9130 | Obsługiwane |
Cisco 9136 | Obsługiwane |
Cisco 9166 | Obsługiwane |
Cisco 9164 | Obsługiwane |
Aruba AP-505 | Obsługiwane |
Aruba AP-515 | Obsługiwane |
Aruba AP-575 | Obsługiwane |
Aruba AP-518 | Obsługiwane |
Aruba AP-505H | Obsługiwane |
Aruba AP-565 | Obsługiwane |
Aruba AP-535 | Obsługiwane |
Telefony
Producent i model | Wersja Androida |
---|---|
Pixel 6 | 9,0+ |
Pixel 6 Pro | 9,0+ |
Pixel 5 | 9,0+ |
Pixel 5a | 9,0+ |
Pixel 5a (5G) | 9,0+ |
Xiaomi Mi 10 Pro | 9,0+ |
Xiaomi Mi 10 | 9,0+ |
Xiaomi Redmi Mi 9T Pro | 9,0+ |
Xiaomi Mi 9T | 9,0+ |
Xiaomi Mi 9 | 9,0+ |
Xiaomi Mi Note 10 | 9,0+ |
Xiaomi Mi Note 10 Lite | 9,0+ |
Xiaomi Redmi Note 9S | 9,0+ |
Xiaomi Redmi Note 9 Pro | 9,0+ |
Xiaomi Redmi Note 8T | 9,0+ |
Xiaomi Redmi Note 8 | 9,0+ |
Xiaomi Redmi K30 Pro | 9,0+ |
Xiaomi Redmi K20 Pro | 9,0+ |
Xiaomi Redmi K20 | 9,0+ |
Xiaomi Redmi Note 5 Pro | 9,0+ |
Xiaomi Mi CC9 Pro | 9,0+ |
LG G8X ThinQ | 9,0+ |
LG V50S ThinQ | 9,0+ |
LG V60 ThinQ | 9,0+ |
LG V30 | 9,0+ |
Samsung Galaxy Note 10+ 5G | 9,0+ |
Samsung Galaxy S20+ 5G | 9,0+ |
Samsung Galaxy S20+ | 9,0+ |
Samsung Galaxy S20 5G | 9,0+ |
Samsung Galaxy S20 Ultra 5G | 9,0+ |
Samsung Galaxy S20 | 9,0+ |
Samsung Galaxy Note 10 lub nowszy | 9,0+ |
Samsung Galaxy Note 10 5G | 9,0+ |
Samsung Galaxy Note 10 | 9,0+ |
Samsung A9 Pro | 9,0+ |
Google Pixel 4 XL | 9,0+ |
Google Pixel 4 | 9,0+ |
Google Pixel 4a | 9,0+ |
Google Pixel 3 XL | 9,0+ |
Google Pixel 3 | 9,0+ |
Google Pixel 3a XL | 9,0+ |
Google Pixel 3a | 9,0+ |
Google Pixel 2 XL | 9,0+ |
Google Pixel 2 | 9,0+ |
Google Pixel 1 XL | 9,0+ |
Google Pixel 1 | 9,0+ |
Poco X2 | 9,0+ |
Sharp AQUOS R3 SH-04L | 9,0+ |
Urządzenia do handlu detalicznego, magazynowania i dystrybucyjnego
Producent i model | Wersja Androida |
---|---|
Zebra PS20 | 10.0 lub nowszy |
Zebra TC52/TC52HC | 10.0 lub nowszy |
Zebra TC57 | 10.0 lub nowszy |
Zebra TC72 | 10.0 lub nowszy |
Zebra TC77 | 10.0 lub nowszy |
Zebra MC93 | 10.0 lub nowszy |
Zebra TC8300 | 10.0 lub nowszy |
Zebra VC8300 | 10.0 lub nowszy |
Zebra EC30 | 10.0 lub nowszy |
Zebra ET51 | 10.0 lub nowszy |
Zebra ET56 | 10.0 lub nowszy |
Zebra L10 | 10.0 lub nowszy |
Zebra CC600/CC6000 | 10.0 lub nowszy |
Zebra MC3300x | 10.0 lub nowszy |
Zebra MC330x | 10.0 lub nowszy |
Zebra TC52x | 10.0 lub nowszy |
Zebra TC57x | 10.0 lub nowszy |
Zebra EC50 (LAN i HC) | 10.0 lub nowszy |
Zebra EC55 (WAN) | 10.0 lub nowszy |
Zebra WT6300 | 10.0 lub nowszy |
Skorpio X5 | 10.0 lub nowszy |