আল্ট্রা-ওয়াইডব্যান্ড (UWB) যোগাযোগ

আল্ট্রা-ওয়াইডব্যান্ড কমিউনিকেশন হল একটি রেডিও প্রযুক্তি যা ডিভাইসগুলির মধ্যে সুনির্দিষ্ট রেঞ্জিং (অবস্থান পরিমাপ করে 10 সেমি নির্ভুলতা) এর উপর দৃষ্টি নিবদ্ধ করে। এই রেডিও প্রযুক্তি স্বল্প পরিসরের পরিমাপের জন্য কম-শক্তির ঘনত্ব ব্যবহার করতে পারে এবং রেডিও স্পেকট্রামের একটি বড় অংশে উচ্চ-ব্যান্ডউইথ সিগন্যালিং সঞ্চালন করতে পারে। UWB-এর ব্যান্ডউইথ 500 MHz-এর বেশি (বা 20% ভগ্নাংশের ব্যান্ডউইথের বেশি)।

কন্ট্রোলার/ইনিশিয়েটর বনাম কন্ট্রোলি/জবাবদাতা

UWB যোগাযোগ দুটি ডিভাইসের মধ্যে ঘটে, যেখানে একটি হল কন্ট্রোলার এবং অন্যটি হল কন্ট্রোলি। নিয়ন্ত্রক জটিল চ্যানেল ( UwbComplexChannel ) নির্ধারণ করে যা দুটি ডিভাইস ভাগ করবে এবং এটি সূচনাকারী, যখন কন্ট্রোলি হল উত্তরদাতা।

একটি কন্ট্রোলার একাধিক কন্ট্রোল পরিচালনা করতে পারে, কিন্তু একটি কন্ট্রোলি শুধুমাত্র একটি কন্ট্রোলারের সদস্যতা নিতে পারে। কন্ট্রোলার/ইনিশিয়েটর এবং কন্ট্রোলি/প্রতিক্রিয়াকারী কনফিগারেশন উভয়ই সমর্থিত।

রেঞ্জিং পরামিতি

কন্ট্রোলার এবং কন্ট্রোলিকে একে অপরকে শনাক্ত করতে হবে এবং রেঞ্জিং শুরু করার জন্য রেঞ্জিং প্যারামিটারের সাথে যোগাযোগ করতে হবে। ব্লুটুথ লো এনার্জি (BLE) এর মতো তাদের পছন্দের একটি নিরাপদ আউট-অফ-ব্যান্ড (OOB) পদ্ধতি ব্যবহার করে প্রয়োগ করার জন্য এই এক্সচেঞ্জটি অ্যাপ্লিকেশনগুলিতে ছেড়ে দেওয়া হয়।

রেঞ্জিং প্যারামিটারগুলির মধ্যে স্থানীয় ঠিকানা, জটিল চ্যানেল এবং সেশন কী অন্তর্ভুক্ত রয়েছে। মনে রাখবেন যে রেঞ্জিং সেশন শেষ হওয়ার পরে এই প্যারামিটারগুলি ঘোরানো বা অন্যথায় পরিবর্তিত হতে পারে এবং রেঞ্জিং পুনরায় চালু করার জন্য পুনরায় যোগাযোগ করতে হবে।

ব্যাকগ্রাউন্ড রেঞ্জিং

ব্যাকগ্রাউন্ডে চলমান একটি অ্যাপ একটি UWB রেঞ্জিং সেশন শুরু করতে পারে যদি ডিভাইসটি এটি সমর্থন করে। আপনার ডিভাইসের ক্ষমতা পরীক্ষা করতে, RangingCapabilities দেখুন।

ব্যাকগ্রাউন্ডে চলার সময় অ্যাপটি রেঞ্জিং রিপোর্ট পায় না; অ্যাপটি যখন অগ্রভাগে চলে যায় তখন তা বিস্তৃত প্রতিবেদন পায়।

STS কনফিগারেশন

একটি স্ক্র্যাম্বল্ড টাইমস্ট্যাম্প সিকোয়েন্স (STS) ব্যবহার করে অ্যাপ বা পরিষেবা প্রতিটি সেশনের জন্য একটি সেশন কী প্রদান করে। একটি স্থির STS কনফিগারেশনের চেয়ে প্রভিশন করা STS বেশি নিরাপদ। অ্যানড্রয়েড 14 বা উচ্চতর সংস্করণে চলমান সমস্ত UWB-সক্ষম ডিভাইসে প্রভিশনড STS সমর্থিত।

হুমকি বিভাগ স্ট্যাটিক STS নির্ধারিত STS
বায়ু: প্যাসিভ পর্যবেক্ষক প্রশমিত প্রশমিত
বায়ু: সংকেত পরিবর্ধন প্রশমিত প্রশমিত
বায়ু: রিপ্লে/রিলে আক্রমণ সংবেদনশীল প্রশমিত

প্রবিধান STS এর জন্য:

  1. RangingParameters uwbConfigType ব্যবহার করুন যা বিধান করা STS সমর্থন করে।

  2. sessionKeyInfo ক্ষেত্রে 16-বাইট কী প্রদান করুন।

স্ট্যাটিক STS এর জন্য:

  1. RangingParameters uwbConfigType ব্যবহার করুন যা স্ট্যাটিক STS সমর্থন করে।

  2. sessionKeyInfo ক্ষেত্রে 8-বাইট কী প্রদান করুন।

ধাপ

UWB API ব্যবহার করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. নিশ্চিত করুন যে Android ডিভাইসগুলি Android 12 বা উচ্চতর সংস্করণে চলছে এবং PackageManager#hasSystemFeature("android.hardware.uwb") ব্যবহার করে তারা UWB সমর্থন করে৷
  2. IoT ডিভাইসের বিপরীতে থাকলে, নিশ্চিত করুন যে সেগুলি FiRa MAC 1.3 অনুগত।
  3. আপনার পছন্দের একটি OOB মেকানিজম ব্যবহার করে UWB-সক্ষম পিয়ার ডিভাইসগুলি আবিষ্কার করুন, যেমন BluetoothLeScanner
  4. আপনার পছন্দের একটি নিরাপদ OOB মেকানিজম, যেমন BluetoothGatt ব্যবহার করে রেঞ্জিং প্যারামিটারগুলি বিনিময় করুন।
  5. ব্যবহারকারী যদি সেশন বন্ধ করতে চান, সেশনের সুযোগ বাতিল করুন।

ব্যবহার বিধিনিষেধ

নিম্নলিখিত বিধিনিষেধগুলি UWB API ব্যবহারের ক্ষেত্রে প্রযোজ্য:

  1. যে অ্যাপটি নতুন UWB রেঞ্জিং সেশন শুরু করছে সেটি অবশ্যই একটি ফোরগ্রাউন্ড অ্যাপ বা পরিষেবা হতে হবে যদি না আগে চিত্রিত হিসাবে ব্যাকগ্রাউন্ড রেঞ্জিং সমর্থিত হয়।
  2. যখন অ্যাপটি ব্যাকগ্রাউন্ডে চলে যায় (যখন সেশন চলছে), অ্যাপটি আর রেঞ্জিং রিপোর্ট নাও পেতে পারে। তবে UWB অধিবেশন নিম্ন স্তরে বজায় রাখা অব্যাহত থাকবে। অ্যাপটি ফোরগ্রাউন্ডে ফিরে গেলে, রেঞ্জিং রিপোর্টগুলি আবার শুরু হবে।

কোড নমুনা

নমুনা অ্যাপ্লিকেশন

কিভাবে UWB Jetpack লাইব্রেরি ব্যবহার করতে হয় তার এন্ড-টু-এন্ড উদাহরণের জন্য, Github-এ আমাদের নমুনা অ্যাপ্লিকেশনটি দেখুন। এই নমুনা অ্যাপটি একটি অ্যান্ড্রয়েড ডিভাইসে UWB সামঞ্জস্য যাচাইকরণ, একটি 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 সমর্থন এখন জাভা ক্লায়েন্টদের সাথে ইন্টারঅপারেবিলিটি অর্জনে সহায়তা করার জন্য উপলব্ধ। এই লাইব্রেরিটি একটি পর্যবেক্ষণযোগ্য বা প্রবাহিত স্ট্রীম হিসাবে বিস্তৃত ফলাফল পেতে এবং একটি একক বস্তু হিসাবে 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 লাইব্রেরি সমর্থন করে:

বিক্রেতা ডিভাইস মডেল
গুগল পিক্সেল 6 প্রো, 7 প্রো, 8 প্রো, ফোল্ড, ট্যাবলেট
স্যামসাং Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5

তৃতীয় পক্ষের SDK

এপ্রিল 2023 অনুসারে, এই অংশীদার সমাধানগুলি বর্তমান জেটপ্যাক লাইব্রেরির সাথে সামঞ্জস্যপূর্ণ।

পরিচিত সমস্যা: MAC ঠিকানা এবং স্ট্যাটিক STS ভেন্ডর আইডি ফিল্ডের জন্য বাইট অর্ডার বিপরীত করা হয়েছে

অ্যান্ড্রয়েড 13 এবং তার নিচের সংস্করণে, অ্যান্ড্রয়েড ইউডব্লিউবি স্ট্যাক ভুলভাবে নিম্নলিখিত ক্ষেত্রের জন্য বাইট অর্ডারকে বিপরীত করে:

  • ডিভাইস MAC ঠিকানা
  • গন্তব্য MAC ঠিকানা
  • স্ট্যাটিক STS ভেন্ডর আইডি

বাইট অর্ডার রিভার্সাল ঘটে কারণ অ্যান্ড্রয়েড স্ট্যাক এই ক্ষেত্রগুলিকে মান হিসাবে বিবেচনা করে, অ্যারে নয়। UCI স্পেসিফিকেশন ( CR-1112 ) আপডেট করার জন্য আমরা FiRa-এর সাথে কাজ করছি যাতে স্পষ্টভাবে বলা যায় যে এই ক্ষেত্রগুলিকে অ্যারে হিসাবে বিবেচনা করা উচিত।

এই সমস্যাটি 2320XXXX রিলিজে GMS কোর আপডেটের মাধ্যমে ঠিক করা হবে। সেই বিন্দু থেকে অ্যান্ড্রয়েড ডিভাইসগুলির সাথে সঙ্গতিপূর্ণ হওয়ার জন্য, IOT বিক্রেতাদের এই ক্ষেত্রগুলির বাইট ক্রম পরিবর্তন এড়াতে আপনার বাস্তবায়ন সংশোধন করতে হবে৷