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 olmakACCESS_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
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:
Milimetre cinsinden mesafe ve ölçümün standart sapması:
Ölçümler için kullanılan paketlerin RSSI'si:
Ölçümün yapıldığı milisaniye cinsinden süre (süreyi gösterir) açılıştan itibaren):
Yapılmaya çalışılan ölçüm sayısı ve yapılan ölçüm sayısı başarılı olan (ve mesafe ölçümlerinin dayandığı):
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 |