ارتباطات فوق پهن باند (UWB).

ارتباطات فوق پهن باند یک فناوری رادیویی است که بر محدوده دقیق (اندازه گیری مکان با دقت 10 سانتی متر) بین دستگاه ها متمرکز است. این فناوری رادیویی می تواند از چگالی کم انرژی برای اندازه گیری های برد کوتاه استفاده کند و سیگنال دهی با پهنای باند بالا را در بخش بزرگی از طیف رادیویی انجام دهد. پهنای باند UWB بیشتر از 500 مگاهرتز (یا بیش از 20 درصد پهنای باند کسری) است.

کنترل کننده/آغاز کننده در مقابل کنترل کننده/پاسخ دهنده

ارتباط UWB بین دو دستگاه اتفاق می افتد که یکی کنترلر و دیگری کنترل کننده است. کنترل کننده کانال پیچیده ( UwbComplexChannel ) را تعیین می کند که دو دستگاه به اشتراک بگذارند و آغازگر است، در حالی که کنترل کننده پاسخ دهنده است.

یک Controller می تواند چندین Controlee را مدیریت کند، اما یک Controlee فقط می تواند در یک Controller مشترک شود. هر دو پیکربندی Controller/Initiator و Controlee/Responder پشتیبانی می شوند.

محدوده پارامترها

کنترل‌کننده و کنترل‌کننده باید یکدیگر را شناسایی کرده و پارامترهای محدوده را برای شروع محدوده‌بندی با یکدیگر ارتباط برقرار کنند. این مبادله به برنامه‌ها واگذار می‌شود تا با استفاده از مکانیزم ایمن خارج از باند (OOB) به انتخاب خود، مانند بلوتوث کم انرژی (BLE) اجرا کنند.

پارامترهای محدوده شامل آدرس محلی، کانال پیچیده، و کلید جلسه و غیره است. توجه داشته باشید که این پارامترها ممکن است پس از پایان جلسه محدوده تغییر کنند یا تغییر کنند و برای شروع مجدد محدوده باید مجدداً ارسال شوند.

محدوده پس زمینه

برنامه ای که در پس زمینه اجرا می شود اگر دستگاه از آن پشتیبانی کند، می تواند یک جلسه محدوده UWB را شروع کند. برای بررسی قابلیت‌های دستگاهتان، RangingCapabilities را ببینید.

برنامه هنگام اجرا در پس‌زمینه گزارش‌های محدوده را دریافت نمی‌کند. برنامه زمانی که به پیش زمینه می رود، گزارش های محدوده ای را دریافت می کند.

تنظیمات STS

برنامه یا سرویس یک کلید جلسه برای هر جلسه با استفاده از یک توالی مهر زمانی درهم (STS) ارائه می کند. STS ارائه شده امن تر از پیکربندی STS استاتیک است. Provisioned STS در همه دستگاه‌های دارای UWB دارای Android نسخه ۱۴ یا بالاتر پشتیبانی می‌شود.

دسته تهدید STS استاتیک STS ارائه شده
هوا: ناظر منفعل کاهش یافته است کاهش یافته است
هوا: تقویت سیگنال کاهش یافته است کاهش یافته است
هوا: حمله مجدد / رله مستعد کاهش یافته است

برای STS ارائه شده:

  1. از uwbConfigType در RangingParameters استفاده کنید که از STS ارائه شده پشتیبانی می کند.

  2. کلید 16 بایتی را در قسمت sessionKeyInfo وارد کنید.

برای STS استاتیک:

  1. از uwbConfigType در RangingParameters استفاده کنید که STS ثابت را پشتیبانی می کند.

  2. کلید 8 بایتی را در قسمت sessionKeyInfo وارد کنید.

مراحل

برای استفاده از UWB API، مراحل زیر را دنبال کنید:

  1. مطمئن شوید که دستگاه‌های Android با Android 12 یا بالاتر اجرا می‌شوند و از UWB با استفاده از PackageManager#hasSystemFeature("android.hardware.uwb") پشتیبانی می‌کنند.
  2. اگر در برابر دستگاه های اینترنت اشیا قرار دارید، مطمئن شوید که آنها با 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 را برای یک Controlee شروع و خاتمه می دهد:

// 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 اکنون برای کمک به دستیابی به قابلیت همکاری با مشتریان جاوا در دسترس است. این کتابخانه راهی برای دریافت دامنه نتایج به عنوان یک جریان قابل مشاهده یا جریان و برای بازیابی 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 پشتیبانی می‌کنند:

فروشنده مدل دستگاه
گوگل Pixel 6 Pro، 7 Pro، 8 Pro، Fold، Tablet
سامسونگ Galaxy Note 20، S21+، S22+، S23+، S24+ Z Fold 2، 3، 4، 5

SDK های شخص ثالث

از آوریل 2023، این راه حل های شریک با کتابخانه فعلی Jetpack سازگار هستند.

مشکل شناخته شده: ترتیب بایت برای آدرس MAC و فیلدهای ID فروشنده ثابت STS معکوس شد

در Android 13 و پایین‌تر، پشته Android UWB به اشتباه ترتیب بایت‌ها را برای فیلدهای زیر برعکس می‌کند:

  • آدرس مک دستگاه
  • آدرس مک مقصد
  • شناسه فروشنده STS ثابت

تغییر ترتیب بایت به این دلیل اتفاق می‌افتد که پشته اندروید با این فیلدها به عنوان مقادیر رفتار می‌کند نه آرایه. ما در حال کار با FiRa برای به روز رسانی مشخصات UCI ( CR-1112 ) هستیم تا به صراحت بیان کنیم که این فیلدها باید به عنوان آرایه در نظر گرفته شوند.

این مشکل از طریق به روز رسانی GMS Core در نسخه 2320XXXX برطرف خواهد شد. برای سازگاری با دستگاه‌های Android از آن نقطه به بعد، فروشندگان IOT باید پیاده‌سازی شما را تغییر دهند تا از تغییر ترتیب بایت این فیلدها جلوگیری شود.