موقع Wi-Fi: بدءًا من ميزة "المراسلة النصية في الوقت الفعلي"

يمكنك استخدام وظيفة تحديد الموقع الجغرافي عبر شبكة Wi-Fi التي توفّرها واجهة برمجة التطبيقات Wi-Fi RTT (وقت الاستجابة الكاملة) لقياس المسافة إلى نقاط وصول 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 (المستوى 35 لواجهة برمجة التطبيقات) استخدام تقنية تحديد المدى المستندة إلى المعيار IEEE 802.11az غير المستندة إلى المشغّل (NTB).

اختلافات التنفيذ استنادًا إلى إصدار Android

تم طرح تقنية Wi-Fi RTT في الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات). عند استخدام هذا البروتوكول لتحديد موضع الجهاز باستخدام التثليث المتعدد مع الأجهزة التي تعمل بنظام التشغيل Android 9، يجب أن يكون لديك إذن الوصول إلى بيانات المواقع الجغرافية المحدّدة مسبقًا لنقاط الوصول (AP) في تطبيقك. ويعود إليك تحديد كيفية تخزين هذه البيانات واسترجاعها.

على الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن تمثيل بيانات الموقع الجغرافي لنقطة الوصول على شكل عناصر ResponderLocation تتضمّن خطوط الطول والعرض والارتفاع. بالنسبة إلى نقاط وصول Wi-Fi RTT التي تتوافق مع معلومات إعداد الموقع الجغرافي/تقرير الموقع الجغرافي المدني (بيانات LCI/LCR)، سيعرض البروتوكول عنصر ResponderLocation أثناء عملية تحديد المدى.

تتيح هذه الميزة للتطبيقات إرسال طلبات بحث إلى نقاط الوصول لسؤالها عن موقعها الجغرافي مباشرةً بدلاً من الحاجة إلى تخزين هذه المعلومات مسبقًا. وبالتالي، يمكن لتطبيقك العثور على نقاط الوصول وتحديد مواضعها حتى إذا لم تكن معروفة من قبل، مثلما يحدث عندما يدخل المستخدم مبنى جديدًا.

تتوفّر ميزة تحديد المدى المستند إلى معيار IEEE 802.11az NTB على الأجهزة التي تعمل بالإصدار Android 15 (المستوى 35 لواجهة برمجة التطبيقات) والإصدارات الأحدث. وهذا يعني أنّه إذا كان الجهاز متوافقًا مع وضع بدء تشغيل IEEE 802.11az NTB (يُشار إليه بالرمز WifiRttManager.CHARACTERISTICS_KEY_BOOLEAN_NTB_INITIATOR)، يمكن لتطبيقك العثور على نقاط وصول متوافقة مع كل من IEEE 802.11mc وIEEE 802.11az من خلال طلب نطاق واحد. تمت إضافة وظائف إلى واجهة برمجة التطبيقات RangingResult لتوفير معلومات حول الحد الأدنى والأقصى للقيمة التي يمكن استخدامها للفاصل الزمني بين قياسات تحديد المدى، مع ترك الفاصل الزمني الدقيق تحت سيطرة تطبيقك.

المتطلبات

  • يجب أن يتوافق الجهاز الذي يرسل طلب تحديد المدى مع معيار FTM 802.11-2016 أو معيار 802.11az (تحديد المدى غير المستند إلى المشغّل).
  • يجب أن يعمل الجهاز الذي يرسل طلب تحديد المدى بالإصدار 9 (المستوى 28 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث من نظام التشغيل Android. يتم تفعيل ميزة تحديد المدى المستندة إلى معيار IEEE 802.11az بدون مشغّل على الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات) والإصدارات الأحدث.
  • يجب أن يكون الجهاز الذي يرسل طلب تحديد المدى قد فعّل خدمات الموقع الجغرافي وميزة "فحص شبكة Wi-Fi" (ضمن الإعدادات > الموقع الجغرافي).
  • إذا كان التطبيق الذي يرسل طلب تحديد المدى يستهدف الإصدار 13 من نظام التشغيل Android (المستوى 33 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يجب أن يتضمّن إذن NEARBY_WIFI_DEVICES. إذا كان هذا التطبيق يستهدف إصدارًا قديمًا من Android، يجب أن يتضمّن الإذن ACCESS_FINE_LOCATION بدلاً من ذلك.
  • يجب أن يستعلم التطبيق عن نطاق نقاط الوصول عندما يكون التطبيق مرئيًا أو في خدمة تعمل في المقدّمة. لا يمكن للتطبيق الوصول إلى معلومات الموقع الجغرافي من الخلفية.
  • يجب أن تنفّذ نقطة الوصول معيار FTM‏ IEEE 802.11-2016 أو معيار 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:

Kotlin

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

Java

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

3- التحقّق من توفّر Wi-Fi RTT

قد تكون ميزة Wi-Fi RTT متوفّرة على الجهاز، ولكن قد لا تكون متاحة لأنّ المستخدم أوقف شبكة Wi-Fi. قد لا تتوافق بعض الأجهزة مع Wi-Fi RTT إذا تم استخدام SoftAP أو الربط، وذلك حسب إمكانيات الأجهزة والبرامج الثابتة. للتأكّد من توفّر ميزة Wi-Fi RTT، اتّصِل بالرقم isAvailable().

قد يتغيّر مدى توفّر ميزة Wi-Fi RTT في أي وقت. يجب أن يسجّل تطبيقك BroadcastReceiver لتلقّي ACTION_WIFI_RTT_STATE_CHANGED، الذي يتم إرساله عند حدوث تغييرات في حالة التوفّر. عندما يتلقّى تطبيقك الغرض من البث، يجب أن يتحقّق التطبيق من حالة التوفّر الحالية ويعدّل سلوكه وفقًا لذلك.

مثلاً:

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

لمزيد من المعلومات، يُرجى الاطّلاع على البث.

إنشاء طلب تحديد نطاق

يتم إنشاء طلب تحديد نطاق (RangingRequest) من خلال تحديد قائمة بنقاط الوصول أو الأجهزة المتوافقة مع Wi-Fi Aware التي يُطلب تحديد نطاقها. يمكن تحديد نقاط وصول متعددة أو أجهزة Wi-Fi Aware متعددة في طلب تحديد نطاق واحد، ويتم قياس المسافات إلى جميع الأجهزة وعرضها.

على سبيل المثال، يمكن أن يستخدم الطلب طريقة addAccessPoint() لتحديد نقطة وصول يتم قياس المسافة إليها:

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

يتم تحديد نقطة الوصول من خلال العنصر 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.

وبالمثل، يمكن لطلب تحديد المدى إضافة جهاز Wi-Fi Aware باستخدام عنوان MAC أو PeerHandle، وذلك باستخدام الطريقتَين addWifiAwarePeer(MacAddress peer) وaddWifiAwarePeer(PeerHandle peer) على التوالي. لمزيد من المعلومات حول العثور على أجهزة Wi-Fi Aware، يُرجى الاطّلاع على مستندات Wi-Fi Aware.

طلب تحديد النطاق

يُصدر التطبيق طلب تحديد المدى باستخدام الطريقة WifiRttManager.startRanging() وتقديم ما يلي: RangingRequest لتحديد العملية، وExecutor لتحديد سياق معاودة الاتصال، وRangingResultCallback لتلقّي النتائج.

مثلاً:

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

يتم تنفيذ عملية تحديد المدى بشكل غير متزامن، ويتم عرض نتائج تحديد المدى في إحدى دوال الرجوع الخاصة بـ 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() الحدّ الأدنى والأقصى للوقت. إذا تم طلب قياس النطاق التالي قبل انقضاء الحد الأدنى من الوقت، ستعرض واجهة برمجة التطبيقات نتيجة النطاق المخزّنة مؤقتًا. إذا تم طلب قياس النطاق التالي بعد انقضاء الحد الأقصى للوقت، ستنهي واجهة برمجة التطبيقات جلسة قياس النطاق غير المستندة إلى مشغّل وتتفاوض على جلسة قياس نطاق جديدة مع المحطة المستجيبة. يجب تجنُّب طلب جلسة تحديد نطاق جديدة، لأنّ ذلك يضيف وقتًا إضافيًا إلى وقت قياس تحديد النطاق. للاستفادة الكاملة من كفاءة تحديد المدى المستندة إلى 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 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+

أجهزة البيع بالتجزئة والتخزين والتوزيع

الشركة المصنّعة والطراز إصدار Android
Zebra PS20 ‫10.0+
Zebra TC52/TC52HC ‫10.0+
Zebra TC57 ‫10.0+
Zebra TC72 ‫10.0+
Zebra TC77 ‫10.0+
Zebra MC93 ‫10.0+
Zebra TC8300 ‫10.0+
Zebra VC8300 ‫10.0+
Zebra EC30 ‫10.0+
Zebra ET51 ‫10.0+
Zebra ET56 ‫10.0+
Zebra 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 (شبكة الاتصال المحلية ومركز المساعدة) ‫10.0+
Zebra EC55 (شبكة WAN) ‫10.0+
Zebra WT6300 ‫10.0+
Skorpio X5 ‫10.0+