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ğrulukla, Google Cloud gibi İç mekan navigasyonu, belirsizleştirilmiş sesli kontrol (örneğin, ışık") ve konuma dayalı bilgiler (örneğin, ne olur?").

İ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 istekte bulunan cihaz erişim noktasına uzaklığı belirlemek için; erişim noktalarında bu bilgilerden faydalanabilirsiniz. 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 Fine-Time-Measurement (FTM) özellikleri, IEEE 802.11-2016 standardı tarafından belirtilir. 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 paketi arasında gidiş dönüş süresini ölçerek bu süreyi ışık hızıyla çarpıyoruz.

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

Kablosuz RTT, Android 9'da (API düzeyi 28) kullanıma sunulmuştur. Bu protokolü kullanırken çalışan cihazlarda çoklu katmanlama kullanarak bir cihazın konumunu belirlemek Android 9, önceden belirlenmiş erişim noktası (AP) konumlarına erişebilmeniz gerekir verileri olacaktır. Bu verilerin nasıl depolanacağına ve alınacağına karar vermek size bağlıdır.

Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran cihazlarda AP konum verileri aşağıdaki gibi olabilir: şu şekilde temsil edilir: ResponderLocation enlem, boylam ve rakım gibi nesneleri belirler. Ş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 bilinmese bile AP'leri bulup konumlarını belirleme, Mesela kullanıcı yeni bir binaya girdiğinde.

Gereksinimler

  • Aralık isteğini gönderen cihazın donanımı, 802.11-2016 FTM standardı.
  • Aralık isteğinde bulunan cihazın Android 9 (API düzeyi) çalıştırması gerekir 28) veya sonraki sürümlerdir.
  • 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 isteğinde bulunan uygulama Android 13 (API düzeyi 33) veya sonraki bir sürüm yüklüyse NEARBY_WIFI_DEVICES izni gerekir. 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 açık durumdayken erişim noktaları aralığını sorgulamalıdır. bir ön plan hizmetidir. Uygulama, buradan konum bilgilerine erişemez arka plan.
  • Erişim noktası IEEE 802.11-2016 FTM standardını uygulamalıdır.

Kurulum

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

1. İzin iste

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 Bu nedenle, kullanıcı bir işlem yapmak istediğinde bu izinleri çalışma zamanında istemeniz gerekir. RTT tarama işlemi gerçekleştirin. 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'si:

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 olabilir, ancak şu anda kullanıcı kablosuz bağlantıyı devre dışı bıraktı. Donanıma ve donanım yazılımına bağlı olarak SoftAP veya tethering özellikleri varsa bazı cihazlar Kablosuz RTT'yi desteklemeyebilir. kullanım durumu. Şu anda kablosuz RTT'nin kullanılabilir olup olmadığını kontrol etmek için şu numarayı arayın: isAvailable() işlevinden emin olun.

Kablosuz RTT'nin kullanılabilirliği herhangi bir zamanda değişebilir. Uygulamanız BroadcastReceiver almak için ACTION_WIFI_RTT_STATE_CHANGED, Bu mesaj, müsaitlik durumu değiştiğinde gönderilir. Uygulamanız yayını aldığında bu durumda uygulama, mevcut kullanılabilirlik durumunu kontrol etmeli buna göre hareket etmesi gerekir.

Ö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 konusuna bakın.

Aralık isteği oluştur

Aralık isteği (RangingRequest), belirli bir aralığın ait olduğu AP'lerin veya Wi-Fi Aware eşlerinin listesini belirterek istenir. Birden çok erişim noktası veya Wi-Fi Aware eş değeri bir tek aralıklı istek; tüm cihazlarla olan mesafeler ölçülüp 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 telefon ederek elde edilir WifiManager.getScanResults(). Tekliflerinizi otomatikleştirmek ve optimize etmek için addAccessPoints(Liste) giriş noktası ekleyin.

Benzer şekilde, bir aralık isteği, MAC'sinden birini kullanarak bir Wi-Fi Aware eşi ekleyebilir adresine veya PeerHandle'a "the" addWifiAwarePeer(MacAddress eşi) 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ığı

Bir uygulama, WifiRttManager.startRanging(). ve aşağıdakileri sağlayarak: a RangingRequest ve işlemini, belirtmek için bir Yürütücü ve geri çağırma bağlamını RangingResultCallback almalısınız.

Ö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. Hizmet, bir aralık işlemi yürütemezse bu tür bir hata meydana gelebilir (ö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.
  • Sıralama işlemi tamamlandığında, onRangingResults geri çağırma, şu listeyle eşleşen bir sonuç listesiyle tetiklenir: Her istek için bir sonuç olmak üzere, isteklerde bir sonuç gösterilir. Sonuçların sırası isteklerin sırasına göre eşleşmesi gerekir. Aralık işleminin bir hata olduğuna işaret edebilir, ancak her sonuç bahsedeceğim.

Aralık sonuçlarını yorumlama

Sorgunun döndürdüğü onRangingResults geri çağırma bir RangingResult tarafından belirtilir nesnesini tanımlayın. Her istekte aşağıdakileri yapın.

1. Talebi tanımlama

İsteği oluştururken verilen bilgilere dayanarak RangingRequest: çoğunlukla ScanResult içinde sağlanan bir MAC adresi puan. MAC adresi, getMacAddress() yöntemidir.

Aralık sonuçlarının listesi, benzerlerden farklı sırada olabilir (erişim noktaları) kullandığınızdan emin olmak için MAC adresini kullanmanız gerekir. sonuç sırasını değil, iş ortağını tanımlamalıdır.

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öntemidir. Şundan farklı herhangi bir değer: STATUS_BAŞARILI 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 ona karşılık gelen get* yöntemi, LegalStateException istisnası.

3. Her başarılı ölçüm için sonuç alın

Her başarılı ölçüm için sonuç değerlerini ilgili get yöntemleri:

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 ölçümler fazla 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 Kablosuz 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 ve sonraki sürümler
Pixel 6 Pro 9.0 ve sonraki sürümler
Pixel 5 9.0 ve sonraki sürümler
Pixel 5a 9.0 ve sonraki sürümler
Pixel 5a (5G) 9.0 ve sonraki sürümler
Xiaomi Mi 10 Pro 9.0 ve sonraki sürümler
Xiaomi Mi 10 9.0 ve sonraki sürümler
Xiaomi Redmi Mi 9T Pro 9.0 ve sonraki sürümler
Xiaomi Mi 9T 9.0 ve sonraki sürümler
Xiaomi Mi 9 9.0 ve sonraki sürümler
Xiaomi Mi Not 10 9.0 ve sonraki sürümler
Xiaomi Mi Not 10 Lite 9.0 ve sonraki sürümler
Xiaomi Redmi Note 9S 9.0 ve sonraki sürümler
Xiaomi Redmi Note 9 Pro 9.0 ve sonraki sürümler
Xiaomi Redmi Note 8T 9.0 ve sonraki sürümler
Xiaomi Redmi Note 8 9.0 ve sonraki sürümler
Xiaomi Redmi K30 Pro 9.0 ve sonraki sürümler
Xiaomi Redmi K20 Pro 9.0 ve sonraki sürümler
Xiaomi Redmi K20 9.0 ve sonraki sürümler
Xiaomi Redmi Note 5 Pro 9.0 ve sonraki sürümler
Xiaomi Mi CC9 Pro 9.0 ve sonraki sürümler
LG G8X İnce 9.0 ve sonraki sürümler
LG V50S İnce 9.0 ve sonraki sürümler
LG V60 İnce 9.0 ve sonraki sürümler
LG V30 9.0 ve sonraki sürümler
Samsung Galaxy Note 10+ (5G) 9.0 ve sonraki sürümler
Samsung Galaxy S20+ (5G) 9.0 ve sonraki sürümler
Samsung Galaxy S20 ve sonraki modeller 9.0 ve sonraki sürümler
Samsung Galaxy S20 (5G) 9.0 ve sonraki sürümler
Samsung Galaxy S20 Ultra 5G 9.0 ve sonraki sürümler
Samsung Galaxy S20 9.0 ve sonraki sürümler
Samsung Galaxy Note 10 ve sonraki modeller 9.0 ve sonraki sürümler
Samsung Galaxy Note 10 (5G) 9.0 ve sonraki sürümler
Samsung Galaxy Note 10 9.0 ve sonraki sürümler
Samsung A9 Pro 9.0 ve sonraki sürümler
Google Pixel 4 XL 9.0 ve sonraki sürümler
Google Pixel 4 9.0 ve sonraki sürümler
Google Pixel 4a 9.0 ve sonraki sürümler
Google Pixel 3 XL 9.0 ve sonraki sürümler
Google Pixel 3 9.0 ve sonraki sürümler
Google Pixel 3a XL 9.0 ve sonraki sürümler
Google Pixel 3a 9.0 ve sonraki sürümler
Google Pixel 2 XL 9.0 ve sonraki sürümler
Google Pixel 2 9.0 ve sonraki sürümler
Google Pixel 1 XL 9.0 ve sonraki sürümler
Google Pixel 1 9.0 ve sonraki sürümler
Poco X2 9.0 ve sonraki sürümler
Keskin Aquos R3 SH-04L 9.0 ve sonraki sürümler

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