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; których 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.
W Androidzie 15 (poziom interfejsu API 35) wprowadzono obsługę technologii IEEE 802.11az niezwiązanych z regułami (NTB).
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.
Obsługa zakresu IEEE 802.11az NTB jest dostępna na urządzeniach z Androidem 15
(poziom interfejsu API 35) i wyższy. Oznacza to, że jeśli urządzenie obsługuje standard IEEE 802.11az,
Tryb respondenta NTB (oznaczony znakiem
WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER
),
aplikacja może znajdować punkty AP z obsługą IEEE 802.11mc i IEEE 802.11az
żądania zakresu. Rozszerzyliśmy interfejs API RangingResult
, aby dostarczać informacje
o minimalnej i maksymalnej wartości, jaka może być używana w przedziale między
wybierając zakres pomiarów, pozostawiając dokładny odstęp czasu w aplikacji.
Wymagania
- Sprzęt urządzenia wysyłającego żądanie określania zakresu musi implementować Standard 802.11-2016 FTM lub 802.11az (zakres bez wyzwalacza).
- Urządzenie przesyłające żądanie określania zakresu musi mieć Androida 9 (poziom interfejsu API) 28) lub nowsze. Określanie zakresu bez wyzwalacza w standardzie IEEE 802.11az jest włączone na urządzeniach z Androidem 15 (poziom interfejsu API 35) lub nowszym.
- Urządzenie wysył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 implementować standard IEEE 802.11-2016 FTM lub IEEE Standard 802.11az (zakres bez reguł).
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
Na urządzeniu może istnieć funkcja RTT Wi-Fi, ale może być niedostępna, ponieważ użytkownik
ma wyłączoną sieć Wi-Fi. W zależności od ich możliwości sprzętowych i programistycznych niektóre
urządzenia mogą nie obsługiwać RTT w sieci Wi-Fi, jeśli są używane funkcje softAP lub tetheringu. Aby sprawdzić
czy dostępna jest opcja RTT Wi-Fi,
isAvailable()
Dostępność funkcji RTT w sieci Wi-Fi może się zmienić w każdej chwili. Aplikacja powinna zarejestrować
BroadcastReceiver
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
Utworzono (RangingRequest
)
przez określenie 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órym może być
uzyskanych dzięki wywołaniu
WifiManager.getScanResults()
Za pomocą
addAccessPoints(List<ScanResult>)
, aby dodać zbiorczo wiele punktów dostępu.
Obiekty ScanResult
mogą zawierać zarówno IEEE 802.11mc (is80211mcResponder()
), jak i
Obsługa zakresu bez wyzwalacza w standardzie IEEE 802.11az (is80211azNtbResponder()
)
punkty AP. Urządzenia obsługujące IEEE 802.11az NTB mają wydajność 802.11mc lub
standardem 802.11az jest zasięg 802.11az, w zależności od jego możliwości.
punkt dostępowy obsługuje jedne i drugie. Urządzenia, które nie obsługują IEEE 802.11az, mają wszystkie
wykorzystując protokół IEEE 802.11mc.
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(MacAddress peer)
i 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ć
, Executor
do określenia
kontekst wywołania zwrotnego oraz
RangingResultCallback
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 wRangingResultCallback
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 żądań – jeden wynik na każde żądanie. 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 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_SUCCESS
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 (RangingResult
) możesz pobrać wyniki
odpowiednimi metodami 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):
Minimalny i maksymalny czas oczekiwania urządzenia klienckiego w zakresie 11 az NTB pomiary:
getMinTimeBetweenNtbMeasurementsMicros()
orazgetMaxTimeBetweenNtbMeasurementsMicros()
zwracają minimalny i maksymalny czas. Jeśli następny pomiar zakresu to żądania przed upłynięciem minimalnego czasu, interfejs API zwraca wynik zakresu z pamięci podręcznej. Jeśli zażądany jest kolejny pomiar zakresu po po upływie maksymalnego czasu, interfejs API kończy działanie niebędące wyzwalaczem. dobiera zakres sesji i negocjuje nową sesję określania zakresu z odpowiedzialną . Unikaj prośby o nową sesję z zakresem, ponieważ spowoduje to dodanie co przekłada się na dłuższy czas pomiaru. Aby w pełni korzystać z protokołu 802.11az wydajność określania zakresu bez reguły, aktywuj następne żądanie zakresu między minimalnym a maksymalnym czasem pomiaru określonym w poprzednim Pomiar:RangingResult
.powtórzenia w polu Long Training Field (LTF) użytkowników, którzy reagują na pytania i inicjatory; użyte we wstępie do wyniku IEEE 802.11az NTB:
Liczba strumieni transmisji i odbierania w czasie przestrzennym (STS), które inicjator stacja używana do określenia wyniku IEEE 802.11az NTB:
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 |