Lokalizacja Wi-Fi: w zakresie z RTT

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 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 żą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:

.

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