مکان Wi-Fi: محدوده با RTT

می توانید از عملکرد مکان Wi-Fi ارائه شده توسط Wi-Fi RTT (Round-Trip-Time) API برای اندازه گیری فاصله تا نقاط دسترسی Wi-Fi با قابلیت RTT نزدیک و دستگاه های Wi-Fi Aware همتا استفاده کنید.

اگر فاصله سه یا چند نقطه دسترسی را اندازه‌گیری کنید، می‌توانید از یک الگوریتم چندلایه‌ای برای تخمین موقعیت دستگاهی که به بهترین وجه با این اندازه‌ها منطبق است، استفاده کنید. نتیجه معمولاً در فاصله 1-2 متری دقیق است.

با این دقت، می‌توانید سرویس‌های مبتنی بر مکان دقیق، مانند ناوبری داخلی، کنترل صوتی مبهم (به عنوان مثال، «این چراغ را روشن کنید»)، و اطلاعات مبتنی بر مکان (به‌عنوان مثال، «آیا پیشنهادهای ویژه‌ای برای این محصول؟").

دستگاه درخواست کننده برای اندازه گیری فاصله با Wi-Fi RTT نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی، فقط دستگاه درخواست کننده می تواند فاصله تا نقطه دسترسی را تعیین کند. نقاط دسترسی این اطلاعات را ندارند. عملیات RTT Wi-Fi برای برنامه های پیش زمینه نامحدود است اما برای برنامه های پس زمینه محدود می شود.

Wi-Fi RTT و قابلیت های Fine-Time-Measurement (FTM) مربوطه توسط استاندارد IEEE 802.11-2016 مشخص شده است. Wi-Fi RTT به اندازه‌گیری زمان دقیق ارائه شده توسط FTM نیاز دارد زیرا فاصله بین دو دستگاه را با اندازه‌گیری زمانی که یک بسته برای رفت و برگشت بین دستگاه‌ها طول می‌کشد و ضرب آن زمان در سرعت نور محاسبه می‌کند.

اندروید 15 (سطح API 35) پشتیبانی از محدوده غیر ماشه ای (NTB) IEEE 802.11az را معرفی کرد.

تفاوت های پیاده سازی بر اساس نسخه اندروید

Wi-Fi RTT در اندروید 9 (سطح API 28) معرفی شد. هنگام استفاده از این پروتکل برای تعیین موقعیت دستگاه با استفاده از چندلایه بودن با دستگاه های دارای Android 9، باید به داده های مکان های نقطه دسترسی (AP) از پیش تعیین شده در برنامه خود دسترسی داشته باشید. این شما هستید که تصمیم می گیرید چگونه این داده ها را ذخیره و بازیابی کنید.

در دستگاه‌های دارای Android 10 (سطح API 29) و بالاتر، داده‌های مکان AP را می‌توان به‌عنوان اشیاء ResponderLocation نشان داد که شامل طول، طول و عرض جغرافیایی و ارتفاع می‌شود. برای APهای Wi-Fi RTT که اطلاعات پیکربندی موقعیت مکانی/گزارش مدنی موقعیت مکانی (داده‌های LCI/LCR) را پشتیبانی می‌کنند، پروتکل یک شی ResponderLocation را در طول فرآیند محدوده برمی‌گرداند.

این ویژگی به برنامه‌ها اجازه می‌دهد به جای اینکه نیاز به ذخیره این اطلاعات از قبل داشته باشند، از APها درخواست کنند تا موقعیت خود را مستقیماً از آنها بپرسند. بنابراین، برنامه شما می‌تواند APها را پیدا کند و موقعیت آنها را تعیین کند، حتی اگر APها قبلاً شناخته شده نبودند، مانند زمانی که کاربر وارد یک ساختمان جدید می‌شود.

پشتیبانی از محدوده IEEE 802.11az NTB در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر در دسترس است. این بدان معناست که اگر دستگاه از حالت پاسخ‌دهنده IEEE 802.11az NTB (که توسط WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER نشان داده شده است) پشتیبانی می‌کند، برنامه شما می‌تواند هر دو IEEE 802.11mc و IEEE 802.11az را با درخواست‌های محدوده تکی پیدا کند. RangingResult API گسترش یافته است تا اطلاعاتی درباره حداقل و حداکثر مقداری که می‌تواند برای فاصله بین اندازه‌گیری‌های محدوده استفاده شود، ارائه می‌کند و فاصله دقیق را در کنترل برنامه شما باقی می‌گذارد.

الزامات

  • سخت افزار دستگاهی که درخواست محدوده را ارائه می دهد باید استاندارد 802.11-2016 FTM یا استاندارد 802.11az (محدوده غیر محرک) را اجرا کند.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید دارای Android 9 (سطح API 28) یا بالاتر باشد. IEEE 802.11az بدون ماشه در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر فعال است.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید خدمات مکان را فعال و اسکن Wi-Fi را روشن کند (در تنظیمات > مکان ).
  • اگر برنامه ای که درخواست محدوده را ارائه می کند Android 13 (سطح API 33) یا بالاتر را هدف قرار می دهد، باید مجوز NEARBY_WIFI_DEVICES را داشته باشد. اگر چنین برنامه‌ای نسخه قبلی Android را هدف قرار دهد، باید مجوز ACCESS_FINE_LOCATION را داشته باشد.
  • وقتی برنامه قابل مشاهده است یا در یک سرویس پیش زمینه است، برنامه باید محدوده نقاط دسترسی را جستجو کند. برنامه نمی تواند به اطلاعات مکان از پس زمینه دسترسی پیدا کند .
  • نقطه دسترسی باید استاندارد IEEE 802.11-2016 FTM یا استاندارد IEEE 802.11az (محدوده غیر محرک) را اجرا کند.

راه اندازی

برای تنظیم برنامه خود برای استفاده از Wi-Fi RTT، مراحل زیر را انجام دهید.

1. درخواست مجوز

مجوزهای زیر را در مانیفست برنامه خود درخواست کنید:

<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 و ACCESS_FINE_LOCATION مجوزهای خطرناکی هستند، بنابراین باید هر بار که کاربر می‌خواهد عملیات اسکن RTT را انجام دهد، آنها را در زمان اجرا درخواست کنید. اگر مجوز قبلاً اعطا نشده باشد، برنامه شما باید مجوز کاربر را درخواست کند. برای اطلاعات بیشتر درباره مجوزهای زمان اجرا، به درخواست مجوزهای برنامه مراجعه کنید.

2. بررسی کنید که آیا دستگاه از Wi-Fi RTT پشتیبانی می کند یا خیر

برای بررسی اینکه آیا دستگاه از Wi-Fi RTT پشتیبانی می‌کند، از PackageManager API استفاده کنید:

کاتلین

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

جاوا

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

3. بررسی کنید که آیا Wi-Fi RTT در دسترس است یا خیر

Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد، اما ممکن است در دسترس نباشد زیرا کاربر Wi-Fi را غیرفعال کرده است. بسته به قابلیت‌های سخت‌افزار و میان‌افزار، ممکن است برخی از دستگاه‌ها در صورت استفاده از SoftAP یا تترینگ از Wi-Fi RTT پشتیبانی نکنند. برای بررسی اینکه آیا Wi-Fi RTT در دسترس است یا خیر، با isAvailable() تماس بگیرید.

در دسترس بودن Wi-Fi RTT می تواند در هر زمان تغییر کند. برنامه شما باید یک BroadcastReceiver برای دریافت ACTION_WIFI_RTT_STATE_CHANGED ثبت کند که در صورت تغییر در دسترس بودن ارسال می شود. وقتی برنامه شما هدف پخش را دریافت می کند، برنامه باید وضعیت فعلی در دسترس بودن را بررسی کند و رفتار خود را بر اساس آن تنظیم کند.

به عنوان مثال:

کاتلین

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)

جاوا

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

برای اطلاعات بیشتر، به پخش‌ها مراجعه کنید.

یک درخواست دامنه دار ایجاد کنید

یک درخواست محدوده ( RangingRequest ) با تعیین لیستی از AP ​​یا همتایان Wi-Fi Aware که محدوده درخواست شده برای آنها ایجاد می شود. چندین نقطه دسترسی یا همتایان Wi-Fi Aware را می توان در یک درخواست محدوده مشخص کرد. فاصله تا همه دستگاه ها اندازه گیری و برگردانده می شود.

به عنوان مثال، یک درخواست می تواند از متد addAccessPoint() برای تعیین نقطه دسترسی برای اندازه گیری فاصله استفاده کند:

کاتلین

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

جاوا

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

یک نقطه دسترسی با شیء ScanResult آن شناسایی می‌شود که با فراخوانی WifiManager.getScanResults() قابل دریافت است. می توانید addAccessPoints(List<ScanResult>) برای اضافه کردن چندین نقطه دسترسی در یک دسته استفاده کنید.

اشیاء ScanResult می‌توانند شامل هر دو IEEE 802.11mc ( is80211mcResponder() ) و IEEE 802.11az با محدوده غیر محرک ( is80211azNtbResponder() ) APهای پشتیبانی شده باشند. دستگاه‌هایی که از محدوده IEEE 802.11az NTB پشتیبانی می‌کنند، بسته به قابلیت AP، محدوده 802.11mc یا 802.11az را انجام می‌دهند، زمانی که AP از هر دو پشتیبانی می‌کند، پیش‌فرض 802.11az می‌شود. دستگاه هایی که از IEEE 802.11az پشتیبانی نمی کنند، همه محدوده ها را با استفاده از پروتکل IEEE 802.11mc انجام می دهند.

به طور مشابه، یک درخواست محدوده می‌تواند یک همتای Wi-Fi Aware را با استفاده از آدرس MAC یا PeerHandle خود، با استفاده از روش‌های addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer) اضافه کند. برای اطلاعات بیشتر درباره پیدا کردن همتایان Wi-Fi Aware، به مستندات Wi-Fi Aware مراجعه کنید.

محدوده درخواست

یک برنامه با استفاده از متد WifiRttManager.startRanging() درخواست محدوده ای را صادر می کند و موارد زیر را ارائه می دهد: RangingRequest برای مشخص کردن عملیات، Executor برای مشخص کردن زمینه پاسخگویی، و RangingResultCallback برای دریافت نتایج.

به عنوان مثال:

کاتلین

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

جاوا

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

عملیات محدوده به صورت ناهمزمان انجام می شود و نتایج دامنه در یکی از فراخوانی های RangingResultCallback برگردانده می شود:

  • اگر کل عملیات محدوده ناموفق باشد، پاسخ به تماس onRangingFailure با کد وضعیتی که در RangingResultCallback توضیح داده شده است، راه اندازی می شود. اگر سرویس نتواند یک عملیات محدوده را در آن زمان اجرا کند، چنین شکستی ممکن است اتفاق بیفتد - برای مثال، به دلیل غیرفعال بودن Wi-Fi، به دلیل اینکه برنامه عملیات محدوده زیادی را درخواست کرده است و درنگ است، یا به دلیل یک مشکل مجوز.
  • هنگامی که عملیات محدوده به پایان رسید، پاسخ به تماس onRangingResults با فهرستی از نتایج که با فهرست درخواست‌ها مطابقت دارد راه‌اندازی می‌شود—یک نتیجه برای هر درخواست. ترتیب نتایج لزوماً با ترتیب درخواست ها مطابقت ندارد. توجه داشته باشید که عملیات محدوده ممکن است کامل شود اما هر نتیجه همچنان ممکن است نشان دهنده شکست آن اندازه گیری خاص باشد.

نتایج دامنه ای را تفسیر کنید

هر یک از نتایجی که با فراخوانی onRangingResults برگردانده می شود توسط یک شی RangingResult مشخص می شود. در مورد هر درخواست، موارد زیر را انجام دهید.

1. درخواست را شناسایی کنید

درخواست را بر اساس اطلاعات ارائه شده هنگام ایجاد RangingRequest شناسایی کنید: اغلب یک آدرس MAC ارائه شده در ScanResult که یک نقطه دسترسی را شناسایی می کند. آدرس MAC را می توان با استفاده از متد getMacAddress() از نتیجه محدوده بدست آورد.

فهرست نتایج محدوده ممکن است به ترتیب متفاوت با همتاها (نقاط دسترسی) مشخص شده در درخواست محدوده باشد، بنابراین باید از آدرس MAC برای شناسایی همتا استفاده کنید نه ترتیب نتایج.

2. تعیین کنید که آیا هر اندازه گیری موفقیت آمیز بوده است یا خیر

برای تعیین موفقیت آمیز بودن اندازه گیری، از متد getStatus() استفاده کنید. هر مقداری غیر از STATUS_SUCCESS نشان دهنده خرابی است. خطا به این معنی است که تمام فیلدهای دیگر این نتیجه (به جز شناسایی درخواست بالا) نامعتبر هستند و متد get* مربوطه با یک استثناء IllegalStateException ناموفق خواهد بود.

3. برای هر اندازه گیری موفقیت آمیز نتیجه بگیرید

برای هر اندازه گیری موفق ( RangingResult )، می توانید مقادیر نتیجه را با روش های get مربوطه بازیابی کنید:

  • فاصله، بر حسب میلی متر و انحراف استاندارد اندازه گیری:

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI بسته های مورد استفاده برای اندازه گیری:

    getRssi()

  • زمان بر حسب میلی ثانیه که در آن اندازه گیری انجام شد (نشان دهنده زمان از زمان راه اندازی):

    getRangingTimestampMillis()

  • تعداد اندازه‌گیری‌هایی که انجام شد و تعداد اندازه‌گیری‌هایی که موفقیت‌آمیز شدند (و اندازه‌گیری‌های فاصله بر آن‌ها استوار است):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • حداقل و حداکثر زمانی که یک دستگاه مشتری باید بین اندازه گیری های NTB 11az صبر کند:

    getMinTimeBetweenNtbMeasurementsMicros() و getMaxTimeBetweenNtbMeasurementsMicros() حداقل و حداکثر زمان را برمی گرداند. اگر اندازه گیری محدوده بعدی قبل از سپری شدن حداقل زمان درخواست شود، API نتیجه محدوده ذخیره شده را برمی گرداند. اگر اندازه‌گیری محدوده بعدی پس از سپری شدن حداکثر زمان درخواست شود، API جلسه محدوده غیر محرک را خاتمه می‌دهد و یک جلسه محدوده جدید با ایستگاه پاسخ‌دهنده مذاکره می‌کند. شما باید از درخواست یک جلسه محدوده جدید خودداری کنید، زیرا این کار سربار را به زمان اندازه گیری محدوده اضافه می کند. برای بهره‌مندی کامل از راندمان محدوده غیر ماشه‌ای 802.11az، درخواست محدوده بعدی را بین حداقل و حداکثر زمان اندازه‌گیری مشخص‌شده در اندازه‌گیری قبلی RangingResult فعال کنید.

  • تکرارهای Long Training Field (LTF) که ایستگاه های پاسخ دهنده و آغازگر در مقدمه نتیجه IEEE 802.11az NTB استفاده کردند:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • تعداد انتقال و دریافت جریان های زمانی مکانی (STS) که ایستگاه آغازگر برای نتیجه IEEE 802.11az NTB استفاده کرد:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

دستگاه های اندرویدی که از WiFi-RTT پشتیبانی می کنند

در جداول زیر برخی از تلفن‌ها ، نقاط دسترسی و دستگاه‌های خرده‌فروشی، انبارداری و توزیع که از WiFi-RTT پشتیبانی می‌کنند، فهرست شده‌اند. اینها به دور از جامعیت هستند. ما شما را تشویق می کنیم که با ما تماس بگیرید تا محصولات با قابلیت RTT خود را در اینجا لیست کنید.

نقاط دسترسی

سازنده و مدل تاریخ پشتیبانی
Nest Wifi Pro (Wi-Fi 6E) پشتیبانی می شود
Compulab WILD AP پشتیبانی می شود
گوگل وای فای پشتیبانی می شود
روتر Wi-Fi Google Nest پشتیبانی می شود
Google Nest Wi-Fi Point پشتیبانی می شود
آروبا AP-635 پشتیبانی می شود
سیسکو 9130 پشتیبانی می شود
سیسکو 9136 پشتیبانی می شود
سیسکو 9166 پشتیبانی می شود
سیسکو 9164 پشتیبانی می شود
آروبا AP-505 پشتیبانی می شود
آروبا AP-515 پشتیبانی می شود
آروبا AP-575 پشتیبانی می شود
آروبا AP-518 پشتیبانی می شود
آروبا AP-505H پشتیبانی می شود
آروبا AP-565 پشتیبانی می شود
آروبا AP-535 پشتیبانی می شود

تلفن ها

سازنده و مدل نسخه اندروید
پیکسل 6 9.0+
پیکسل 6 پرو 9.0+
پیکسل 5 9.0+
پیکسل 5a 9.0+
Pixel 5a 5G 9.0+
شیائومی می 10 پرو 9.0+
شیائومی می 10 9.0+
شیائومی ردمی می 9 تی پرو 9.0+
شیائومی می 9 تی 9.0+
شیائومی می 9 9.0+
شیائومی می نوت 10 9.0+
شیائومی می نوت 10 لایت 9.0+
شیائومی ردمی نوت 9 اس 9.0+
شیائومی ردمی نوت 9 پرو 9.0+
شیائومی ردمی نوت 8 تی 9.0+
شیائومی ردمی نوت 8 9.0+
شیائومی ردمی K30 پرو 9.0+
شیائومی ردمی K20 پرو 9.0+
شیائومی ردمی K20 9.0+
شیائومی ردمی نوت 5 پرو 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
ال جی وی 30 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+
سامسونگ گلکسی اس 20 9.0+
سامسونگ گلکسی نوت 10 پلاس 9.0+
سامسونگ گلکسی نوت 10 5G 9.0+
سامسونگ گلکسی نوت 10 9.0+
سامسونگ A9 پرو 9.0+
گوگل پیکسل 4 ایکس ال 9.0+
گوگل پیکسل 4 9.0+
گوگل پیکسل 4a 9.0+
گوگل پیکسل 3 ایکس ال 9.0+
گوگل پیکسل 3 9.0+
Google Pixel 3a XL 9.0+
گوگل پیکسل 3a 9.0+
Google Pixel 2 XL 9.0+
گوگل پیکسل 2 9.0+
Google Pixel 1 XL 9.0+
گوگل پیکسل 1 9.0+
پوکو ایکس 2 9.0+
شارپ Aquos R3 SH-04L 9.0+

دستگاه های خرده فروشی، انبارداری و مرکز توزیع

سازنده و مدل نسخه اندروید
Zebra PS20 10.0+
زبرا TC52/TC52HC 10.0+
زبرا TC57 10.0+
زبرا TC72 10.0+
زبرا TC77 10.0+
زبرا MC93 10.0+
زبرا TC8300 10.0+
Zebra VC8300 10.0+
زبرا EC30 10.0+
زبرا ET51 10.0+
زبرا ET56 10.0+
زبرا L10 10.0+
زبرا CC600/CC6000 10.0+
Zebra MC3300x 10.0+
زبرا MC330x 10.0+
زبرا TC52x 10.0+
زبرا TC57x 10.0+
Zebra EC50 (LAN و HC) 10.0+
Zebra EC55 (WAN) 10.0+
زبرا WT6300 10.0+
Skorpio X5 10.0+
،

می توانید از عملکرد مکان Wi-Fi ارائه شده توسط Wi-Fi RTT (Round-Trip-Time) API برای اندازه گیری فاصله تا نقاط دسترسی Wi-Fi با قابلیت RTT نزدیک و دستگاه های Wi-Fi Aware همتا استفاده کنید.

اگر فاصله سه یا چند نقطه دسترسی را اندازه‌گیری کنید، می‌توانید از یک الگوریتم چندلایه‌ای برای تخمین موقعیت دستگاهی که به بهترین وجه با این اندازه‌ها منطبق است، استفاده کنید. نتیجه معمولاً در فاصله 1-2 متری دقیق است.

با این دقت، می‌توانید سرویس‌های مبتنی بر مکان دقیق، مانند ناوبری داخلی، کنترل صوتی مبهم (به عنوان مثال، «این چراغ را روشن کنید»)، و اطلاعات مبتنی بر مکان (به‌عنوان مثال، «آیا پیشنهادهای ویژه‌ای برای این محصول؟").

دستگاه درخواست کننده برای اندازه گیری فاصله با Wi-Fi RTT نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی، فقط دستگاه درخواست کننده می تواند فاصله تا نقطه دسترسی را تعیین کند. نقاط دسترسی این اطلاعات را ندارند. عملیات RTT Wi-Fi برای برنامه های پیش زمینه نامحدود است اما برای برنامه های پس زمینه محدود می شود.

Wi-Fi RTT و قابلیت های Fine-Time-Measurement (FTM) مربوطه توسط استاندارد IEEE 802.11-2016 مشخص شده است. Wi-Fi RTT به اندازه‌گیری زمان دقیق ارائه شده توسط FTM نیاز دارد زیرا فاصله بین دو دستگاه را با اندازه‌گیری زمانی که یک بسته برای رفت و برگشت بین دستگاه‌ها طول می‌کشد و ضرب آن زمان در سرعت نور محاسبه می‌کند.

اندروید 15 (سطح API 35) پشتیبانی از محدوده غیر ماشه ای (NTB) IEEE 802.11az را معرفی کرد.

تفاوت های پیاده سازی بر اساس نسخه اندروید

Wi-Fi RTT در اندروید 9 (سطح API 28) معرفی شد. هنگام استفاده از این پروتکل برای تعیین موقعیت دستگاه با استفاده از چندلایه بودن با دستگاه های دارای Android 9، باید به داده های مکان های نقطه دسترسی (AP) از پیش تعیین شده در برنامه خود دسترسی داشته باشید. این شما هستید که تصمیم می گیرید چگونه این داده ها را ذخیره و بازیابی کنید.

در دستگاه‌های دارای Android 10 (سطح API 29) و بالاتر، داده‌های مکان AP را می‌توان به‌عنوان اشیاء ResponderLocation نشان داد که شامل طول، طول و عرض جغرافیایی و ارتفاع می‌شود. برای APهای Wi-Fi RTT که اطلاعات پیکربندی موقعیت مکانی/گزارش مدنی موقعیت مکانی (داده‌های LCI/LCR) را پشتیبانی می‌کنند، پروتکل یک شی ResponderLocation را در طول فرآیند محدوده برمی‌گرداند.

این ویژگی به برنامه‌ها اجازه می‌دهد به جای اینکه نیاز به ذخیره این اطلاعات از قبل داشته باشند، از APها درخواست کنند تا موقعیت خود را مستقیماً از آنها بپرسند. بنابراین، برنامه شما می‌تواند APها را پیدا کند و موقعیت آنها را تعیین کند، حتی اگر APها قبلاً شناخته شده نبودند، مانند زمانی که کاربر وارد یک ساختمان جدید می‌شود.

پشتیبانی از محدوده IEEE 802.11az NTB در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر در دسترس است. این بدان معناست که اگر دستگاه از حالت پاسخ‌دهنده IEEE 802.11az NTB (که توسط WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER نشان داده شده است) پشتیبانی می‌کند، برنامه شما می‌تواند هر دو IEEE 802.11mc و IEEE 802.11az را با درخواست‌های محدوده تکی پیدا کند. RangingResult API گسترش یافته است تا اطلاعاتی درباره حداقل و حداکثر مقداری که می‌تواند برای فاصله بین اندازه‌گیری‌های محدوده استفاده شود، ارائه می‌کند و فاصله دقیق را در کنترل برنامه شما باقی می‌گذارد.

الزامات

  • سخت افزار دستگاهی که درخواست محدوده را ارائه می دهد باید استاندارد 802.11-2016 FTM یا استاندارد 802.11az (محدوده غیر محرک) را اجرا کند.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید دارای Android 9 (سطح API 28) یا بالاتر باشد. IEEE 802.11az بدون ماشه در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر فعال است.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید خدمات مکان را فعال و اسکن Wi-Fi را روشن کند (در تنظیمات > مکان ).
  • اگر برنامه ای که درخواست محدوده را ارائه می کند Android 13 (سطح API 33) یا بالاتر را هدف قرار می دهد، باید مجوز NEARBY_WIFI_DEVICES را داشته باشد. اگر چنین برنامه‌ای نسخه قبلی Android را هدف قرار دهد، باید مجوز ACCESS_FINE_LOCATION را داشته باشد.
  • وقتی برنامه قابل مشاهده است یا در یک سرویس پیش زمینه است، برنامه باید محدوده نقاط دسترسی را جستجو کند. برنامه نمی تواند به اطلاعات مکان از پس زمینه دسترسی پیدا کند .
  • نقطه دسترسی باید استاندارد IEEE 802.11-2016 FTM یا استاندارد IEEE 802.11az (محدوده غیر محرک) را اجرا کند.

راه اندازی

برای تنظیم برنامه خود برای استفاده از Wi-Fi RTT، مراحل زیر را انجام دهید.

1. درخواست مجوز

مجوزهای زیر را در مانیفست برنامه خود درخواست کنید:

<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 و ACCESS_FINE_LOCATION مجوزهای خطرناکی هستند، بنابراین باید هر بار که کاربر می‌خواهد عملیات اسکن RTT را انجام دهد، آنها را در زمان اجرا درخواست کنید. اگر مجوز قبلاً اعطا نشده باشد، برنامه شما باید مجوز کاربر را درخواست کند. برای اطلاعات بیشتر درباره مجوزهای زمان اجرا، به درخواست مجوزهای برنامه مراجعه کنید.

2. بررسی کنید که آیا دستگاه از Wi-Fi RTT پشتیبانی می کند یا خیر

برای بررسی اینکه آیا دستگاه از Wi-Fi RTT پشتیبانی می‌کند، از PackageManager API استفاده کنید:

کاتلین

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

جاوا

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

3. بررسی کنید که آیا Wi-Fi RTT در دسترس است یا خیر

Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد، اما ممکن است در دسترس نباشد زیرا کاربر Wi-Fi را غیرفعال کرده است. بسته به قابلیت‌های سخت‌افزار و میان‌افزار، ممکن است برخی از دستگاه‌ها در صورت استفاده از SoftAP یا تترینگ از Wi-Fi RTT پشتیبانی نکنند. برای بررسی اینکه آیا Wi-Fi RTT در دسترس است یا خیر، با isAvailable() تماس بگیرید.

در دسترس بودن Wi-Fi RTT می تواند در هر زمان تغییر کند. برنامه شما باید یک BroadcastReceiver برای دریافت ACTION_WIFI_RTT_STATE_CHANGED ثبت کند که در صورت تغییر در دسترس بودن ارسال می شود. وقتی برنامه شما هدف پخش را دریافت می کند، برنامه باید وضعیت فعلی در دسترس بودن را بررسی کند و رفتار خود را بر اساس آن تنظیم کند.

به عنوان مثال:

کاتلین

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)

جاوا

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

برای اطلاعات بیشتر، به پخش‌ها مراجعه کنید.

یک درخواست دامنه دار ایجاد کنید

یک درخواست محدوده ( RangingRequest ) با تعیین لیستی از AP ​​یا همتایان Wi-Fi Aware که محدوده درخواست شده برای آنها ایجاد می شود. چندین نقطه دسترسی یا همتایان Wi-Fi Aware را می توان در یک درخواست محدوده مشخص کرد. فاصله تا همه دستگاه ها اندازه گیری و برگردانده می شود.

به عنوان مثال، یک درخواست می تواند از متد addAccessPoint() برای تعیین نقطه دسترسی برای اندازه گیری فاصله استفاده کند:

کاتلین

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

جاوا

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

یک نقطه دسترسی با شیء ScanResult آن شناسایی می‌شود که با فراخوانی WifiManager.getScanResults() قابل دریافت است. می توانید addAccessPoints(List<ScanResult>) برای اضافه کردن چندین نقطه دسترسی در یک دسته استفاده کنید.

اشیاء ScanResult می‌توانند شامل هر دو IEEE 802.11mc ( is80211mcResponder() ) و IEEE 802.11az با محدوده غیر محرک ( is80211azNtbResponder() ) APهای پشتیبانی شده باشند. دستگاه‌هایی که از محدوده IEEE 802.11az NTB پشتیبانی می‌کنند، بسته به قابلیت AP، محدوده 802.11mc یا 802.11az را انجام می‌دهند، زمانی که AP از هر دو پشتیبانی می‌کند، پیش‌فرض 802.11az می‌شود. دستگاه هایی که از IEEE 802.11az پشتیبانی نمی کنند، همه محدوده ها را با استفاده از پروتکل IEEE 802.11mc انجام می دهند.

به طور مشابه، یک درخواست محدوده می‌تواند یک همتای Wi-Fi Aware را با استفاده از آدرس MAC یا PeerHandle خود، با استفاده از روش‌های addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer) اضافه کند. برای اطلاعات بیشتر درباره پیدا کردن همتایان Wi-Fi Aware، به مستندات Wi-Fi Aware مراجعه کنید.

محدوده درخواست

یک برنامه با استفاده از متد WifiRttManager.startRanging() درخواست محدوده ای را صادر می کند و موارد زیر را ارائه می دهد: RangingRequest برای مشخص کردن عملیات، Executor برای مشخص کردن زمینه پاسخگویی، و RangingResultCallback برای دریافت نتایج.

به عنوان مثال:

کاتلین

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

جاوا

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

عملیات محدوده به صورت ناهمزمان انجام می شود و نتایج دامنه در یکی از فراخوانی های RangingResultCallback برگردانده می شود:

  • اگر کل عملیات محدوده ناموفق باشد، پاسخ به تماس onRangingFailure با کد وضعیتی که در RangingResultCallback توضیح داده شده است، راه اندازی می شود. اگر سرویس نتواند یک عملیات محدوده را در آن زمان اجرا کند، چنین شکستی ممکن است اتفاق بیفتد - برای مثال، به دلیل غیرفعال بودن Wi-Fi، به دلیل اینکه برنامه عملیات محدوده زیادی را درخواست کرده است و درنگ است، یا به دلیل یک مشکل مجوز.
  • هنگامی که عملیات محدوده به پایان رسید، پاسخ به تماس onRangingResults با فهرستی از نتایج که با فهرست درخواست‌ها مطابقت دارد راه‌اندازی می‌شود—یک نتیجه برای هر درخواست. ترتیب نتایج لزوماً با ترتیب درخواست ها مطابقت ندارد. توجه داشته باشید که عملیات محدوده ممکن است کامل شود اما هر نتیجه همچنان ممکن است نشان دهنده شکست آن اندازه گیری خاص باشد.

نتایج دامنه ای را تفسیر کنید

هر یک از نتایجی که با فراخوانی onRangingResults برگردانده می شود توسط یک شی RangingResult مشخص می شود. در مورد هر درخواست، موارد زیر را انجام دهید.

1. درخواست را شناسایی کنید

درخواست را بر اساس اطلاعات ارائه شده هنگام ایجاد RangingRequest شناسایی کنید: اغلب یک آدرس MAC ارائه شده در ScanResult که یک نقطه دسترسی را شناسایی می کند. آدرس MAC را می توان با استفاده از متد getMacAddress() از نتیجه محدوده بدست آورد.

فهرست نتایج محدوده ممکن است به ترتیب متفاوت با همتاها (نقاط دسترسی) مشخص شده در درخواست محدوده باشد، بنابراین باید از آدرس MAC برای شناسایی همتا استفاده کنید نه ترتیب نتایج.

2. تعیین کنید که آیا هر اندازه گیری موفقیت آمیز بوده است یا خیر

برای تعیین موفقیت آمیز بودن اندازه گیری، از متد getStatus() استفاده کنید. هر مقداری غیر از STATUS_SUCCESS نشان دهنده خرابی است. خطا به این معنی است که تمام فیلدهای دیگر این نتیجه (به جز شناسایی درخواست بالا) نامعتبر هستند و متد get* مربوطه با یک استثناء IllegalStateException ناموفق خواهد بود.

3. برای هر اندازه گیری موفقیت آمیز نتیجه بگیرید

برای هر اندازه گیری موفق ( RangingResult )، می توانید مقادیر نتیجه را با روش های get مربوطه بازیابی کنید:

  • فاصله، بر حسب میلی متر و انحراف استاندارد اندازه گیری:

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI بسته های مورد استفاده برای اندازه گیری:

    getRssi()

  • زمان بر حسب میلی ثانیه که در آن اندازه گیری انجام شد (نشان دهنده زمان از زمان راه اندازی):

    getRangingTimestampMillis()

  • تعداد اندازه‌گیری‌هایی که انجام شد و تعداد اندازه‌گیری‌هایی که موفقیت‌آمیز شدند (و اندازه‌گیری‌های فاصله بر آن‌ها استوار است):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • حداقل و حداکثر زمانی که یک دستگاه مشتری باید بین اندازه گیری های NTB 11az صبر کند:

    getMinTimeBetweenNtbMeasurementsMicros() و getMaxTimeBetweenNtbMeasurementsMicros() حداقل و حداکثر زمان را برمی گرداند. اگر اندازه گیری محدوده بعدی قبل از سپری شدن حداقل زمان درخواست شود، API نتیجه محدوده ذخیره شده را برمی گرداند. اگر اندازه‌گیری محدوده بعدی پس از سپری شدن حداکثر زمان درخواست شود، API جلسه محدوده غیر محرک را خاتمه می‌دهد و یک جلسه محدوده جدید با ایستگاه پاسخ‌دهنده مذاکره می‌کند. شما باید از درخواست یک جلسه محدوده جدید خودداری کنید، زیرا این کار سربار را به زمان اندازه گیری محدوده اضافه می کند. برای بهره‌مندی کامل از راندمان محدوده غیر ماشه‌ای 802.11az، درخواست محدوده بعدی را بین حداقل و حداکثر زمان اندازه‌گیری مشخص‌شده در اندازه‌گیری قبلی RangingResult فعال کنید.

  • تکرارهای Long Training Field (LTF) که ایستگاه های پاسخ دهنده و آغازگر در مقدمه نتیجه IEEE 802.11az NTB استفاده کردند:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • تعداد انتقال و دریافت جریان های زمانی مکانی (STS) که ایستگاه آغازگر برای نتیجه IEEE 802.11az NTB استفاده کرد:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

دستگاه های اندرویدی که از WiFi-RTT پشتیبانی می کنند

در جداول زیر برخی از تلفن‌ها ، نقاط دسترسی و دستگاه‌های خرده‌فروشی، انبارداری و توزیع که از WiFi-RTT پشتیبانی می‌کنند، فهرست شده‌اند. اینها به دور از جامعیت هستند. ما شما را تشویق می کنیم که با ما تماس بگیرید تا محصولات با قابلیت RTT خود را در اینجا لیست کنید.

نقاط دسترسی

سازنده و مدل تاریخ پشتیبانی
Nest Wifi Pro (Wi-Fi 6E) پشتیبانی می شود
Compulab WILD AP پشتیبانی می شود
گوگل وای فای پشتیبانی می شود
روتر Wi-Fi Google Nest پشتیبانی می شود
Google Nest Wi-Fi Point پشتیبانی می شود
آروبا AP-635 پشتیبانی می شود
سیسکو 9130 پشتیبانی می شود
سیسکو 9136 پشتیبانی می شود
سیسکو 9166 پشتیبانی می شود
سیسکو 9164 پشتیبانی می شود
آروبا AP-505 پشتیبانی می شود
آروبا AP-515 پشتیبانی می شود
آروبا AP-575 پشتیبانی می شود
آروبا AP-518 پشتیبانی می شود
آروبا AP-505H پشتیبانی می شود
آروبا AP-565 پشتیبانی می شود
آروبا AP-535 پشتیبانی می شود

تلفن ها

سازنده و مدل نسخه اندروید
پیکسل 6 9.0+
پیکسل 6 پرو 9.0+
پیکسل 5 9.0+
پیکسل 5a 9.0+
Pixel 5a 5G 9.0+
شیائومی می 10 پرو 9.0+
شیائومی می 10 9.0+
شیائومی ردمی می 9 تی پرو 9.0+
شیائومی می 9 تی 9.0+
شیائومی می 9 9.0+
شیائومی می نوت 10 9.0+
شیائومی می نوت 10 لایت 9.0+
شیائومی ردمی نوت 9 اس 9.0+
شیائومی ردمی نوت 9 پرو 9.0+
شیائومی ردمی نوت 8 تی 9.0+
شیائومی ردمی نوت 8 9.0+
شیائومی ردمی K30 پرو 9.0+
شیائومی ردمی K20 پرو 9.0+
شیائومی ردمی K20 9.0+
شیائومی ردمی نوت 5 پرو 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
ال جی وی 30 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+
سامسونگ گلکسی اس 20 9.0+
سامسونگ گلکسی نوت 10 پلاس 9.0+
سامسونگ گلکسی نوت 10 5G 9.0+
سامسونگ گلکسی نوت 10 9.0+
سامسونگ A9 پرو 9.0+
گوگل پیکسل 4 ایکس ال 9.0+
گوگل پیکسل 4 9.0+
گوگل پیکسل 4a 9.0+
گوگل پیکسل 3 ایکس ال 9.0+
گوگل پیکسل 3 9.0+
Google Pixel 3a XL 9.0+
گوگل پیکسل 3a 9.0+
Google Pixel 2 XL 9.0+
گوگل پیکسل 2 9.0+
گوگل پیکسل 1 ایکس ال 9.0+
گوگل پیکسل 1 9.0+
پوکو ایکس 2 9.0+
شارپ Aquos R3 SH-04L 9.0+

دستگاه های خرده فروشی، انبارداری و مرکز توزیع

سازنده و مدل نسخه اندروید
Zebra PS20 10.0+
زبرا TC52/TC52HC 10.0+
زبرا TC57 10.0+
زبرا TC72 10.0+
زبرا TC77 10.0+
زبرا MC93 10.0+
زبرا TC8300 10.0+
Zebra VC8300 10.0+
زبرا EC30 10.0+
زبرا ET51 10.0+
زبرا ET56 10.0+
زبرا L10 10.0+
زبرا CC600/CC6000 10.0+
Zebra MC3300x 10.0+
زبرا MC330x 10.0+
زبرا TC52x 10.0+
زبرا TC57x 10.0+
Zebra EC50 (LAN و HC) 10.0+
Zebra EC55 (WAN) 10.0+
زبرا WT6300 10.0+
Skorpio X5 10.0+
،

می توانید از عملکرد مکان Wi-Fi ارائه شده توسط Wi-Fi RTT (Round-Trip-Time) API برای اندازه گیری فاصله تا نقاط دسترسی Wi-Fi با قابلیت RTT نزدیک و دستگاه های Wi-Fi Aware همتا استفاده کنید.

اگر فاصله سه یا چند نقطه دسترسی را اندازه‌گیری کنید، می‌توانید از یک الگوریتم چندلایه‌ای برای تخمین موقعیت دستگاهی که به بهترین وجه با این اندازه‌ها منطبق است، استفاده کنید. نتیجه معمولاً در فاصله 1-2 متری دقیق است.

با این دقت، می‌توانید سرویس‌های مبتنی بر مکان دقیق، مانند ناوبری داخلی، کنترل صوتی مبهم (به عنوان مثال، «این چراغ را روشن کنید»)، و اطلاعات مبتنی بر مکان (به‌عنوان مثال، «آیا پیشنهادهای ویژه‌ای برای این محصول؟").

دستگاه درخواست کننده برای اندازه گیری فاصله با Wi-Fi RTT نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی، فقط دستگاه درخواست کننده می تواند فاصله تا نقطه دسترسی را تعیین کند. نقاط دسترسی این اطلاعات را ندارند. عملیات RTT Wi-Fi برای برنامه های پیش زمینه نامحدود است اما برای برنامه های پس زمینه محدود می شود.

Wi-Fi RTT و قابلیت های Fine-Time-Measurement (FTM) مربوطه توسط استاندارد IEEE 802.11-2016 مشخص شده است. Wi-Fi RTT به اندازه‌گیری زمان دقیق ارائه شده توسط FTM نیاز دارد زیرا فاصله بین دو دستگاه را با اندازه‌گیری زمانی که یک بسته برای رفت و برگشت بین دستگاه‌ها طول می‌کشد و ضرب آن زمان در سرعت نور محاسبه می‌کند.

اندروید 15 (سطح API 35) پشتیبانی از محدوده غیر ماشه ای (NTB) IEEE 802.11az را معرفی کرد.

تفاوت های پیاده سازی بر اساس نسخه اندروید

Wi-Fi RTT در اندروید 9 (سطح API 28) معرفی شد. هنگام استفاده از این پروتکل برای تعیین موقعیت دستگاه با استفاده از چندلایه بودن با دستگاه های دارای Android 9، باید به داده های مکان های نقطه دسترسی (AP) از پیش تعیین شده در برنامه خود دسترسی داشته باشید. این شما هستید که تصمیم می گیرید چگونه این داده ها را ذخیره و بازیابی کنید.

در دستگاه‌های دارای Android 10 (سطح API 29) و بالاتر، داده‌های مکان AP را می‌توان به‌عنوان اشیاء ResponderLocation نشان داد که شامل طول، طول و عرض جغرافیایی و ارتفاع می‌شود. برای APهای Wi-Fi RTT که اطلاعات پیکربندی موقعیت مکانی/گزارش مدنی موقعیت مکانی (داده‌های LCI/LCR) را پشتیبانی می‌کنند، پروتکل یک شی ResponderLocation را در طول فرآیند محدوده برمی‌گرداند.

این ویژگی به برنامه‌ها اجازه می‌دهد به جای اینکه نیاز به ذخیره این اطلاعات از قبل داشته باشند، از APها درخواست کنند تا موقعیت خود را مستقیماً از آنها بپرسند. بنابراین، برنامه شما می‌تواند APها را پیدا کند و موقعیت آنها را تعیین کند، حتی اگر APها قبلاً شناخته شده نبودند، مانند زمانی که کاربر وارد یک ساختمان جدید می‌شود.

پشتیبانی از محدوده IEEE 802.11az NTB در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر در دسترس است. این بدان معناست که اگر دستگاه از حالت پاسخ‌دهنده IEEE 802.11az NTB (که توسط WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER نشان داده شده است) پشتیبانی می‌کند، برنامه شما می‌تواند هر دو IEEE 802.11mc و IEEE 802.11az را با درخواست‌های محدوده تکی پیدا کند. RangingResult API گسترش یافته است تا اطلاعاتی درباره حداقل و حداکثر مقداری که می‌تواند برای فاصله بین اندازه‌گیری‌های محدوده استفاده شود، ارائه می‌کند و فاصله دقیق را در کنترل برنامه شما باقی می‌گذارد.

الزامات

  • سخت افزار دستگاهی که درخواست محدوده را ارائه می دهد باید استاندارد 802.11-2016 FTM یا استاندارد 802.11az (محدوده غیر محرک) را اجرا کند.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید دارای Android 9 (سطح API 28) یا بالاتر باشد. IEEE 802.11az بدون ماشه در دستگاه‌های دارای Android 15 (سطح API 35) و بالاتر فعال است.
  • دستگاهی که درخواست محدوده را ارائه می‌کند باید خدمات مکان را فعال و اسکن Wi-Fi را روشن کند (در تنظیمات > مکان ).
  • اگر برنامه ای که درخواست محدوده را ارائه می کند Android 13 (سطح API 33) یا بالاتر را هدف قرار می دهد، باید مجوز NEARBY_WIFI_DEVICES را داشته باشد. اگر چنین برنامه‌ای نسخه قبلی Android را هدف قرار دهد، باید مجوز ACCESS_FINE_LOCATION را داشته باشد.
  • وقتی برنامه قابل مشاهده است یا در یک سرویس پیش زمینه است، برنامه باید محدوده نقاط دسترسی را جستجو کند. برنامه نمی تواند به اطلاعات مکان از پس زمینه دسترسی پیدا کند .
  • نقطه دسترسی باید استاندارد IEEE 802.11-2016 FTM یا استاندارد IEEE 802.11az (محدوده غیر محرک) را اجرا کند.

راه اندازی

برای تنظیم برنامه خود برای استفاده از Wi-Fi RTT، مراحل زیر را انجام دهید.

1. درخواست مجوز

مجوزهای زیر را در مانیفست برنامه خود درخواست کنید:

<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 و ACCESS_FINE_LOCATION مجوزهای خطرناکی هستند، بنابراین باید هر بار که کاربر می‌خواهد عملیات اسکن RTT را انجام دهد، آنها را در زمان اجرا درخواست کنید. اگر مجوز قبلاً اعطا نشده باشد، برنامه شما باید مجوز کاربر را درخواست کند. برای اطلاعات بیشتر درباره مجوزهای زمان اجرا، به درخواست مجوزهای برنامه مراجعه کنید.

2. بررسی کنید که آیا دستگاه از Wi-Fi RTT پشتیبانی می کند یا خیر

برای بررسی اینکه آیا دستگاه از Wi-Fi RTT پشتیبانی می‌کند، از PackageManager API استفاده کنید:

کاتلین

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

جاوا

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

3. بررسی کنید که آیا Wi-Fi RTT در دسترس است یا خیر

Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد، اما ممکن است در دسترس نباشد زیرا کاربر Wi-Fi را غیرفعال کرده است. بسته به قابلیت‌های سخت‌افزار و میان‌افزار، ممکن است برخی از دستگاه‌ها در صورت استفاده از SoftAP یا تترینگ از Wi-Fi RTT پشتیبانی نکنند. برای بررسی اینکه آیا Wi-Fi RTT در دسترس است یا خیر، با isAvailable() تماس بگیرید.

در دسترس بودن Wi-Fi RTT می تواند در هر زمان تغییر کند. برنامه شما باید یک BroadcastReceiver برای دریافت ACTION_WIFI_RTT_STATE_CHANGED ثبت کند که در صورت تغییر در دسترس بودن ارسال می شود. وقتی برنامه شما هدف پخش را دریافت می کند، برنامه باید وضعیت فعلی در دسترس بودن را بررسی کند و رفتار خود را بر اساس آن تنظیم کند.

به عنوان مثال:

کاتلین

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)

جاوا

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

برای اطلاعات بیشتر، به پخش‌ها مراجعه کنید.

یک درخواست دامنه دار ایجاد کنید

یک درخواست محدوده ( RangingRequest ) با تعیین لیستی از AP ​​یا همتایان Wi-Fi Aware که محدوده درخواست شده برای آنها ایجاد می شود. چندین نقطه دسترسی یا همتایان Wi-Fi Aware را می توان در یک درخواست محدوده مشخص کرد. فاصله تا همه دستگاه ها اندازه گیری و برگردانده می شود.

به عنوان مثال، یک درخواست می تواند از متد addAccessPoint() برای تعیین نقطه دسترسی برای اندازه گیری فاصله استفاده کند:

کاتلین

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

جاوا

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

یک نقطه دسترسی با شیء ScanResult آن شناسایی می‌شود که با فراخوانی WifiManager.getScanResults() قابل دریافت است. می توانید addAccessPoints(List<ScanResult>) برای اضافه کردن چندین نقطه دسترسی در یک دسته استفاده کنید.

اشیاء ScanResult می‌توانند شامل هر دو IEEE 802.11mc ( is80211mcResponder() ) و IEEE 802.11az با محدوده غیر محرک ( is80211azNtbResponder() ) APهای پشتیبانی شده باشند. دستگاه هایی که از IEEE 802.11az NTB پشتیبانی می کنند ، یا 802.11mc یا 802.11az را بسته به توانایی AP انجام می دهند ، وقتی AP از هر دو پشتیبانی می کند ، به 802.11az پیش فرض می شود. دستگاه هایی که از IEEE 802.11az پشتیبانی نمی کنند ، با استفاده از پروتکل IEEE 802.11mc ، همه را انجام می دهند.

به طور مشابه ، یک درخواست مختلف می تواند با استفاده از addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer) ، یک همسالان Wi-Fi را با استفاده از آدرس MAC یا PeerHandle آن اضافه کند. برای کسب اطلاعات بیشتر در مورد کشف همسالان آگاه Wi-Fi ، به اسناد آگاه Wi-Fi مراجعه کنید.

درخواست

یک برنامه با استفاده از روش WifiRttManager.startRanging() و ارائه موارد زیر ، درخواست اعم از درخواست را صادر می کند و موارد زیر RangingRequest می دهد: برای مشخص کردن این عملیات ، یک Executor برای مشخص کردن زمینه پاسخ به تماس ، و یک RangingResultCallback برای دریافت نتایج.

به عنوان مثال:

کاتلین

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

جاوا

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

عملیات مختلف به صورت ناهمزمان انجام می شود ، و نتایج مختلف در یکی از تماس های RangingResultCallback بازگردانده می شود:

  • در صورت عدم موفقیت کل عملیات ، پاسخ به تماس با onRangingFailure با کد وضعیتی که در RangingResultCallback شرح داده شده است ، ایجاد می شود. چنین عدم موفقیت ممکن است در صورتی اتفاق بیفتد که سرویس نتواند یک عملیات مختلف را در آن زمان انجام دهد-به عنوان مثال ، زیرا Wi-Fi غیرفعال است ، زیرا این برنامه درخواست های زیادی را انجام داده است و به دلیل مشکل اجازه می شود.
  • هنگامی که عملیات مختلف به پایان رسید ، پاسخ به تماس onRangingResults با لیستی از نتایج که مطابق با لیست درخواست ها است - نتیجه ای برای هر درخواست ایجاد می شود. ترتیب نتایج لزوماً با ترتیب درخواست ها مطابقت ندارد. توجه داشته باشید که عملکرد مختلف ممکن است کامل شود اما هر نتیجه ممکن است نشان دهنده عدم موفقیت آن اندازه گیری خاص باشد.

نتایج را تفسیر کنید

هر یک از نتایج برگشتی توسط پاسخ به تماس onRangingResults توسط یک شیء RangingResult مشخص شده است. در هر درخواست ، موارد زیر را انجام دهید.

1. درخواست را شناسایی کنید

درخواست را بر اساس اطلاعات ارائه شده در هنگام ایجاد RangingRequest مشخص کنید: بیشتر اوقات یک آدرس MAC ارائه شده در ScanResult که یک نقطه دسترسی را مشخص می کند. آدرس MAC را می توان با استفاده از روش getMacAddress() از نتیجه مختلف بدست آورد.

لیست نتایج مختلف ممکن است به ترتیب متفاوتی نسبت به همسالان (نقاط دسترسی) مشخص شده در درخواست مختلف باشد ، بنابراین شما باید از آدرس MAC برای شناسایی همسالان استفاده کنید ، نه ترتیب نتایج.

2. تعیین کنید که آیا هر اندازه گیری موفقیت آمیز بوده است

برای تعیین اینکه آیا اندازه گیری موفقیت آمیز بوده است ، از روش getStatus() استفاده کنید. هر مقدار غیر از STATUS_SUCCESS نشانگر عدم موفقیت است. یک شکست به این معنی است که تمام زمینه های دیگر این نتیجه (به جز شناسایی درخواست فوق) نامعتبر هستند و روش get* مربوطه با یک استثناء IllegalStateException است.

3. برای هر اندازه گیری موفق نتیجه بگیرید

برای هر اندازه گیری موفق ( RangingResult ) ، می توانید مقادیر نتیجه را با روش های get مربوطه بازیابی کنید:

  • فاصله ، در میلی متر و انحراف استاندارد از اندازه گیری:

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI بسته های مورد استفاده برای اندازه گیری ها:

    getRssi()

  • زمان در میلی ثانیه هایی که در آن اندازه گیری گرفته شده است (نشانگر زمان از زمان بوت) است:

    getRangingTimestampMillis()

  • تعداد اندازه گیری هایی که تلاش شده و تعداد اندازه گیری هایی که موفق شده اند (و بر اساس آنها اندازه گیری فاصله است):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • حداقل و حداکثر زمان یک دستگاه مشتری باید بین اندازه گیری 11AZ NTB صبر کند:

    getMinTimeBetweenNtbMeasurementsMicros() و getMaxTimeBetweenNtbMeasurementsMicros() حداقل و حداکثر زمان را برمی گردانند. اگر اندازه گیری بعدی بعدی قبل از گذشت حداقل زمان درخواست شود ، آنگاه API نتیجه ذخیره شده را باز می گرداند. اگر اندازه گیری بعدی بعدی پس از گذشت حداکثر زمان درخواست شود ، API جلسه غیر متری را خاتمه می دهد و یک جلسه جدید را با ایستگاه پاسخ دهنده مذاکره می کند. شما باید از یک جلسه جدید درخواست شده خودداری کنید ، زیرا این کار به زمان اندازه گیری می افزاید. برای استفاده کامل از 802.11az بدون بازده مبتنی بر کارآیی ، درخواست بعدی را بین حداقل و حداکثر زمان اندازه گیری مشخص شده در اندازه گیری قبلی RangingResult ایجاد کنید.

  • تکرارهایی که در زمینه آموزش طولانی (LTF) وجود دارد که ایستگاه های پاسخ دهنده و آغازگر مورد استفاده در مقدمه برای IEEE 802.11az نتیجه NTB:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • تعداد انتقال و دریافت جریان زمان مکانی (ST) که ایستگاه آغازگر برای نتیجه IEEE 802.11az NTB استفاده می شود:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

دستگاه های Android که از WiFi-RTT پشتیبانی می کنند

در جدول های زیر برخی از تلفن ها ، نقاط دسترسی و دستگاه های مرکز خرده فروشی ، انبارداری و توزیع که از WiFi-RTT پشتیبانی می کنند ، ذکر شده است. اینها به دور از جامع هستند. ما شما را تشویق می کنیم تا به ما دسترسی پیدا کنید تا محصولات RTT خود را در اینجا لیست کنید.

نقاط دسترسی

سازنده و مدل تاریخ حمایت
Nest Wifi Pro (Wi-Fi 6E) پشتیبانی می شود
Compulab Wild AP پشتیبانی می شود
Wi-Fi Google پشتیبانی می شود
روتر Wi-Fi Google Nest پشتیبانی می شود
Google Nest Wi-Fi Point پشتیبانی می شود
ARUBA AP-635 پشتیبانی می شود
سیسکو 9130 پشتیبانی می شود
سیسکو 9136 پشتیبانی می شود
سیسکو 9166 پشتیبانی می شود
سیسکو 9164 پشتیبانی می شود
ARUBA AP-505 پشتیبانی می شود
ARUBA AP-515 پشتیبانی می شود
ARUBA AP-575 پشتیبانی می شود
ARUBA AP-518 پشتیبانی می شود
ARUBA AP-505H پشتیبانی می شود
ARUBA AP-565 پشتیبانی می شود
ARUBA AP-535 پشتیبانی می شود

تلفن ها

سازنده و مدل نسخه اندروید
پیکسل 6 9.0+
پیکسل 6 پرو 9.0+
پیکسل 5 9.0+
پیکسل 5a 9.0+
Pixel 5a 5G 9.0+
شیائومی می 10 پرو 9.0+
شیائومی می 10 9.0+
Xiaomi redmi mi 9t pro 9.0+
Xiaomi Mi 9t 9.0+
شیائومی می 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 lite 9.0+
شیائومی ردمی نوت 9 اس 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
شیائومی ردمی نوت 8 تی 9.0+
شیائومی ردمی نوت 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
شیائومی ردمی K20 پرو 9.0+
شیائومی Redmi K20 9.0+
شیائومی ردمی نوت 5 پرو 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50s ThinQ 9.0+
LG V60 ThinQ 9.0+
ال جی وی 30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
سامسونگ گلکسی S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
سامسونگ گلکسی S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
سامسونگ گلکسی اس 20 9.0+
سامسونگ گلکسی نوت 10 پلاس 9.0+
سامسونگ گلکسی نوت 10 5G 9.0+
سامسونگ گلکسی نوت 10 9.0+
سامسونگ A9 Pro 9.0+
گوگل پیکسل 4 ایکس ال 9.0+
گوگل پیکسل 4 9.0+
گوگل پیکسل 4a 9.0+
Google Pixel 3 XL 9.0+
گوگل پیکسل 3 9.0+
Google Pixel 3a XL 9.0+
گوگل پیکسل 3a 9.0+
Google Pixel 2 XL 9.0+
گوگل پیکسل 2 9.0+
Google Pixel 1 XL 9.0+
گوگل پیکسل 1 9.0+
پوکو ایکس 2 9.0+
Aquos Sharp R3 SH-04L 9.0+

دستگاه های مرکز خرده فروشی ، انبارداری و توزیع

سازنده و مدل نسخه اندروید
گورخر PS20 10.0+
Zebra TC52/TC52HC 10.0+
Zebra TC57 10.0+
گورخر TC72 10.0+
Zebra TC77 10.0+
Zebra MC93 10.0+
Zebra TC8300 10.0+
Zebra VC8300 10.0+
گورخر EC30 10.0+
گورخر ET51 10.0+
گورخر ET56 10.0+
گورخر L10 10.0+
Zebra CC600/CC6000 10.0+
Zebra MC3300x 10.0+
Zebra MC330x 10.0+
Zebra TC52x 10.0+
Zebra TC57x 10.0+
Zebra EC50 (LAN و HC) 10.0+
Zebra EC55 (WAN) 10.0+
Zebra WT6300 10.0+
Skorpio X5 10.0+
،

شما می توانید از قابلیت های موقعیت مکانی Wi-Fi ارائه شده توسط API Wi-Fi RTT (Trip-Time) برای اندازه گیری فاصله تا نقاط دسترسی Wi-Fi در نزدیکی RTT و دستگاه های آگاه Wi-Fi همکار استفاده کنید.

اگر فاصله را تا سه یا چند نقطه دسترسی اندازه گیری کنید ، می توانید از یک الگوریتم چند جانبه برای تخمین موقعیت دستگاه که به بهترین وجه متناسب با آن اندازه گیری ها است ، استفاده کنید. نتیجه به طور معمول در 1-2 متر دقیق است.

با این صحت ، می توانید خدمات مبتنی بر موقعیت مکانی ریز و درشت ، مانند ناوبری داخلی ، کنترل صوتی تفکیک شده (به عنوان مثال ، "این نور را روشن کنید") و اطلاعات مبتنی بر موقعیت مکانی (به عنوان مثال ، "پیشنهادات ویژه ای برای آن وجود دارد. این محصول؟ ").

دستگاه درخواست کننده برای اندازه گیری فاصله با Wi-Fi RTT نیازی به اتصال به نقاط دسترسی ندارد. برای حفظ حریم خصوصی ، فقط دستگاه درخواست کننده قادر به تعیین فاصله تا نقطه دسترسی است. نقاط دسترسی این اطلاعات را ندارند. عملیات Wi-Fi RTT برای برنامه های پیش زمینه نامحدود است اما برای برنامه های پس زمینه مورد استفاده قرار می گیرد.

قابلیت Wi-Fi RTT و قابلیت اندازه گیری زمان خوب (FTM) توسط استاندارد IEEE 802.11-2016 مشخص شده است. Wi-Fi RTT نیاز به اندازه گیری زمان دقیق ارائه شده توسط FTM دارد زیرا با اندازه گیری زمان یک بسته ، فاصله بین دو دستگاه را محاسبه می کند تا یک سفر دور بین دستگاه ها انجام شود و آن زمان را با سرعت نور ضرب کند.

Android 15 (API سطح 35) پشتیبانی از IEEE 802.11az مبتنی بر پایه (NTB) را معرفی کرد.

تفاوت های اجرای بر اساس نسخه Android

Wi-Fi RTT در اندروید 9 (سطح API 28) معرفی شد. هنگام استفاده از این پروتکل برای تعیین موقعیت دستگاه با استفاده از چند ماده با دستگاه هایی که Android 9 را اجرا می کنند ، باید به داده های مکان دسترسی از پیش تعیین شده (AP) در برنامه خود دسترسی داشته باشید. این وظیفه شماست که تصمیم بگیرید که چگونه این داده ها را ذخیره و بازیابی کنید.

در دستگاه هایی که Android 10 (API سطح 29) و بالاتر دارند ، داده های موقعیت مکانی AP می توانند به عنوان اشیاء ResponderLocation ارائه شوند ، که شامل عرض جغرافیایی ، طول جغرافیایی و ارتفاع است. برای AP های Wi-Fi RTT که از اطلاعات پیکربندی موقعیت مکانی/گزارش مدنی (داده های LCI/LCR) پشتیبانی می کنند ، پروتکل یک شیء ResponderLocation را در طی فرآیند مختلف باز می گرداند.

این ویژگی به برنامه ها اجازه می دهد تا از AP ​​ها پرس و جو کنند و از آنها بخواهند که موقعیت خود را مستقیماً از آنها بخواهند و نه اینکه نیاز به ذخیره این اطلاعات را قبل از زمان داشته باشند. بنابراین ، برنامه شما می تواند AP ها را پیدا کند و موقعیت های آنها را تعیین کند حتی اگر APS قبلاً مشخص نبود ، مانند زمانی که کاربر وارد یک ساختمان جدید می شود.

پشتیبانی IEEE 802.11az NTB در دستگاه های دارای Android 15 (سطح API 35) و بالاتر در دسترس است. این بدان معناست که اگر دستگاه از حالت پاسخ دهنده IEEE 802.11az NTB پشتیبانی کند (نشان داده شده توسط WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_STA_RESPONDER ) ، برنامه شما می تواند هر دو IEEE 802.11mc و IEEE 802.11az را با یک درخواست واحد پیدا کند. API RangingResult برای ارائه اطلاعات در مورد حداقل و حداکثر مقدار که می تواند برای فاصله بین اندازه گیری های مختلف استفاده شود ، ارائه شده و فاصله دقیق را در کنترل برنامه شما باقی می گذارد.

الزامات

  • سخت افزار دستگاهی که درخواست اعم از درخواست می کند باید استاندارد 802.11-2016 FTM یا استاندارد 802.11az (اعطای غیر متراکم) را پیاده سازی کند.
  • دستگاهی که درخواست اعم از درخواست می کند باید Android 9 (API سطح 28) یا بعد از آن را اجرا کند. IEEE 802.11az مبتنی بر پایه های مبتنی بر دستگاه های دارای Android 15 (API سطح 35) و بالاتر فعال است.
  • دستگاهی که درخواست اعم از درخواست می کند باید خدمات موقعیت مکانی را فعال کند و اسکن Wi-Fi روشن شود (در زیر تنظیمات> مکان ).
  • اگر برنامه ای که درخواست درخواست را ایجاد می کند ، Android 13 (سطح API 33) یا بالاتر را هدف قرار دهد ، باید مجوز NEARBY_WIFI_DEVICES را داشته باشد. اگر چنین برنامه نسخه قبلی Android را هدف قرار دهد ، باید به جای آن مجوز ACCESS_FINE_LOCATION را داشته باشد.
  • برنامه باید در حالی که برنامه قابل مشاهده است یا در یک سرویس پیش زمینه ، از محدوده نقاط دسترسی پرس و جو کند. برنامه نمی تواند از پس زمینه به اطلاعات مکان دسترسی پیدا کند .
  • نقطه دسترسی باید استاندارد IEEE 802.11-2016 FTM یا استاندارد IEEE 802.11az را اجرا کند (اعطای غیر متراکم).

راه اندازی

برای تنظیم برنامه خود برای استفاده از Wi-Fi RTT ، مراحل زیر را انجام دهید.

1. درخواست مجوزها

مجوزهای زیر را در مانیفست برنامه خود درخواست کنید:

<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 و ACCESS_FINE_LOCATION مجوزهای خطرناکی هستند ، بنابراین شما باید هر بار که کاربر بخواهد یک عمل اسکن RTT را انجام دهد ، آنها را در زمان اجرا درخواست کنید. در صورت عدم اعطای مجوز ، برنامه شما نیاز به درخواست کاربر دارد. برای اطلاعات بیشتر در مورد مجوزهای زمان اجرا ، به مجوزهای برنامه درخواست مراجعه کنید.

2. بررسی کنید که آیا دستگاه از Wi-Fi RTT پشتیبانی می کند

برای بررسی اینکه آیا دستگاه از Wi-Fi RTT پشتیبانی می کند ، از API PackageManager استفاده کنید:

کاتلین

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

جاوا

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

3. بررسی کنید که آیا Wi-Fi RTT در دسترس است

Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد ، اما ممکن است در دسترس نباشد زیرا کاربر Wi-Fi را غیرفعال کرده است. بسته به قابلیت سخت افزار و سیستم عامل آنها ، برخی از دستگاه ها ممکن است در صورت استفاده از نرم افزار یا اتصال ، از Wi-Fi RTT پشتیبانی نکنند. برای بررسی اینکه آیا Wi-Fi RTT در دسترس است ، isAvailable() تماس بگیرید.

در دسترس بودن Wi-Fi RTT می تواند در هر زمان تغییر کند. برنامه شما باید برای دریافت ACTION_WIFI_RTT_STATE_CHANGED ، یک BroadcastReceiver را ثبت کند ، که هنگام تغییر در دسترس بودن ارسال می شود. هنگامی که برنامه شما قصد پخش را دریافت می کند ، برنامه باید وضعیت فعلی در دسترس بودن را بررسی کرده و رفتار خود را بر این اساس تنظیم کند.

به عنوان مثال:

کاتلین

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)

جاوا

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

برای اطلاعات بیشتر ، به پخش ها مراجعه کنید.

یک درخواست مختلف ایجاد کنید

یک درخواست مختلف ( RangingRequest ) با مشخص کردن لیستی از APS یا همسالان آگاه Wi-Fi که طیف وسیعی از آنها درخواست می شود ایجاد می شود. نقاط دسترسی چندگانه یا همسالان آگاه Wi-Fi را می توان در یک درخواست واحد مشخص کرد. مسافت برای همه دستگاه ها اندازه گیری و بازگردانده می شود.

به عنوان مثال ، یک درخواست می تواند از روش addAccessPoint() برای مشخص کردن نقطه دسترسی برای اندازه گیری فاصله استفاده کند:

کاتلین

val req: RangingRequest = RangingRequest.Builder().run {
    addAccessPoint(ap1ScanResult)
    addAccessPoint(ap2ScanResult)
    build()
}

جاوا

RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(ap1ScanResult);
builder.addAccessPoint(ap2ScanResult);

RangingRequest req = builder.build();

یک نقطه دسترسی توسط شیء ScanResult آن مشخص می شود ، که با فراخوانی WifiManager.getScanResults() قابل دستیابی است. برای اضافه کردن چندین نقطه دسترسی در یک دسته می توانید از addAccessPoints(List<ScanResult>) استفاده کنید.

اشیاء ScanResult می توانند حاوی IEEE 802.11mc ( is80211mcResponder() ) و IEEE 802.11az مبتنی بر پایه ( is80211azNtbResponder() ) باشند. دستگاه هایی که از IEEE 802.11az NTB پشتیبانی می کنند ، یا 802.11mc یا 802.11az را بسته به توانایی AP انجام می دهند ، وقتی AP از هر دو پشتیبانی می کند ، به 802.11az پیش فرض می شود. دستگاه هایی که از IEEE 802.11az پشتیبانی نمی کنند ، با استفاده از پروتکل IEEE 802.11mc ، همه را انجام می دهند.

به طور مشابه ، یک درخواست مختلف می تواند با استفاده از addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer) ، یک همسالان Wi-Fi را با استفاده از آدرس MAC یا PeerHandle آن اضافه کند. برای کسب اطلاعات بیشتر در مورد کشف همسالان آگاه Wi-Fi ، به اسناد آگاه Wi-Fi مراجعه کنید.

درخواست

یک برنامه با استفاده از روش WifiRttManager.startRanging() و ارائه موارد زیر ، درخواست اعم از درخواست را صادر می کند و موارد زیر RangingRequest می دهد: برای مشخص کردن این عملیات ، یک Executor برای مشخص کردن زمینه پاسخ به تماس ، و یک RangingResultCallback برای دریافت نتایج.

به عنوان مثال:

کاتلین

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

جاوا

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

عملیات مختلف به صورت ناهمزمان انجام می شود ، و نتایج مختلف در یکی از تماس های RangingResultCallback بازگردانده می شود:

  • در صورت عدم موفقیت کل عملیات ، پاسخ به تماس با onRangingFailure با کد وضعیتی که در RangingResultCallback شرح داده شده است ، ایجاد می شود. چنین عدم موفقیت ممکن است در صورتی اتفاق بیفتد که سرویس نتواند یک عملیات مختلف را در آن زمان انجام دهد-به عنوان مثال ، زیرا Wi-Fi غیرفعال است ، زیرا این برنامه درخواست های زیادی را انجام داده است و به دلیل مشکل اجازه می شود.
  • هنگامی که عملیات مختلف به پایان رسید ، پاسخ به تماس onRangingResults با لیستی از نتایج که مطابق با لیست درخواست ها است - نتیجه ای برای هر درخواست ایجاد می شود. ترتیب نتایج لزوماً با ترتیب درخواست ها مطابقت ندارد. توجه داشته باشید که عملکرد مختلف ممکن است کامل شود اما هر نتیجه ممکن است نشان دهنده عدم موفقیت آن اندازه گیری خاص باشد.

نتایج را تفسیر کنید

هر یک از نتایج برگشتی توسط پاسخ به تماس onRangingResults توسط یک شیء RangingResult مشخص شده است. در هر درخواست ، موارد زیر را انجام دهید.

1. درخواست را شناسایی کنید

درخواست را بر اساس اطلاعات ارائه شده در هنگام ایجاد RangingRequest مشخص کنید: بیشتر اوقات یک آدرس MAC ارائه شده در ScanResult که یک نقطه دسترسی را مشخص می کند. آدرس MAC را می توان با استفاده از روش getMacAddress() از نتیجه مختلف بدست آورد.

لیست نتایج مختلف ممکن است به ترتیب متفاوتی نسبت به همسالان (نقاط دسترسی) مشخص شده در درخواست مختلف باشد ، بنابراین شما باید از آدرس MAC برای شناسایی همسالان استفاده کنید ، نه ترتیب نتایج.

2. تعیین کنید که آیا هر اندازه گیری موفقیت آمیز بوده است

برای تعیین اینکه آیا اندازه گیری موفقیت آمیز بوده است ، از روش getStatus() استفاده کنید. هر مقدار غیر از STATUS_SUCCESS نشانگر عدم موفقیت است. یک شکست به این معنی است که تمام زمینه های دیگر این نتیجه (به جز شناسایی درخواست فوق) نامعتبر هستند و روش get* مربوطه با یک استثناء IllegalStateException است.

3. برای هر اندازه گیری موفق نتیجه بگیرید

برای هر اندازه گیری موفق ( RangingResult ) ، می توانید مقادیر نتیجه را با روش های get مربوطه بازیابی کنید:

  • فاصله ، در میلی متر و انحراف استاندارد از اندازه گیری:

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI بسته های مورد استفاده برای اندازه گیری ها:

    getRssi()

  • زمان در میلی ثانیه هایی که در آن اندازه گیری گرفته شده است (نشانگر زمان از زمان بوت) است:

    getRangingTimestampMillis()

  • تعداد اندازه گیری هایی که تلاش شده و تعداد اندازه گیری هایی که موفق شده اند (و بر اساس آنها اندازه گیری فاصله است):

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

  • حداقل و حداکثر زمان یک دستگاه مشتری باید بین اندازه گیری 11AZ NTB صبر کند:

    getMinTimeBetweenNtbMeasurementsMicros() و getMaxTimeBetweenNtbMeasurementsMicros() حداقل و حداکثر زمان را برمی گردانند. اگر اندازه گیری بعدی بعدی قبل از گذشت حداقل زمان درخواست شود ، آنگاه API نتیجه ذخیره شده را باز می گرداند. اگر اندازه گیری بعدی بعدی پس از گذشت حداکثر زمان درخواست شود ، API جلسه غیر متری را خاتمه می دهد و یک جلسه جدید را با ایستگاه پاسخ دهنده مذاکره می کند. شما باید از یک جلسه جدید درخواست شده خودداری کنید ، زیرا این کار به زمان اندازه گیری می افزاید. برای استفاده کامل از 802.11az بدون بازده مبتنی بر کارآیی ، درخواست بعدی را بین حداقل و حداکثر زمان اندازه گیری مشخص شده در اندازه گیری قبلی RangingResult ایجاد کنید.

  • تکرارهایی که در زمینه آموزش طولانی (LTF) وجود دارد که ایستگاه های پاسخ دهنده و آغازگر مورد استفاده در مقدمه برای IEEE 802.11az نتیجه NTB:

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

  • تعداد انتقال و دریافت جریان زمان مکانی (ST) که ایستگاه آغازگر برای نتیجه IEEE 802.11az NTB استفاده می شود:

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

دستگاه های Android که از WiFi-RTT پشتیبانی می کنند

در جدول های زیر برخی از تلفن ها ، نقاط دسترسی و دستگاه های مرکز خرده فروشی ، انبارداری و توزیع که از WiFi-RTT پشتیبانی می کنند ، ذکر شده است. اینها به دور از جامع هستند. ما شما را تشویق می کنیم تا به ما دسترسی پیدا کنید تا محصولات RTT خود را در اینجا لیست کنید.

نقاط دسترسی

سازنده و مدل تاریخ حمایت
Nest Wifi Pro (Wi-Fi 6E) پشتیبانی می شود
Compulab Wild AP پشتیبانی می شود
Wi-Fi Google پشتیبانی می شود
روتر Wi-Fi Google Nest پشتیبانی می شود
Google Nest Wi-Fi Point پشتیبانی می شود
ARUBA AP-635 پشتیبانی می شود
سیسکو 9130 پشتیبانی می شود
سیسکو 9136 پشتیبانی می شود
سیسکو 9166 پشتیبانی می شود
سیسکو 9164 پشتیبانی می شود
ARUBA AP-505 پشتیبانی می شود
ARUBA AP-515 پشتیبانی می شود
ARUBA AP-575 پشتیبانی می شود
ARUBA AP-518 پشتیبانی می شود
ARUBA AP-505H پشتیبانی می شود
ARUBA AP-565 پشتیبانی می شود
ARUBA AP-535 پشتیبانی می شود

تلفن ها

سازنده و مدل نسخه اندروید
پیکسل 6 9.0+
پیکسل 6 پرو 9.0+
پیکسل 5 9.0+
پیکسل 5a 9.0+
Pixel 5a 5G 9.0+
شیائومی می 10 پرو 9.0+
شیائومی می 10 9.0+
Xiaomi redmi mi 9t pro 9.0+
Xiaomi Mi 9t 9.0+
شیائومی می 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 lite 9.0+
شیائومی ردمی نوت 9 اس 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
شیائومی ردمی نوت 8 تی 9.0+
شیائومی ردمی نوت 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
شیائومی ردمی K20 پرو 9.0+
شیائومی Redmi K20 9.0+
شیائومی ردمی نوت 5 پرو 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50s ThinQ 9.0+
LG V60 ThinQ 9.0+
ال جی وی 30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
سامسونگ گلکسی S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
سامسونگ گلکسی S20 5G 9.0+
Samsung Galaxy S20 Ultra 5G 9.0+
سامسونگ گلکسی اس 20 9.0+
سامسونگ گلکسی نوت 10 پلاس 9.0+
سامسونگ گلکسی نوت 10 5G 9.0+
سامسونگ گلکسی نوت 10 9.0+
سامسونگ A9 Pro 9.0+
گوگل پیکسل 4 ایکس ال 9.0+
گوگل پیکسل 4 9.0+
گوگل پیکسل 4a 9.0+
Google Pixel 3 XL 9.0+
گوگل پیکسل 3 9.0+
Google Pixel 3a XL 9.0+
گوگل پیکسل 3a 9.0+
Google Pixel 2 XL 9.0+
گوگل پیکسل 2 9.0+
Google Pixel 1 XL 9.0+
گوگل پیکسل 1 9.0+
پوکو ایکس 2 9.0+
Aquos Sharp R3 SH-04L 9.0+

دستگاه های مرکز خرده فروشی ، انبارداری و توزیع

سازنده و مدل نسخه اندروید
گورخر PS20 10.0+
Zebra TC52/TC52HC 10.0+
Zebra TC57 10.0+
گورخر TC72 10.0+
Zebra TC77 10.0+
Zebra MC93 10.0+
Zebra TC8300 10.0+
Zebra VC8300 10.0+
گورخر EC30 10.0+
گورخر ET51 10.0+
گورخر ET56 10.0+
گورخر L10 10.0+
Zebra CC600/CC6000 10.0+
Zebra MC3300x 10.0+
Zebra MC330x 10.0+
Zebra TC52x 10.0+
Zebra TC57x 10.0+
Zebra EC50 (LAN و HC) 10.0+
Zebra EC55 (WAN) 10.0+
Zebra WT6300 10.0+
Skorpio X5 10.0+