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

على الأجهزة التي تعمل بنظام التشغيل Android 10 (المستوى 29 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن تخزين بيانات الموقع الجغرافي من نقطة الوصول ممثلة في ResponderLocation وهي تشمل خطوط العرض وخطوط الطول والارتفاع. بالنسبة إلى نقاط APK التي تستخدم ميزة "المراسلة النصية في الوقت الفعلي" لشبكة 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 API لتوفير المعلومات عن القيمة الصغرى والأقصى التي يمكن استخدامها للفاصل الزمني بين نطاق القياسات، مع ترك الفاصل الزمني الدقيق والتحكم في التطبيق.

المتطلبات

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

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، الذي يتم إرساله عند تغير مدى التوفر. عندما يتلقّى تطبيقك البث intent، يجب أن يتحقّق التطبيق من حالة التوفّر الحالية ويعدّل السلوك وفقًا لذلك.

مثلاً:

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) تم إنشاؤه من خلال تحديد قائمة نقاط الوصول (AP) أو التطبيقات المشابهة المزوّدة بخدمة Wi-Fi والتي طلب الإعدادات. يمكن تحديد نقاط وصول متعددة أو نظراء 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 وفقًا لقدرة AP، الإعداد التلقائي على 802.11az عند فإن AP تدعم كليهما. تنفِّذ الأجهزة التي لا تتوافق مع معيار 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 معلومات معتمَدة
سيسكو 9130 معلومات معتمَدة
سيسكو 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
حمار وحشي TC57 +10.0
حمار وحشي TC72 الإصدار 10.0 أو الإصدارات الأحدث
حمار وحشي TC77 +10.0
حمار وحشي MC93 الإصدار 10.0 أو الإصدارات الأحدث
زيبرا TC8300 +10.0
زيبرا 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 أو الإصدارات الأحدث
حمار وحشي WT6300 +10.0
Skorpio X5 الإصدار 10.0 أو الإصدارات الأحدث