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

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

مسؤول التحكّم بالبيانات/بادئ التشغيل مقابل المسؤول عن التحكّم/المجيب

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

يمكن لوحدة التحكم التعامل مع العديد من عناصر التحكم، غير أنه لا يمكن لها سوى الاشتراك إلى وحدة تحكُّم واحدة. كل من مسؤول التحكّم بالبيانات/بادئ التشغيل والمراقب/المجيب التهيئات متاحة.

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

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

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

تنطبق القيود التالية على استخدام واجهة برمجة التطبيقات UWB API:

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

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

نموذج تطبيق

للحصول على مثال شامل عن كيفية استخدام مكتبة UWB Jetpack، يمكنك الاطّلاع على نموذج التطبيق على GitHub. يتناول هذا النموذج عملية التحقّق من توافق النطاق الفائق العرض (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، ستتوافق الأجهزة التالية مع مكتبة Jetpack UWB لنظام التشغيل Android:

المورّد طراز الجهاز
Google Pixel 6 Pro وPixel 7 Pro وPixel 8 Pro وPixel Fold وجهاز لوحي
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 الثابت

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

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