Kablosuz konumu: RTT ile aralık

Wi-Fi RTT (Gidiş Dönüş) API'si yakındaki RTT özellikli kablosuz erişim noktalarına ve benzer uygulamalara uzaklığı ölçmek Kablosuz Ağa Duyarlı cihazlar.

Üç veya daha fazla erişim noktasına uzaklığı ölçüyorsanız bir ya da daha fazla Bunlara en uygun cihaz konumunu tahmin etmek için kullanılan çoklu katmanlama algoritması ölçümler. Sonuç genellikle 1-2 metre içinde doğru sonuç verir.

Bu doğruluk sayesinde kapalı mekan navigasyonu, anlam karışıklığını gideren sesli kontrol (ör. "Bu ışığı aç") ve konuma dayalı bilgiler (ör. "Bu ürün için özel teklif var mı?") gibi ayrıntılı konuma dayalı hizmetler geliştirebilirsiniz.

İstekte bulunan cihazın, ölçüm için erişim noktalarına bağlanması gerekmez. mesafe katetmeniz önerilir. Gizliliği korumak için yalnızca istek gönderen cihaz erişim noktasına olan mesafeyi belirleyebilir. Erişim noktalarında bu bilgiler bulunmaz. Kablosuz RTT işlemleri, ön plan uygulamaları için sınırsızdır ancak arka plan uygulamaları için kısıtlandı.

Kablosuz RTT ve ilgili hassas zaman ölçümü (FTM) özellikleri IEEE 802.11-2016 standardında belirtilmiştir. Kablosuz RTT için tam saat gerekir iki nokta arasındaki mesafeyi hesapladığı için, FTM tarafından sağlanan ölçüm bir paketin iki paketin arasında gidiş dönüş süresini ölçerek bu süreyi ışık hızıyla çarpıyoruz.

Android 15 (API düzeyi 35), IEEE 802.11az tetikleyici tabanlı olmayan (NTB) menzil desteğini kullanıma sundu.

Android sürümüne göre uygulama farklılıkları

Kablosuz RTT, Android 9'da (API düzeyi 28) kullanıma sunulmuştur. Android 9 çalıştıran cihazlarla çoklu yansıma kullanarak bir cihazın konumunu belirlemek için bu protokolü kullanırken uygulamanızda önceden belirlenmiş erişim noktası (AP) konumu verilerine erişiminiz olmalıdır. Bu verileri nasıl depolayacağınıza ve alacağınıza siz karar verirsiniz.

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda AP konum verileri, enlem, boylam ve rakımı içeren ResponderLocation nesneleri olarak temsil edilebilir. Şu özelliklere sahip kablosuz RTT AP'ler için: Konum Yapılandırma Bilgileri/Konum Şehir Raporu'nu (LCI/LCR verileri) destekler, Protokol,ResponderLocation aralık süreci.

Bu özellik, uygulamaların API'leri sorgulamasına ve doğrudan konumlarını sormasına olanak tanır. ve bu bilgileri önceden saklamaya gerek kalmaz. Böylece uygulamanız, daha önce bilinmeyen AP'leri (ör. kullanıcı yeni bir binaya girdiğinde) bulup konumlarını belirleyebilir.

IEEE 802.11az NTB menzil desteği, Android 15 (API düzeyi 35) ve sonraki sürümleri çalıştıran cihazlarda kullanılabilir. Diğer bir deyişle, cihaz IEEE 802.11az NTB başlatıcı modunu destekliyorsa (WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR ile gösterilir) uygulamanız tek bir aralık isteğiyle hem IEEE 802.11mc hem de IEEE 802.11az özellikli AP'leri bulabilir. RangingResult API, bilgi sağlayacak şekilde genişletilmiştir aralığı için kullanılabilecek minimum ve maksimum değer hakkında kullanarak, kesin aralığı uygulamanızın kontrolünde tutabilirsiniz.

Şartlar

  • Menzil isteği gönderen cihazın donanımı, 802.11-2016 FTM standardını veya 802.11az standardını (tetikleyici tabanlı olmayan menzil) uygulamalıdır.
  • Aralık isteğinde bulunan cihazın Android 9 (API düzeyi) çalıştırması gerekir 28) veya sonraki sürümlerdir. Tetikleyici tabanlı olmayan IEEE 802.11az menzil ölçümü, Android 15 (API düzeyi 35) ve sonraki sürümleri çalıştıran cihazlarda etkindir.
  • Aralık isteğinde bulunan cihazda konum hizmetleri etkinleştirilmiş olmalıdır ve kablosuz ağ taraması açık (Ayarlar > Konum altında).
  • Aralık belirleme isteği gönderen uygulama Android 13'ü (API düzeyi 33) veya sonraki sürümleri hedefliyorsa NEARBY_WIFI_DEVICES iznine sahip olmalıdır. Bu tür bir uygulama Android'in önceki bir sürümünü hedefliyorsa sahip olmak ACCESS_FINE_LOCATION izni almanız gerekir.
  • Uygulama, görünür durumdayken veya ön plan hizmetindeyken erişim noktası aralığını sorgulamalıdır. Uygulama, buradan konum bilgilerine erişemez arka plan.
  • Erişim noktası IEEE 802.11-2016 FTM standardını veya IEEE'yi uygulamalıdır 802.11az standardı (tetikleyici olmayan aralık).

Kurulum

Uygulamanızı kablosuz RTT kullanacak şekilde ayarlamak için aşağıdaki adımları uygulayın.

1. İzin isteme

Uygulamanızın manifest dosyasında aşağıdaki izinleri isteyin:

<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" />

NEARBY_WIFI_DEVICES ve ACCESS_FINE_LOCATION izinleri tehlikeli izinler olduğundan, kullanıcı her RTT tarama işlemi yapmak istediğinde çalışma zamanında bu izinleri istemeniz gerekir. Uygulamanızın, kullanıcıdan (izin verilmemişse) izin verir. Okuyucu Gelirleri Yöneticisi'ni bkz. çalışma zamanı izinleri hakkında Uygulama İzinleri İsteyin.

2. Cihazın kablosuz RTT'yi destekleyip desteklemediğini kontrol edin

Cihazın kablosuz RTT'yi destekleyip desteklemediğini kontrol etmek için PackageManager API:

Kotlin

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

Java

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);

3. Kablosuz RTT olup olmadığını kontrol etme

Cihazda kablosuz RTT mevcut olabilir ancak kullanıcı kablosuz bağlantıyı devre dışı bıraktığı için kullanılamayabilir. Donanım ve donanım yazılımı becerilerine bağlı olarak, bazı SoftAP veya tethering kullanılıyorsa cihazlar kablosuz RTT'yi desteklemeyebilir. WiFi RTT'nin kullanılıp kullanılamadığını kontrol etmek için isAvailable() numaralı telefonu arayın.

Kablosuz RTT'nin kullanılabilirliği herhangi bir zamanda değişebilir. Uygulamanız, kullanılabilirlik durumu değiştiğinde gönderilen ACTION_WIFI_RTT_STATE_CHANGED bildirimini almak için bir BroadcastReceiver kaydetmelidir. Uygulamanız yayın intent'ini aldığında mevcut müsaitlik durumunu kontrol etmeli ve davranışını buna göre ayarlamalıdır.

Örnek:

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);

Daha fazla bilgi için Yayınlar başlıklı makaleyi inceleyin.

Aralık isteği oluştur

Bir kapsam aralığı istenen AP'lerin veya Wi-Fi Aware eşlerinin listesi belirtilerek bir kapsam aralığı isteği (RangingRequest) oluşturulur. Tek bir menzil belirleme isteğinde birden fazla erişim noktası veya Wi-Fi Aware eşlenebilir. Tüm cihazlara olan mesafeler ölçülür ve döndürülür.

Örneğin, bir istekte addAccessPoint() yöntemini kullanın:

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();

Bir erişim noktası, ScanResult nesnesi; bu değer: telefon ederek elde edilir WifiManager.getScanResults(). Tekliflerinizi otomatikleştirmek ve optimize etmek için addAccessPoints(List<ScanResult>) giriş noktası ekleyin.

ScanResult nesneleri hem IEEE 802.11mc (is80211mcResponder()) hem de IEEE 802.11az tetikleyici olmayan aralık (is80211azNtbResponder()) desteklenir Erişim noktaları. IEEE 802.11az NTB aralığını destekleyen cihazlar 802.11mc veya AP'nin kapasitesine bağlı olarak 802.11az aralıklı olarak çalışır. Bağlantı kurulduğunda varsayılan olarak 802.11az kullanılır. erişim noktası her ikisini de destekler. IEEE 802.11az'ı desteklemeyen cihazlar tüm işlevleri yerine getirir IEEE 802.11mc protokolü kullanılarak değişiklik gösterir.

Benzer şekilde, bir aralık isteği, MAC'sinden birini kullanarak bir Wi-Fi Aware eşi ekleyebilir adresini veya PeerHandle alanını kullanarak "the" addWifiAwarePeer(MacAddress peer) ve addWifiAwarePeer(PeerHandle peer) yöntemlerine bakalım. Wi-Fi Aware eşlerini keşfetme hakkında daha fazla bilgi için Wi-Fi Aware dokümanlarına bakın.

İstek aralığı

Uygulama, WifiRttManager.startRanging() yöntemini kullanarak bir menzil isteğinde bulunur ve aşağıdakileri sağlar: işlemi belirtmek için bir RangingRequest, geri çağırma bağlamını belirtmek için bir Executor ve sonuçları almak için bir RangingResultCallback.

Örnek:

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) { … }
});

Aralık işlemi eşzamansız olarak gerçekleştirilir ve aralık sonuçları geri çağırmalarından birinde RangingResultCallback:

  • Aralık işleminin tamamı başarısız olursa onRangingFailure geri çağırma, şurada açıklanan bir durum koduyla tetiklenir: RangingResultCallback. Bu tür bir hata, hizmet bir aralık işlemi yürütemediğinde ortaya çıkabilir (örneğin, Kablosuz bağlantı devre dışı olduğundan uygulama çok fazla aralık işlemi isteğinde bulundu ve işlemi kısıtladı veya izin sorunu.
  • Aralık belirleme işlemi tamamlandığında, onRangingResults geri çağırma işlevi, istek listesiyle eşleşen bir sonuç listesiyle (her istek için bir sonuç) tetiklenir. Sonuçların sırası isteklerin sırasına göre eşleşmesi gerekir. Aralık işleminin bir hata olduğunu işaret edebilir, ancak yine de bahsedeceğim.

Aralık belirleme sonuçlarını yorumlama

Sorgunun döndürdüğü onRangingResults geri çağırma bir RangingResult ile belirtilir nesnesini tanımlayın. Her istek için aşağıdakileri yapın.

1. Talebi tanımlama

İsteği oluştururken verilen bilgilere dayanarak RangingRequest: ScanResult içinde sağlanan, erişimi tanımlayan bir MAC adresi puan. MAC adresi, getMacAddress() yöntemi kullanılarak menzil belirleme sonucundan elde edilebilir.

Aralık bulma sonuçlarının listesi, aralık bulma isteğinde belirtilen eşler (erişim noktaları) ile farklı bir sırada olabilir. Bu nedenle, eşleri tanımlamak için sonuçların sırasını değil, MAC adresini kullanmanız gerekir.

2. Her ölçümün başarılı olup olmadığını belirleme

Bir ölçümün başarılı olup olmadığını belirlemek için getStatus() yöntemini kullanın. Şundan farklı herhangi bir değer: STATUS_SUCCESS bir hata olduğunu gösterir. Hata, bu sonucun diğer tüm alanlarının (yukarıdaki istek kimliği hariç) geçersizse ve ilgili get* yöntemi, IllegalStateException istisna.

3. Her başarılı ölçümün sonuçlarını alma

Her başarılı ölçüm (RangingResult) için ilgili get yöntemleriyle sonuç değerlerini alabilirsiniz:

Kablosuz RTT'yi destekleyen Android cihazlar

Aşağıdaki tablolarda bazı telefonlar, erişim noktaları ve perakende, depo ve dağıtım merkezi cihazları listelenmektedir. kablosuz RTT'yi destekler. Bu örnekler kapsamlı değildir. Önerilerimiz: bize ulaşın RTT özellikli ürünlerinizi burada listeleyin.

Erişim Noktaları

Üretici ve Model Destek Tarihi
Nest Wifi Pro (Wi-Fi 6E) Destekleniyor
Compulab WILD AP Destekleniyor
Google Wi-Fi Destekleniyor
Google Nest Wifi Yönlendirici Destekleniyor
Google Nest Wi-Fi Bağlantı Noktası Destekleniyor
Aruba AP-635 Destekleniyor
Cisco 9130 Destekleniyor
Cisco 9136 Destekleniyor
Cisco 9166 Destekleniyor
Cisco 9164 Destekleniyor
Aruba AP-505 Destekleniyor
Aruba AP-515 Destekleniyor
Aruba AP-575 Destekleniyor
Aruba AP-518 Destekleniyor
Aruba AP-505H Destekleniyor
Aruba AP-565 Destekleniyor
Aruba AP-535 Destekleniyor

Telefonlar

Üretici ve Model Android Sürümü
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 İnce 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+ 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+

Perakende, Depolama ve Dağıtım Merkezi Cihazları

Üretici ve Model Android Sürümü
Zebra PS20 10.0 ve üzeri
Zebra TC52/TC52HC 10.0 ve üzeri
Zebra TC57 10.0 ve üzeri
Zebra TC72 10.0 ve üzeri
Zebra TC77 10.0 ve üzeri
Zebra MC93 10.0 ve üzeri
Zebra TC8300 10.0 ve üzeri
Zebra VC8300 10.0 ve üzeri
Zebra EC30 10.0 ve üzeri
Zebra ET51 10.0 ve üzeri
Zebra ET56 10.0 ve üzeri
Zebra L10 10.0 ve üzeri
Zebra CC600/CC6000 10.0 ve üzeri
Zebra MC3300x 10.0 ve üzeri
Zebra MC330x 10.0 ve üzeri
Zebra TC52x 10.0 ve üzeri
Zebra TC57x 10.0 ve üzeri
Zebra EC50 (LAN ve HC) 10.0 ve üzeri
Zebra EC55 (WAN) 10.0 ve üzeri
Zebra WT6300 10.0 ve üzeri
Skorpio X5 10.0 ve üzeri