अल्ट्रा-वाइडबैंड (यूडब्ल्यूबी) कम्यूनिकेशन

अल्ट्रा-वाइडबैंड कम्यूनिकेशन एक रेडियो टेक्नोलॉजी है, जो सटीक रेंज पर फ़ोकस करती है (10 सें॰मी॰ तक जगह की जानकारी को सटीक तरीके से मापा जा रहा है). यह रेडियो टेक्नोलॉजी, कम रेंज को मापने के लिए, कम ऊर्जा की डेंसिटी का इस्तेमाल कर सकती है और रेडियो स्पेक्ट्रम के एक बड़े हिस्से पर हाई बैंडविड्थ सिग्नलिंग कर सकें. यूडब्ल्यूबी की बैंडविड्थ 500 मेगाहर्ट्ज़ (या 20% से ज़्यादा आंशिक) से ज़्यादा है बैंडविथ).

नियंत्रक/शुरू करने वाला बनाम कंट्रोली/जवाब देने वाला

यूडब्ल्यूबी कम्यूनिकेशन दो डिवाइसों के बीच होता है. इनमें से एक डिवाइस कंट्रोलर है और एक कंट्रोली है. नियंत्रक जटिल चैनल का पता लगाता है (UwbComplexChannel) वह दोनों डिवाइस एक-दूसरे के साथ शेयर करेंगे और शुरू करने वाला होगा. वहीं, कंट्रोली जवाब देने वाला.

कंट्रोलर, एक से ज़्यादा कंट्रोली को मैनेज कर सकता है. हालांकि, कंट्रोली सिर्फ़ सदस्यता ले सकता है का इस्तेमाल सिर्फ़ एक कंट्रोलर के तौर पर किया जा सकता है. कंट्रोलर/शुरू करने वाला और कंट्रोली/जवाब देने वाला, दोनों कॉन्फ़िगरेशन काम करते हैं.

रेंज के पैरामीटर

कंट्रोलर और कंट्रोली को एक-दूसरे को पहचानने और एक-दूसरे से बातचीत करने की ज़रूरत होती है रेंज सेट करना शुरू करें. यह एक्सचेंज ऐप्लिकेशन पर लागू तब ही रहता है, जब अपनी पसंद के सुरक्षित आउट-ऑफ़-बैंड (OOB) सिस्टम का इस्तेमाल करके लागू करें. जैसे, ब्लूटूथ कम ऊर्जा (BLE).

रेंज में बताए गए पैरामीटर इनमें स्थानीय पता, कॉम्प्लेक्स चैनल, और सेशन कुंजी वगैरह शामिल होती हैं. नोट जोड़ें रेंज सेशन के बाद ये पैरामीटर रोटेट हो सकते हैं या बदल सकते हैं खत्म हो जाता है और रेंज को फिर से शुरू करने के लिए इसके बारे में बताना होता है.

बैकग्राउंड रेंज

बैकग्राउंड में चल रहा ऐप्लिकेशन, यूडब्ल्यूबी रेंज का सेशन शुरू कर सकता है, अगर डिवाइस का समर्थन करता है. अपने डिवाइस की क्षमताओं को देखने के लिए, RangingCapabilities पर जाएं.

बैकग्राउंड में चलते समय, ऐप्लिकेशन को अलग-अलग रिपोर्ट नहीं मिलती; ऐप्लिकेशन फ़ोरग्राउंड में जाने पर, रेंज से जुड़ी रिपोर्ट मिलती हैं.

एसटीएस कॉन्फ़िगरेशन

ऐप्लिकेशन या सेवा, स्क्रैंबल किए गए मोड का इस्तेमाल करके हर सेशन के लिए एक सेशन कुंजी सेट करती है टाइमस्टैंप का क्रम (एसटीएस). पहले से मौजूद एसटीएस, स्टैटिक एसटीएस से ज़्यादा सुरक्षित है कॉन्फ़िगरेशन. प्रावधान किया गया एसटीएस, यूडब्ल्यूबी की सुविधा वाले सभी डिवाइसों पर काम करता है Android 14 या इसके बाद का वर्शन होना चाहिए.

खतरे की श्रेणी स्टैटिक एसटीएस पहले से तैयार एसटीएस
एयर: पैसिव ऑब्ज़र्वर कम किया गया कम किया गया
एयर: सिग्नल एंप्लिफ़िकेशन कम किया गया कम किया गया
एयर: रीप्ले/रिले अटैक आसानी से महसूस किया जा सकता है कम किया गया

प्रावधान किए गए एसटीएस के लिए:

  1. RangingParameters में uwbConfigType का इस्तेमाल करें, जो प्रावधान किए गए एसटीएस के साथ काम करता है.

  2. sessionKeyInfo फ़ील्ड में 16-बाइट वाली कुंजी दें.

स्टैटिक एसटीएस के लिए:

  1. RangingParameters में uwbConfigType का इस्तेमाल करें, जो स्टैटिक एसटीएस के साथ काम करता है.

  2. sessionKeyInfo फ़ील्ड में 8-बाइट वाली कुंजी दें.

तरीका

यूडब्ल्यूबी एपीआई का इस्तेमाल करने के लिए, यह तरीका अपनाएं:

  1. पक्का करें कि Android 12 या इसके बाद के वर्शन वाले डिवाइस हों और वे इसकी मदद से यूडब्ल्यूबी को चलाया जा सकता है PackageManager#hasSystemFeature("android.hardware.uwb").
  2. अगर इसकी रेंज IoT डिवाइसों से नहीं है, तो पक्का करें कि वे FiRa MAC 1.3 हों का पालन करना चाहिए.
  3. अपनी पसंद के OOB तरीके का इस्तेमाल करके, मिलते-जुलते ऐप्लिकेशन के ऐसे डिवाइस खोजें जो यूडब्ल्यूबी की सुविधा देते हैं. जैसे कि BluetoothLeScanner.
  4. अपनी पसंद के सुरक्षित OOB तरीके का इस्तेमाल करके, रेंज के पैरामीटर बदलें, जैसे कि BluetoothGatt.
  5. अगर उपयोगकर्ता सेशन को रोकना है, तो सेशन का स्कोप रद्द करें.

उपयोग प्रतिबंध

UWB API के इस्तेमाल पर ये पाबंदियां लागू होती हैं:

  1. नए यूडब्ल्यूबी सेशन शुरू करने वाले ऐप्लिकेशन के लिए, फ़ोरग्राउंड में होना ज़रूरी है ऐप्लिकेशन या सेवा, जब तक बैकग्राउंड रेंज की सुविधा इमेज के हिसाब से न दी गई हो .
  2. जब ऐप्लिकेशन बैकग्राउंड में चला जाता है (जब सेशन चल रहा हो), तो को अब रेंज से जुड़ी रिपोर्ट नहीं मिल सकतीं. हालांकि, यूडब्ल्यूबी सेशन निचली लेयर में बना रहेगा. जब ऐप्लिकेशन, फ़ोरग्राउंड में चलने वाली रिपोर्ट फिर से शुरू हो जाएंगी.

कोड सैंपल

सैंपल ऐप्लिकेशन

यूडब्ल्यूबी जेटपैक लाइब्रेरी को इस्तेमाल करने के तरीके के बारे में पूरी जानकारी पाने के लिए, GitHub पर हमारे सैंपल ऐप्लिकेशन देखें. सैंपल के तौर पर दिए गए इस ऐप्लिकेशन में, Android डिवाइस पर यूडब्ल्यूबी के साथ काम करने की पुष्टि करने के बारे में बताया गया है. साथ ही, ओओबी सिस्टम का इस्तेमाल करके, खोज करने की प्रोसेस को चालू किया गया है और यूडब्ल्यूबी की सुविधा वाले दो डिवाइसों के बीच यूडब्ल्यूबी सेट अप किया गया है. इस सैंपल में, डिवाइस कंट्रोल और मीडिया शेयर करने के इस्तेमाल के उदाहरण भी दिए गए हैं.

यूडब्ल्यूबी रेंजिंग

यह कोड सैंपल, कंट्रोली के लिए तय की गई यूडब्ल्यूबी रेंज को शुरू और खत्म करता है:

// 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 सहायता

Java के साथ इंटरऑपरेबिलिटी (दूसरे सिस्टम के साथ काम करना) को बढ़ावा देने के लिए, अब 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 टूल यहां दिए गए हैं.

यूडब्ल्यूबी की सुविधा वाले मोबाइल डिवाइस

मार्च 2024 से, ये डिवाइस Android UWB Jetpack लाइब्रेरी के साथ काम करेंगे:

वेंडर डिवाइस का मॉडल
Google Pixel 6 Pro, 7 Pro, 8 Pro, Fold, और टैबलेट
Samsung Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5

तीसरे पक्ष के SDK टूल

अप्रैल 2023 से, ये पार्टनर समाधान, मौजूदा Jetpack लाइब्रेरी.

आम समस्या: MAC पते और स्टैटिक STS वेंडर आईडी फ़ील्ड के लिए बाइट ऑर्डर को उलटा गया

Android 13 और उससे पहले वाले वर्शन पर, Android यूडब्ल्यूबी स्टैक, बाइट को गलत तरीके से उलट देता है ऑर्डर:

  • डिवाइस का MAC पता
  • डेस्टिनेशन मैक पता
  • एसटीएस का स्टैटिक वेंडर आईडी

बाइट ऑर्डर रिवर्सल इसलिए होता है, क्योंकि Android स्टैक इन फ़ील्ड का इस्तेमाल करता है मान के रूप में होता है, न कि सरणियों के रूप में. हम यूसीआई की खास जानकारी को अपडेट करने के लिए, FiRa के साथ मिलकर काम कर रहे हैं (CR-1112) का इस्तेमाल करें.

इस समस्या को 2320XXXX रिलीज़ में GMS Core अपडेट के ज़रिए ठीक कर दिया जाएगा. इसके बाद, Android डिवाइसों का इस्तेमाल करने के लिए, आईओटी वेंडर में बदलाव करने होंगे इन फ़ील्ड के बाइट ऑर्डर को रिवर्स करने से बचने के लिए, लागू करने का तरीका.