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 15 (API düzeyi 35), tetikleyici tabanlı olmayan IEEE 802.11az desteği sundu (NTB) aralığı.
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.
Android 15 çalıştıran cihazlarda IEEE 802.11az NTB aralık desteği kullanılabilir
(API düzeyi 35) ve üzeri sürümler. Bu, cihaz IEEE 802.11az'ı destekliyorsa
NTB yanıtlayıcı modu (
WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER
),
uygulamanız hem IEEE 802.11mc hem de IEEE 802.11az özellikli AP'leri tek bir
aralık isteği. 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.
Gereksinimler
- Aralık isteğini gönderen cihazın donanımı, 802.11-2016 FTM standardı veya 802.11az standardı (tetikleyici olmayan aralık).
- Aralık isteğinde bulunan cihazın Android 9 (API düzeyi) çalıştırması gerekir 28) veya sonraki sürümlerdir. Cihazlarda IEEE 802.11az tetikleyici olmayan aralık etkinleştirildi Android 15 (API düzeyi 35) ve sonraki sürümleri çalıştıran.
- 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
iznidir. 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ı veya IEEE'yi uygulamalıdır 802.11az standardı (tetikleyici olmayan aralık).
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:
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 kullanıcı tarafından
kablosuz bağlantıyı devre dışı bıraktı. Donanım ve donanım yazılımı becerilerine bağlı olarak, bazı
SoftAP veya tethering kullanılıyorsa cihazlar kablosuz RTT'yi desteklemeyebilir. Kontrol etmek için
Kablosuz RTT kullanılabilir mi, şunu ara:
isAvailable()
.
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
) oluşturuldu
belli 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; 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ığı
Bir uygulama,
WifiRttManager.startRanging()
ve aşağıdakileri sağlayarak: a
belirlemek için RangingRequest
işlemi, belirtmek için bir Executor
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: istekleri: Her istek için bir sonuç. 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
ile belirtilir
nesnesini tanımlayın. Her istekte 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ö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_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 ona karşılık gelen
get*
yöntemi,
IllegalStateException
istisna.
3. Her başarılı ölçüm için sonuç alın
Her başarılı ölçüm (RangingResult
) için sonuç alabilirsiniz
değerleri ilgili get
yöntemleriyle değiştirin:
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ığı):
İstemci cihazın 11az NTB arasında beklemesi gereken minimum ve maksimum süre ölçümler:
getMinTimeBetweenNtbMeasurementsMicros()
vegetMaxTimeBetweenNtbMeasurementsMicros()
minimum ve maksimum süreyi döndürür. Bir sonraki aralık ölçümü istenen minimum süre geçtikten sonra API, önbelleğe alınmış aralık sonucu. Sonraki aralık ölçümü şundan sonra istenirse: ulaşılırsa API, tetikleyici olmayan reklam öğesini sonlandırır. bir zaman aralığı oturumu belirler ve yanıt verme istasyon. Yeni bir aralık oturumu istememeniz gerekir, çünkü yeni bir aralık oturumu ek yük oluşturabilirsiniz. 802.11az'dan tam olarak yararlanmak için tetikleyici olmayan aralık verimliliği, sonraki aralık isteğini tetikleyin yukarıda belirtilen minimum ile maksimum ölçüm süreleri arasında,RangingResult
ölçümü.Yanıt veren ve başlatan istasyonlar için Uzun Eğitim Alanı (LTF) tekrarları IEEE 802.11az NTB sonucunun giriş bölümünde kullanıldı:
Başlatıcının gönderdiği ve alan mekansal zaman akışlarının (STS) sayısı IEEE 802.11az NTB sonucu için kullanılan istasyon:
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+ |
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 Not 10 | 9.0+ |
Xiaomi Mi Not 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 İnce | 9.0+ |
LG V50S İnce | 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 ve sonraki modeller | 9.0+ |
Samsung Galaxy S20 (5G) | 9.0+ |
Samsung Galaxy S20 Ultra 5G | 9.0+ |
Samsung Galaxy S20 | 9.0+ |
Samsung Galaxy Note 10 ve sonraki modeller | 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+ |
Keskin 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 |