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

يمكنك استخدام وظيفة تحديد الموقع الجغرافي لشبكة Wi-Fi التي يوفّرها لك واجهة برمجة التطبيقات لميزة "مراسلة نصية في الوقت الفعلي" (Round-Trip-Time) لشبكة Wi-Fi قياس المسافة إلى نقاط وصول Wi-Fi والتطبيقات المشابهة التي تعمل في ميزة "مراسلة نصية في الوقت الفعلي" الأجهزة التي تستخدم الاتصالات بشبكة Wi-Fi

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

وبفضل هذه الدقة، يمكنك تطوير خدمات دقيقة مستندة إلى الموقع الجغرافي، مثل التنقّل في الأماكن المغلقة، والتحكّم الصوتي الواضح (على سبيل المثال، "تشغيل هذا المصباح")، والمعلومات المستندة إلى الموقع الجغرافي (على سبيل المثال، "هل هناك عروض خاصة لهذا المنتج؟").

لقياس الطلب، لا يحتاج الجهاز الذي قدّم الطلب إلى الاتصال بنقاط الوصول. المسافة باستخدام ميزة "مراسلة نصية في الوقت الفعلي" لشبكة Wi-Fi. للحفاظ على الخصوصية، لا يمكن سوى للجهاز المُرسِل تحديد المسافة إلى نقطة الوصول، ولا تملك نقاط الوصول هذه المعلومات. تكون عمليات "المراسلة النصية في الوقت الفعلي" لشبكة Wi-Fi غير محدودة للتطبيقات التي تعمل في المقدّمة، ولكن لا يمكن تقييد تطبيقات الخلفية.

تتميز ميزة "مراسلة نصية في الوقت الفعلي" لشبكة Wi-Fi وإمكانات قياس الوقت الدقيق (FTM) ذات الصلة بما يلي: المحدد في معيار IEEE 802.11-2016. تتطلب ميزة "المراسلة النصية في الوقت الفعلي" عبر Wi-Fi الوقت الدقيق. يوفّره FTM بسبب احتساب المسافة بين اثنين عن طريق قياس الوقت الذي تستغرقه حزمة لإجراء جولة ذهاب وعودة بين الأجهزة وضرب هذا الوقت في سرعة الضوء.

وفّر نظام Android 15 (المستوى 35 لواجهة برمجة التطبيقات) إمكانية استخدام قياس المسافة بالاستناد إلى تقنية IEEE 802.11az التي لا تعتمد على عامل تشغيل (NTB).

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

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

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

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

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

المتطلبات

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

ضبط إعدادات الجهاز

لإعداد تطبيقك لاستخدام ميزة "وقت استجابة Wi-Fi"، عليك اتّباع الخطوات التالية:

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

للتحقّق مما إذا كان الجهاز متوافقًا مع ميزة "المراسلة النصية في الوقت الفعلي" عبر شبكة Wi-Fi، استخدِم PackageManager واجهة برمجة التطبيقات:

Kotlin

context.packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)

Java

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

3- التحقّق مما إذا كانت ميزة "وقت استجابة Wi-Fi" متاحة

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

يمكن أن يتغيّر مدى توفّر ميزة "وقت استجابة Wi-Fi" في أي وقت. يجب أن يسجِّل تطبيقك علامة إشتراك في 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 في طلب أحادي النطاق يتم قياس المسافات بين جميع الأجهزة وإرجاعها.

على سبيل المثال، يمكن أن يستخدم الطلب الأسلوب 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، راجِع مستندات 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()

  • الحد الأدنى والأقصى للوقت الذي يجب أن ينتظر فيه جهاز العميل بين 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 وهي أبعد ما تكون عن شاملة. ننصحك بما يلي: التواصل معنا لإدراج منتجاتك التي تتيح ميزة "مراسلة نصية في الوقت الفعلي" هنا.

نقاط الوصول

الشركة المصنّعة والطراز تاريخ التوفّر
Nest Wifi Pro (Wi-Fi 6E) معلومات معتمَدة
Compulab WILD AP معلومات معتمَدة
شبكة Google Wi-Fi معلومات معتمَدة
جهاز توجيه Google Nest Wi-Fi معلومات معتمَدة
نقطة اتصال Google Nest Wi-Fi معلومات معتمَدة
Aruba AP-635 معلومات معتمَدة
Cisco 9130 معلومات معتمَدة
Cisco 9136 معلومات معتمَدة
سيسكو 9166 معلومات معتمَدة
سيسكو 9164 معلومات معتمَدة
Aruba AP-505 معلومات معتمَدة
أروبا AP-515 معلومات معتمَدة
Aruba AP-575 معلومات معتمَدة
Aruba AP-518 معلومات معتمَدة
Aruba AP-505H معلومات معتمَدة
Aruba AP-565 معلومات معتمَدة
Aruba AP-535 معلومات معتمَدة

الهواتف

الشركة المصنّعة والطراز إصدار Android
Pixel 6 9.0+
Pixel 6 Pro 9.0+
Pixel 5 9.0+
Pixel 5a 9.0+
Pixel 5a (5G) 9.0+
Xiaomi Mi 10 Pro 9.0+
Xiaomi Mi 10 9.0+
Xiaomi Redmi Mi 9T Pro 9.0+
هاتف Xiaomi Mi 9T 9.0+
Xiaomi Mi 9 9.0+
Xiaomi Mi Note 10 9.0+
Xiaomi Mi Note 10 Lite 9.0+
Xiaomi Redmi Note 9S 9.0+
Xiaomi Redmi Note 9 Pro 9.0+
Xiaomi Redmi Note 8T 9.0+
Xiaomi Redmi Note 8 9.0+
Xiaomi Redmi K30 Pro 9.0+
Xiaomi Redmi K20 Pro 9.0+
Xiaomi Redmi K20 9.0+
Xiaomi Redmi Note 5 Pro 9.0+
Xiaomi Mi CC9 Pro 9.0+
LG G8X ThinQ 9.0+
LG V50S ThinQ 9.0+
LG V60 ThinQ 9.0+
LG V30 9.0+
Samsung Galaxy Note 10+ 5G 9.0+
Samsung Galaxy S20+ 5G 9.0+
Samsung Galaxy S20+ 9.0+
Samsung Galaxy S20 5G 9.0+
هاتف Samsung Galaxy S20 Ultra 5G 9.0+
هاتف Samsung Galaxy S20 9.0+
Samsung Galaxy Note 10 أو الإصدارات الأحدث 9.0+
Samsung Galaxy Note 10 5G 9.0+
هاتف Samsung Galaxy Note 10 9.0+
Samsung A9 Pro 9.0+
Google Pixel 4 XL 9.0+
Google Pixel 4 9.0+
Google Pixel 4a 9.0+
Google Pixel 3 XL 9.0+
Google Pixel 3 9.0+
Google Pixel 3a XL 9.0+
Google Pixel 3a 9.0+
Google Pixel 2 XL 9.0+
Google Pixel 2 9.0+
Google Pixel 1 XL 9.0+
Google Pixel 1 9.0+
Poco X2 9.0+
Sharp Aquos R3 SH-04L 9.0+

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

الشركة المصنّعة والطراز إصدار Android
Zebra PS20 10.0+
Zebra TC52/TC52HC 10.0+
Zebra TC57 10.0+
حمار وحشي TC72 +10.0
Zebra TC77 10.0+
Zebra MC93 10.0+
زيبرا TC8300 +10.0
زيبرا VC8300 +10.0
Zebra 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+