Anda dapat menggunakan fungsi lokasi Wi-Fi yang disediakan oleh Wi-Fi RTT (Round-Trip-Time) API untuk mengukur jarak ke titik akses Wi-Fi berkemampuan RTT terdekat dan perangkat Wi-Fi Aware peer.
Jika Anda mengukur jarak ke tiga titik akses atau lebih, Anda dapat menggunakan algoritme multilaterasi untuk memperkirakan posisi perangkat yang paling sesuai dengan pengukuran tersebut. Hasilnya biasanya akurat dalam 1-2 meter.
Dengan keakuratan ini, Anda dapat mengembangkan layanan berdasarkan lokasi yang sangat akurat, seperti navigasi dalam ruangan, kontrol suara yang diperjelas (misalnya, "Nyalakan lampu ini"), dan informasi berdasarkan lokasi (misalnya, "Apakah ada penawaran spesial untuk produk ini?").
Perangkat yang melakukan permintaan tidak perlu terhubung ke titik akses untuk mengukur jarak dengan Wi-Fi RTT. Untuk menjaga privasi, hanya perangkat yang meminta yang dapat menentukan jarak ke titik akses; titik akses tidak memiliki informasi ini. Operasi Wi-Fi RTT tidak terbatas untuk aplikasi latar depan tetapi dibatasi untuk aplikasi latar belakang.
Wi-Fi RTT dan kemampuan terkait Fine-Time-Measurement (FTM) ditentukan oleh standar IEEE 802.11-2016. Wi-Fi RTT memerlukan pengukuran waktu yang tepat yang disediakan oleh FTM karena menghitung jarak antara dua perangkat dengan mengukur waktu yang dibutuhkan paket untuk melakukan perjalanan bolak-balik antara perangkat dan mengalikan waktu itu dengan kecepatan cahaya.
Android 15 (API level 35) memperkenalkan dukungan untuk IEEE 802.11az berbasis non-pemicu (NTB).
Perbedaan implementasi berdasarkan versi Android
Wi-Fi RTT diperkenalkan di Android 9 (API level 28). Saat menggunakan protokol ini untuk menentukan posisi perangkat menggunakan multilaterasi dengan perangkat yang menjalankan Android 9, Anda harus memiliki akses ke data lokasi titik akses (AP) yang telah ditentukan sebelumnya di aplikasi. Anda bebas menentukan cara menyimpan dan mengambil data ini.
Pada perangkat yang menjalankan Android 10 (API level 29) dan lebih tinggi, data lokasi AP dapat direpresentasikan sebagai objek ResponderLocation
, yang mencakup lintang, bujur, dan ketinggian. Untuk AP Wi-Fi RTT yang mendukung Location Configuration Information/Location Civic Report (data LCI/LCR), protokol akan menampilkan objek ResponderLocation
selama proses ranging.
Fitur ini memungkinkan aplikasi meminta AP untuk menanyakan posisi mereka secara langsung tanpa perlu menyimpan informasi ini sebelumnya. Jadi, aplikasi Anda dapat menemukan AP dan menentukan posisi mereka meskipun AP tidak diketahui sebelumnya, seperti ketika pengguna memasuki gedung baru.
Dukungan rentang IEEE 802.11az NTB tersedia di perangkat yang menjalankan Android 15
(level API 35) dan yang lebih tinggi. Itu berarti bahwa jika perangkat
mendukung IEEE 802.11az
Mode inisiator NTB (ditunjukkan dengan
WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR
),
aplikasi Anda dapat menemukan AP
yang mampu IEEE 802.11mc dan IEEE 802.11az dengan
permintaan rentang. RangingResult
API telah diperluas untuk memberikan informasi
tentang nilai minimum dan maksimum yang dapat digunakan untuk interval antara
pengukuran rentang, sehingga interval yang tepat berada dalam kontrol aplikasi Anda.
Persyaratan
- Perangkat keras perangkat yang membuat permintaan ranging harus menerapkan 802.11-2016 FTM standar atau 802.11az standar (non-pemicu berbasis mulai).
- Perangkat yang membuat permintaan ranging harus menjalankan Android 9 (API level 28) atau yang lebih baru. Rentang berbasis non-pemicu IEEE 802.11az diaktifkan di perangkat menjalankan Android 15 (level API 35) dan yang lebih tinggi.
- Perangkat yang membuat permintaan ranging harus mengaktifkan layanan lokasi dan pemindaian Wi-Fi (dalam Setelan > Lokasi).
- Jika aplikasi yang membuat target permintaan rentang
Android 13 (API level 33) atau yang lebih baru harus memiliki
NEARBY_WIFI_DEVICES
izin akses. Jika aplikasi semacam itu menargetkan versi Android yang lebih lama, aplikasi tersebut harus mintaACCESS_FINE_LOCATION
izin akses. - Aplikasi harus meminta rentang titik akses saat aplikasi terlihat atau ada di layanan latar depan. Aplikasi tidak dapat mengakses informasi lokasi dari latar belakang.
- Titik akses harus menerapkan standar FTM IEEE 802.11-2016 atau standar IEEE 802.11az (pengukuran jarak non-berbasis pemicu).
Penyiapan
Untuk menyiapkan aplikasi Anda menggunakan Wi-Fi RTT, lakukan langkah-langkah berikut.
1. Minta izin
Minta izin berikut dalam manifes aplikasi Anda:
<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" />
Izin NEARBY_WIFI_DEVICES
dan ACCESS_FINE_LOCATION
adalah izin
berbahaya, jadi Anda harus memintanya saat runtime setiap kali pengguna ingin
melakukan operasi pemindaian RTT. Aplikasi Anda harus meminta informasi
jika izin akses belum diberikan. Untuk informasi selengkapnya
tentang izin runtime, lihat
Meminta Izin Aplikasi.
2. Periksa apakah perangkat mendukung Wi-Fi RTT
Untuk memeriksa apakah perangkat mendukung Wi-Fi RTT, gunakan
PackageManager
API:
Kotlin
context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
Java
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
3. Periksa apakah Wi-Fi RTT tersedia
Wi-Fi RTT mungkin ada pada perangkat, tetapi mungkin tidak tersedia karena pengguna
telah menonaktifkan Wi-Fi. Tergantung pada kemampuan perangkat
keras dan {i>firmware<i} mereka,
perangkat mungkin tidak mendukung Wi-Fi RTT jika SoftAP atau tethering sedang digunakan. Untuk memeriksa
apakah Wi-Fi RTT tersedia, panggil
isAvailable()
.
Ketersediaan Wi-Fi RTT dapat berubah kapan saja. Aplikasi Anda harus mendaftarkan
BroadcastReceiver
untuk menerima
ACTION_WIFI_RTT_STATE_CHANGED
,
yang dikirim saat ketersediaan berubah. Ketika aplikasi Anda menerima intent siaran, aplikasi harus memeriksa kondisi ketersediaan saat ini dan menyesuaikan perilakunya dengan sesuai.
Contoh:
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);
Untuk informasi selengkapnya, lihat Siaran.
Membuat permintaan ranging
Permintaan ranging
(RangingRequest
) dibuat
dengan menentukan daftar AP atau peer Wi-Fi Aware yang dimintai range. Beberapa titik akses atau peer Wi-Fi Aware dapat ditentukan dalam satu permintaan ranging; jarak ke semua perangkat diukur dan dikembalikan.
Misalnya, permintaan dapat menggunakan
addAccessPoint()
untuk menetapkan titik akses untuk mengukur jarak:
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();
Titik akses diidentifikasi oleh
objek ScanResult
, yang dapat
diperoleh dengan memanggil
WifiManager.getScanResults()
.
Anda dapat menggunakan
addAccessPoints(List<ScanResult>)
untuk menambahkan beberapa
titik akses dalam satu batch.
Objek ScanResult
dapat berisi AP yang mendukung IEEE 802.11mc (is80211mcResponder()
) dan pengukuran jarak berbasis non-pemicu IEEE 802.11az (is80211azNtbResponder()
). Perangkat yang mendukung rentang IEEE 802.11az NTB melakukan 802.11mc atau
802.11az yang berkisar tergantung pada
kemampuan AP, {i>default-<i}nya menjadi 802.11az ketika
AP mendukung keduanya. Perangkat yang tidak mendukung IEEE 802.11az melakukan semua
pengukuran jarak menggunakan protokol IEEE 802.11mc.
Demikian pula, permintaan ranging bisa menambahkan
rekan Wi-Fi Aware menggunakan
atau PeerHandle
-nya, menggunakan
tindakan
addWifiAwarePeer(MacAddress peer)
dan addWifiAwarePeer(PeerHandle peer)
masing-masing. Untuk informasi selengkapnya tentang menemukan rekan Wi-Fi Aware,
lihat dokumentasi Wi-Fi Aware.
Permintaan ranging
Aplikasi mengeluarkan permintaan ranging menggunakan metode WifiRttManager.startRanging()
dan menyediakan hal berikut: RangingRequest
untuk menentukan operasinya, Executor
untuk menentukan konteks callback, dan RangingResultCallback
untuk menerima hasilnya.
Contoh:
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) { … } });
Operasi ranging dilakukan secara asinkron, dan hasil ranging
dikembalikan dalam salah satu callback dari
RangingResultCallback
:
- Jika keseluruhan operasi ranging gagal, callback
onRangingFailure
akan dipicu dengan kode status yang dijelaskan dalamRangingResultCallback
. Kegagalan tersebut dapat terjadi jika layanan tidak dapat melakukan operasi ranging pada saat itu. Misalnya, karena Wi-Fi dinonaktifkan, karena aplikasi telah meminta terlalu banyak operasi ranging dan dibatasi, atau karena masalah izin. - Ketika operasi ranging selesai,
onRangingResults
akan dipicu dengan daftar hasil yang cocok dengan daftar permintaan—satu hasil untuk setiap permintaan. Urutan hasil tidak harus sesuai dengan urutan permintaan. Perhatikan bahwa operasi ranging mungkin selesai tetapi setiap hasil mungkin masih menunjukkan kegagalan pengukuran spesifik tersebut.
Menginterpretasikan hasil ranging
Setiap hasil yang ditampilkan oleh
onRangingResults
callback ditentukan oleh RangingResult
. Pada setiap permintaan, lakukan hal berikut.
1. Identifikasi permintaan
Identifikasi permintaan berdasarkan informasi yang diberikan saat membuat
RangingRequest
:
paling sering adalah alamat MAC yang disediakan di ScanResult
yang mengidentifikasi akses
poin. Alamat MAC dapat diperoleh dari hasil pengukuran jarak menggunakan metode
getMacAddress()
.
Daftar hasil ranging mungkin berada dalam urutan berbeda dari peer (titik akses) yang ditentukan dalam permintaan ranging, jadi Anda harus menggunakan alamat MAC untuk mengidentifikasi peer, bukan urutan hasil.
2. Tentukan apakah setiap pengukuran berhasil
Untuk menentukan apakah suatu pengukuran berhasil, gunakan metode getStatus()
. Nilai apa pun selain
STATUS_SUCCESS
menunjukkan kegagalan. Kegagalan berarti semua kolom lain dari hasil ini (kecuali identifikasi permintaan di atas) tidak valid, dan metode get*
yang sesuai akan gagal dengan pengecualian IllegalStateException
.
3. Dapatkan hasil untuk setiap pengukuran yang berhasil
Untuk setiap pengukuran yang berhasil (RangingResult
), Anda dapat mengambil hasilnya
dengan metode get
masing-masing:
Jarak, dalam mm, dan standar deviasi pengukuran:
RSSI dari paket yang digunakan untuk pengukuran:
Waktu dalam milidetik saat pengukuran dilakukan (menunjukkan waktu sejak booting):
Jumlah pengukuran yang dicoba dan jumlah pengukuran yang berhasil (dan yang menjadi dasar pengukuran jarak):
Waktu minimum dan maksimum perangkat klien harus menunggu antara NTB 11az pengukuran:
getMinTimeBetweenNtbMeasurementsMicros()
dangetMaxTimeBetweenNtbMeasurementsMicros()
menampilkan waktu minimum dan maksimum. Jika pengukuran rentang berikutnya diminta sebelum waktu minimum berlalu, API akan menampilkan hasil rentang yang di-cache. Jika pengukuran rentang berikutnya diminta setelah waktu maksimum berlalu, API akan menghentikan sesi pengukuran rentang non-pemicu dan menegosiasikan sesi pengukuran rentang baru dengan stasiun yang merespons. Sebaiknya jangan meminta sesi pengukuran rentang baru, karena akan menambahkan overhead ke waktu pengukuran rentang. Untuk memanfaatkan sepenuhnya 802.11az efisiensi rentang berbasis non-pemicu, memicu permintaan rentang berikutnya antara waktu pengukuran minimum dan maksimum yang ditentukan dalam rentang PengukuranRangingResult
.Pengulangan Long Training Field (LTF) yang digunakan oleh stasiun perespons dan penginisiasi dalam awalan untuk hasil NTB IEEE 802.11az:
Jumlah aliran waktu spasial transmisi dan penerimaan (STS) yang dilakukan inisiator stasiun yang digunakan untuk hasil IEEE 802.11az NTB:
Perangkat Android yang mendukung Wi-Fi RTT
Tabel berikut mencantumkan beberapa ponsel, titik akses, dan perangkat retail, penyimpanan, dan pusat distribusi yang mendukung Wi-Fi RTT. Ini jauh dari komprehensif. Sebaiknya Anda menghubungi kami untuk mencantumkan produk-produk dengan kemampuan RTT di sini.
Titik Akses (AP)
Produsen dan Model | Tanggal Dukungan |
---|---|
Nest Wifi Pro (Wi-Fi 6E) | Didukung |
Compulab WILD AP | Didukung |
Google Wi-Fi | Didukung |
Router Google Nest Wi-Fi | Didukung |
Titik Google Nest Wi-Fi | Didukung |
Aruba AP-635 | Didukung |
Cisco 9130 | Didukung |
Cisco 9136 | Didukung |
Cisco 9166 | Didukung |
Cisco 9164 | Didukung |
Aruba AP-505 | Didukung |
Aruba AP-515 | Didukung |
Aruba AP-575 | Didukung |
Aruba AP-518 | Didukung |
Aruba AP-505H | Didukung |
Aruba AP-565 | Didukung |
Aruba AP-535 | Didukung |
Ponsel
Produsen dan Model | Versi Android |
---|---|
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+ | 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+ |
Perangkat Pusat Ritel, Pergudangan, dan Distribusi
Produsen dan Model | Versi Android |
---|---|
Zebra PS20 | 10.0+ |
Zebra TC52/TC52HC | 10.0 dan yang lebih baru |
Zebra TC57 | 10.0+ |
TC72 Zebra | 10.0 dan yang lebih baru |
Zebra TC77 | 10.0+ |
Zebra MC93 | 10.0 dan yang lebih baru |
Zebra TC8300 | 10.0+ |
Zebra VC8300 | 10.0+ |
Zebra EC30 | 10.0+ |
Zebra ET51 | 10.0 dan yang lebih baru |
Zebra ET56 | 10.0 dan yang lebih baru |
Zebra L10 | 10.0 dan yang lebih baru |
Zebra CC600/CC6000 | 10.0 dan yang lebih baru |
Zebra MC3300x | 10.0+ |
Zebra MC330x | 10.0 dan yang lebih baru |
TC52x Zebra | 10.0+ |
Zebra TC57x | 10.0+ |
Zebra EC50 (LAN dan HC) | 10.0+ |
Zebra EC55 (WAN) | 10.0+ |
Zebra WT6300 | 10.0 dan yang lebih baru |
Skorpio X5 | 10,0 dan yang lebih baru |