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

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

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

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

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

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

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

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

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

در دستگاه‌های دارای Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) و بالاتر، داده‌های مکان نقطه دسترسی را می‌توان به‌صورت اشیاء ResponderLocation نمایش داد که شامل عرض جغرافیایی، طول جغرافیایی، و ارتفاع است. برای نقاط دسترسی Wi-Fi RTT که از «اطلاعات پیکربندی مکان»/«گزارش مدنی مکان» (داده‌های LCI/LCR) پشتیبانی می‌کنند، پروتکل درطول فرایند تعیین محدوده، شیء ResponderLocation را برمی‌گرداند.

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

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

الزامات

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

راه‌اندازی

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

۱. درخواست اجازه

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

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

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

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

کاتلین

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

جاوا

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

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

Wi-Fi RTT ممکن است در دستگاه وجود داشته باشد، اما ممکن است دردسترس نباشد زیرا کاربر Wi-Fi را غیرفعال کرده است. بسته به قابلیت‌های سخت‌افزار و سفت‌افزار، برخی‌از دستگاه‌ها ممکن است درصورت استفاده از SoftAP یا اینترنت‌بخشی، از Wi-Fi RTT پشتیبانی نکنند. برای بررسی اینکه آیا «زمان رفت‌وبرگشت Wi-Fi» دردسترس است یا نه، 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()) را که از نقاط دسترسی پشتیبانی می‌کند داشته باشند. دستگاه‌هایی که از فاصله‌یابی IEEE 802.11az NTB پشتیبانی می‌کنند، بسته به قابلیت نقطه دسترسی، فاصله‌یابی 802.11mc یا 802.11az را انجام می‌دهند و اگر نقطه دسترسی از هر دو پشتیبانی کند، به‌طور پیش‌فرض از 802.11az استفاده می‌کنند. دستگاه‌هایی که از IEEE 802.11az پشتیبانی نمی‌کنند، همه فاصله‌یابی‌ها را بااستفاده از پروتکل IEEE 802.11mc انجام می‌دهند.

به‌طور مشابه، درخواست فاصله‌یابی می‌تواند بااستفاده از مک آدرس یا PeerHandle، به‌ترتیب بااستفاده از روش‌های addWifiAwarePeer(MacAddress peer) و addWifiAwarePeer(PeerHandle peer)، همتای Wi-Fi Aware را اضافه کند. برای کسب اطلاعات بیشتر درباره کشف همتاهای 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 مشخص می‌شود. برای هر درخواست، کارهای زیر را انجام دهید.

۱. شناسایی درخواست

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

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

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

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

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

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

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

    getDistanceMm()

    getDistanceStdDevMm()

  • RSSI بسته‌های استفاده‌شده برای اندازه‌گیری‌ها:

    getRssi()

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

    getRangingTimestampMillis()

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

    getNumAttemptedMeasurements()

    getNumSuccessfulMeasurements()

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

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

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

    get80211azResponderTxLtfRepetitionsCount()

    get80211azInitiatorTxLtfRepetitionsCount()

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

    get80211azNumberOfTxSpatialStreams()

    get80211azNumberOfRxSpatialStreams()

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

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

نقاط دسترسی

سازنده و مدل تاریخ پشتیبانی پروتکل
Nest Wifi Pro (Wi-Fi 6E) پشتیبانی می‌شود mc
Compulab WILD AP پشتیبانی می‌شود mc
Google Wi-Fi پشتیبانی می‌شود mc
رهیاب Google Nest Wi-Fi پشتیبانی می‌شود mc
نقطه Google Nest Wi-Fi پشتیبانی می‌شود mc
Aruba AP-635 پشتیبانی می‌شود mc
Cisco 9130 پشتیبانی می‌شود mc
Cisco 9136 پشتیبانی می‌شود mc
Cisco 9166 پشتیبانی می‌شود mc
Cisco 9164 پشتیبانی می‌شود mc
Cisco CW9172I پشتیبانی می‌شود mc/az
Cisco CW9172H پشتیبانی می‌شود mc/az
Cisco CW9176I پشتیبانی می‌شود mc/az
Cisco CW9178I پشتیبانی می‌شود mc/az
Aruba AP-505 پشتیبانی می‌شود mc
Aruba AP-515 پشتیبانی می‌شود mc
Aruba AP-575 پشتیبانی می‌شود mc
Aruba AP-518 پشتیبانی می‌شود mc
Aruba AP-505H پشتیبانی می‌شود mc
Aruba AP-565 پشتیبانی می‌شود mc
Aruba AP-535 پشتیبانی می‌شود mc
Aruba AP567 پشتیبانی می‌شود mc
Aruba AP577 پشتیبانی می‌شود mc
Aruba AP555 پشتیبانی می‌شود mc
Aruba AP635 پشتیبانی می‌شود mc
Aruba AP655 پشتیبانی می‌شود mc
Aruba AP615 پشتیبانی می‌شود mc
Aruba AP734 پشتیبانی می‌شود mc/az
Aruba AP735 پشتیبانی می‌شود mc/az
Aruba AP754 پشتیبانی می‌شود mc/az
Aruba AP755 پشتیبانی می‌شود mc/az

تلفن‌ها

سازنده و مدل نسخه Android
Google Pixel 9 Pro XL +14
Google Pixel 9 +14
Google Pixel 9 Pro +14
Google Pixel 9 Pro XL +14
Google Pixel 7a +14
Google Pixel 7 +14
Google Pixel 8 +14
Google Pixel 8 Pro +14
Google Pixel 8a +14
Samsung SM-S918B +14
Samsung SM-A515F +14
Google Pixel 9 Pro +14
Samsung SM-A546E +14
Samsung SM-S928B +14
Samsung SM-A217F +14
Samsung SM-A715F +14
Samsung SM-A528B +14
Samsung SM-A135F +14
Samsung SM-S911B +14
Xiaomi 21091116AI +14
Google Pixel 9 +14
Samsung SM-A127F +14
Google Pixel 7 Pro +14
Samsung SM-A556E +14
Pixel 6 ‫۹.۰+
Pixel 6 Pro ‫۹.۰+
Pixel 5 ‫۹.۰+
Pixel 5a ‫۹.۰+
Pixel 5a 5G ‫۹.۰+
Xiaomi Mi 10 Pro ‫۹.۰+
Xiaomi Mi 10 ‫۹.۰+
Xiaomi Redmi Mi 9T Pro ‫۹.۰+
Xiaomi Mi 9T ‫۹.۰+
Xiaomi Mi 9 ‫۹.۰+
Xiaomi Mi Note 10 ‫۹.۰+
Xiaomi Mi Note 10 Lite ‫۹.۰+
Xiaomi Redmi Note 9S ‫۹.۰+
Xiaomi Redmi Note 9 Pro ‫۹.۰+
Xiaomi Redmi Note 8T ‫۹.۰+
Xiaomi Redmi Note 8 ‫۹.۰+
Xiaomi Redmi K30 Pro ‫۹.۰+
Xiaomi Redmi K20 Pro ‫۹.۰+
Xiaomi Redmi K20 ‫۹.۰+
Xiaomi Redmi Note 5 Pro ‫۹.۰+
Xiaomi Mi CC9 Pro ‫۹.۰+
LG G8X ThinQ ‫۹.۰+
LG V50S ThinQ ‫۹.۰+
LG V60 ThinQ ‫۹.۰+
LG V30 ‫۹.۰+
Samsung Galaxy Note 10+ 5G ‫۹.۰+
Samsung Galaxy S20+ 5G ‫۹.۰+
+Samsung Galaxy S20 ‫۹.۰+
Samsung Galaxy S20 5G ‫۹.۰+
Samsung Galaxy S20 Ultra 5G ‫۹.۰+
Samsung Galaxy S20 ‫۹.۰+
Samsung Galaxy Note 10+‎ ‫۹.۰+
Samsung Galaxy Note 10 5G ‫۹.۰+
Samsung Galaxy Note 10 ‫۹.۰+
Samsung A9 Pro ‫۹.۰+
Google Pixel 4 XL ‫۹.۰+
Google Pixel 4 ‫۹.۰+
Google Pixel 4a ‫۹.۰+
Google Pixel 3 XL ‫۹.۰+
Google Pixel 3 ‫۹.۰+
Google Pixel 3a XL ‫۹.۰+
Google Pixel 3a ‫۹.۰+
Google Pixel 2 XL ‫۹.۰+
Google Pixel 2 ‫۹.۰+
Google Pixel 1 XL ‫۹.۰+
Google Pixel 1 ‫۹.۰+
Poco X2 ‫۹.۰+
Sharp Aquos R3 SH-04L ‫۹.۰+

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

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