الاتصال الواسع النطاق (UWB)

الاتصال الفائق العرض هو تكنولوجيا لاسلكية تركّز على النطاق الدقيق (قياس الموقع الجغرافي بدقة 10 سم) بين الأجهزة. ويمكن لهذه التقنية اللاسلكية أن تستخدم كثافة منخفضة الطاقة للقياسات قصيرة المدى وأن تُطلق إشارات ذات نطاق ترددي عالٍ عبر جزء كبير من الطيف اللاسلكي. النطاق الترددي للنطاق الفائق العرض (UWB) أكبر من 500 ميغاهرتز (أو يتجاوز نسبة 20% من معدل نقل البيانات الكسري).

مسؤول التحكّم بالبيانات/أداة البدء مقابل الجهة المتحكّمة/المجيب

يحدث اتصال النطاق الفائق العرض (UWB) بين جهازَين، حيث يكون أحدهما "وحدة تحكُّم" والآخر "مسؤول التحكّم بالبيانات". يحدد "وحدة التحكّم" القناة المعقّدة (UwbComplexChannel) التي سيشاركها الجهازان، وتكون هي الجهة التي تبدأ البث، في حين أنّ "الجهة المتحكّمة" هي المجيب.

يمكن لمسؤول التحكّم بالبيانات التعامل مع العديد من مسؤولي التحكّم، ولكن لا يجوز له الاشتراك سوى في وحدة تحكّم واحدة. تتوفر عمليات تهيئة كل من وحدة التحكم/المُبدئ، والمسؤول/المجيب.

معلمات النطاق

يحتاج مسؤول التحكّم بالبيانات ومسؤول التحكّم بالبيانات إلى التعرّف على بعضهما البعض والإبلاغ بمعايير النطاق لبدء النطاق. تُترك عملية التبادل هذه للتطبيقات من أجل تنفيذها باستخدام آلية آمنة خارج النطاق (OOB) من اختيارهم، مثل Bluetooth منخفض الطاقة (BLE).

وتتضمّن مَعلمات النطاق العنوان المحلي والقناة المعقدة ومفتاح الجلسة وغيرها. تجدر الإشارة إلى أنّ هذه المعلَمات قد يتم تدويرها أو تغييرها بأي شكل آخر بعد انتهاء جلسة تحديد النطاق ويجب إعادة الاتصال بها لإعادة ضبط النطاق.

النطاق في الخلفية

يمكن لتطبيق يعمل في الخلفية أن يبدأ جلسة النطاق الفائق العرض (UWB) إذا كان الجهاز يتوافق مع ذلك. للتحقّق من إمكانات جهازك، يُرجى الاطّلاع على RangingCapabilities.

لا يتلقى التطبيق تقارير تغيير البيانات عند تشغيله في الخلفية، بل يتلقى التطبيق تقارير نطاق عند الانتقال إلى المقدمة.

إعدادات مجموعة STS

يوفِّر التطبيق أو الخدمة مفتاح جلسة لكل جلسة باستخدام تسلسل طابع زمني (STS) مشفَّرة. إنّ آلية STS المتوفرة أكثر أمانًا من ضبط آلية STS الثابتة. تتوفّر آلية STS المتوفرة على جميع الأجهزة المزوّدة بتقنية النطاق الفائق العرض (UWB) التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث.

فئة التهديد مجموعة STS الثابتة قانون الخدمات الرقمية (STS) المقترَح
الهواء: مراقب سلبي تم التخفيف من حدتها تم التخفيف من حدتها
الهواء: تضخيم الإشارة تم التخفيف من حدتها تم التخفيف من حدتها
الهواء: هجوم إعادة التشغيل/التتابع سريعة التأثر تم التخفيف من حدتها

بالنسبة إلى سياسة STS المُدارة:

  1. يجب استخدام uwbConfigType في RangingParameters التي تتوافق مع STS المتوفرة.

  2. قدِّم المفتاح المكوَّن من 16 بايت في الحقل sessionKeyInfo.

بالنسبة إلى آلية STS الثابتة:

  1. استخدام uwbConfigType في RangingParameters التي تتوافق مع STS الثابتة

  2. قدِّم المفتاح المكوَّن من 8 بايت في الحقل sessionKeyInfo.

الخطوات

لاستخدام واجهة برمجة التطبيقات UWB، اتّبِع الخطوات التالية:

  1. تأكَّد من أنّ أجهزة Android تعمل بنظام التشغيل Android 12 أو بإصدار أحدث وأنّها تتيح استخدام النطاق الفائق العرض (UWB) باستخدام PackageManager#hasSystemFeature("android.hardware.uwb").
  2. إذا كنت تتراوح بين أجهزة إنترنت الأشياء (IoT)، فتأكد من أنها متوافقة مع FiRa MAC 1.3.
  3. يمكنك التعرّف على الأجهزة المشابهة المتوافقة مع النطاق الفائق العرض (UWB) باستخدام آلية OOB من اختيارك، مثل BluetoothLeScanner.
  4. يمكنك تبادل المعلَمات باستخدام آلية OOB آمنة من اختيارك، مثل BluetoothGatt.
  5. إذا أراد المستخدم إيقاف الجلسة، يجب إلغاء نطاق الجلسة.

قيود الاستخدام

تنطبق القيود التالية على استخدام واجهة برمجة التطبيقات النطاق الفائق العرض (UWB):

  1. يجب أن يكون التطبيق الذي يبدأ جلسات جديدة لتحديد النطاق الفائق العرض (UWB) تطبيقًا أو خدمة تعمل في المقدّمة، ما لم يكن تحديد النطاق في الخلفية متاحًا على النحو الموضّح سابقًا.
  2. عندما ينتقل التطبيق إلى الخلفية (أثناء تشغيل الجلسة)، قد لا يتلقّى التطبيق تقارير حول النطاق الزمني. ومع ذلك، سيستمر الحفاظ على جلسة النطاق الفائق العرض (UWB) في الطبقات السفلية. عندما يعود التطبيق إلى المقدمة، سيتم استئناف تقارير النطاق.

عيّنات التعليمات البرمجية

نموذج تطبيق

للحصول على مثال شامل حول كيفية استخدام مكتبة UWB Jetpack، راجِع نموذج التطبيق على جيت هب. يتناول نموذج التطبيق هذا التحقّق من التوافق مع النطاق الفائق العرض (UWB) على جهاز Android، وتفعيل عملية الاكتشاف باستخدام آلية OOB، وإعداد النطاق الفائق العرض (UWB) بين جهازَين متوافقَين مع النطاق الفائق العرض (UWB). يتناول النموذج أيضًا حالات استخدام ميزة التحكّم في الأجهزة ومشاركة الوسائط.

نطاق النطاق الفائق العرض (UWB)

يؤدي نموذج الرمز هذا إلى بدء النطاق الفائق العرض (UWB) وإنهائه للمستخدم المتحكّم فيه:

// The coroutineScope responsible for handling uwb ranging.
// This will be initialized when startRanging is called.
var job: Job?

// A code snippet that initiates uwb ranging for a Controlee.
suspend fun startRanging() {

    // Get the ranging parameter of a partnering Controller using an OOB mechanism of choice.
    val partnerAddress : Pair<UwbAddress, UwbComplexChannel> = listenForPartnersAddress()

    // Create the ranging parameters.
    val partnerParameters = RangingParameters(
        uwbConfigType = UwbRangingParameters.UWB_CONFIG_ID_1,
        // SessionKeyInfo is used to encrypt the ranging session.
        sessionKeyInfo = null,
        complexChannel = partnerAddress.second,
        peerDevices = listOf(UwbDevice.createForAddress(partnerAddress.first)),
        updateRateType = UwbRangingParameters.RANGING_UPDATE_RATE_AUTOMATIC
    )

    // Initiate a session that will be valid for a single ranging session.
    val clientSession = uwbManager.clientSessionScope()

    // Share the localAddress of the current session to the partner device.
    broadcastMyParameters(clientSession.localAddress)

    val sessionFlow = clientSession.prepareSession(partnerParameters)

    // Start a coroutine scope that initiates ranging.
    CoroutineScope(Dispatchers.Main.immediate).launch {
        sessionFlow.collect {
            when(it) {
                is RangingResultPosition -> doSomethingWithPosition(it.position)
                is RangingResultPeerDisconnected -> peerDisconnected(it)
            }
        }
    }
}

// A code snippet that cancels uwb ranging.
fun cancelRanging() {

    // Canceling the CoroutineScope will stop the ranging.
    job?.let {
        it.cancel()
    }
}

دعم RxJava3

يتوفر دعم Rxjava3 الآن للمساعدة في تحقيق إمكانية التشغيل التفاعلي مع عملاء Java. توفّر هذه المكتبة طريقة للحصول على نتائج تحديد الترتيب كتدفق قابل للملاحظة أو متدفق، ولاسترداد UwbClientSessionScope ككائن فردي.

private final UwbManager uwbManager;

// Retrieve uwbManager.clientSessionScope as a Single object
Single<UwbClientSessionScope> clientSessionScopeSingle =
                UwbManagerRx.clientSessionScopeSingle(uwbManager);
UwbClientSessionScope uwbClientSessionScope = clientSessionScopeSingle.blockingGet();

// Retrieve uwbClientSessionScope.prepareSession Flow as an Observable object
Observable<RangingResult> rangingResultObservable =
                UwbClientSessionScopeRx.rangingResultsObservable(clientSessionScope,
                        rangingParameters);

// Consume ranging results from Observable
rangingResultObservable.subscribe(
   rangingResult -> doSomethingWithRangingResult(result), // onNext
   (error) -> doSomethingWithError(error), // onError
   () -> doSomethingOnResultEventsCompleted(), //onCompleted
);
// Unsubscribe
rangingResultObservable.unsubscribe();
   

// Retrieve uwbClientSessionScope.prepareSession Flow as a Flowable object
Flowable<RangingResult> rangingResultFlowable =
                UwbClientSessionScopeRx.rangingResultsFlowable(clientSessionScope,
                        rangingParameters);

// Consume ranging results from Flowable using Disposable
Disposable disposable = rangingResultFlowable
   .delay(1, TimeUnit.SECONDS)
   .subscribeWith(new DisposableSubscriber<RangingResult> () {
      @Override public void onStart() {
          request(1);
      }
      
      @Override public void onNext(RangingResult rangingResult) {
             doSomethingWithRangingResult(rangingResult);
             request(1);
      }


      @Override public void onError(Throwable t) {
             t.printStackTrace();
      }


         @Override public void onComplete() {
            doSomethingOnEventsCompleted();
         }
   });

// Stop subscription
disposable.dispose();

دعم المنظومة المتكاملة

في ما يلي أجهزة الشركاء المتوافقة وحِزم تطوير البرامج (SDK) التابعة لجهات خارجية.

الأجهزة الجوّالة المزوّدة بتقنية النطاق الفائق العرض (UWB)

اعتبارًا من آذار (مارس) 2024، ستتوافق الأجهزة التالية مع مكتبة Android UWB Jetpack:

المورّد طراز الجهاز
Google Pixel 6 Pro وPixel 7 Pro وPixel 8 Pro وPixel Fold وPixel Tablet
Samsung Galaxy Note 20 وS21+ وS22 وS23+ وS24+ Z Fold 2 و3 و4 و5

حِزم تطوير البرامج (SDK) التابعة لجهات خارجية

اعتبارًا من نيسان (أبريل) 2023، أصبحت حلول الشركاء هذه متوافقة مع مكتبة Jetpack الحالية.

مشكلة معروفة: تم عكس ترتيب البايت لحقلَي عنوان MAC ومعرّف المورّد الثابت لنظام STS.

في نظام التشغيل Android 13 والإصدارات الأقدم، تعكس حزمة النطاق الفائق العرض (UWB) من Android ترتيب البايت بشكل غير صحيح للحقول التالية:

  • عنوان MAC للجهاز
  • عنوان MAC للجهاز الوجهة
  • رقم تعريف المورّد الثابت لسياسة "STS" (STS)

يحدث عكس ترتيب البايت لأن مكدس Android يعامل هذه الحقول كقيم، وليس صفائف. نحن نعمل مع FIRa لتعديل مواصفات UCI (CR-1112) لتوضيح أنّه يجب التعامل مع هذه الحقول بشكل صريح على أنّها صفائف.

سيتم إصلاح هذه المشكلة من خلال تحديث GMS Core في إصدار 2320XXXX. للامتثال لأجهزة Android من ذلك الوقت فصاعدًا، يحتاج مورّدو "إنترنت الأشياء" إلى تعديل عملية التنفيذ لتجنّب عكس ترتيب البايت لهذه الحقول.