अल्ट्रा-वाइडबैंड कम्यूनिकेशन, रेडियो टेक्नोलॉजी है. इसका मकसद, डिवाइसों के बीच की दूरी का सटीक पता लगाना है. यह दूरी को 10 सेंटीमीटर तक सटीक तरीके से मेज़र करती है. यह रेडियो टेक्नोलॉजी, कम दूरी के मेज़रमेंट के लिए कम एनर्जी घनत्व का इस्तेमाल कर सकती है और रेडियो स्पेक्ट्रम के बड़े हिस्से पर हाई-बैंडविड्थ सिग्नल दे सकती है. UWB की बैंडविड्थ 500 MHz से ज़्यादा है (या 20% फ़्रैक्शनल बैंडविड्थ से ज़्यादा है).
कंट्रोलर/इनिशिएटर बनाम कंट्रोल किया जाने वाला डिवाइस/रिस्पॉन्स देने वाला डिवाइस
UWB कम्यूनिकेशन, दो डिवाइसों के बीच होता है. इनमें से एक डिवाइस कंट्रोलर होता है और दूसरा डिवाइस कंट्रोल किया जाता है. कंट्रोलर, उस कॉम्प्लेक्स चैनल (UwbComplexChannel
) का पता लगाता है जिसे दोनों डिवाइस शेयर करेंगे. साथ ही, वह शुरू करने वाला होता है, जबकि कंट्रोल किया जाने वाला डिवाइस जवाब देने वाला होता है.
एक कंट्रोलर, कई कंट्रोल किए जाने वाले आइटम को मैनेज कर सकता है. हालांकि, कंट्रोल किए जाने वाला आइटम सिर्फ़ एक कंट्रोलर की सदस्यता ले सकता है. कंट्रोलर/इनिशियेटर और कंट्रोल किए जाने वाले डिवाइस/रिस्पॉन्स देने वाले डिवाइस, दोनों कॉन्फ़िगरेशन काम करते हैं.
रेंजिंग पैरामीटर
रेंजिंग शुरू करने के लिए, कंट्रोलर और कंट्रोल किए जाने वाले डिवाइस को एक-दूसरे की पहचान करनी होगी और रेंजिंग पैरामीटर के बारे में जानकारी देनी होगी. यह एक्सचेंज, ऐप्लिकेशन के लिए छोड़ दिया गया है, ताकि वे अपनी पसंद के सुरक्षित आउट-ऑफ-बैंड (ओओबी) तरीके का इस्तेमाल करके इसे लागू कर सकें. जैसे, ब्लूटूथ स्मार्ट (बीएलई).
रेंजिंग पैरामीटर में, लोकल पता, कॉम्प्लेक्स चैनल, और सेशन कुंजी वगैरह शामिल हैं. ध्यान दें कि रेंजिंग सेशन खत्म होने के बाद, ये पैरामीटर बदल सकते हैं या इनमें बदलाव हो सकता है. साथ ही, रेंजिंग को फिर से शुरू करने के लिए, इनकी जानकारी फिर से भेजनी होगी.
बैकग्राउंड रेंजिंग
अगर डिवाइस पर UWB रेंजिंग की सुविधा काम करती है, तो बैकग्राउंड में चल रहा कोई ऐप्लिकेशन UWB रेंजिंग सेशन शुरू कर सकता है. अपने डिवाइस की सुविधाओं के बारे में जानने के लिए, RangingCapabilities
देखें.
बैकग्राउंड में चलने पर, ऐप्लिकेशन को रेंजिंग रिपोर्ट नहीं मिलतीं. हालांकि, फ़ोरग्राउंड में आने पर, ऐप्लिकेशन को रेंजिंग रिपोर्ट मिलती हैं.
एसटीएस कॉन्फ़िगरेशन
ऐप्लिकेशन या सेवा, हर सेशन के लिए एक सेशन कुंजी उपलब्ध कराती है. इसके लिए, स्क्रैम्बल किए गए टाइमस्टैंप सीक्वेंस (एसटीएस) का इस्तेमाल किया जाता है. प्रोवाइड किया गया एसटीएस, स्टैटिक एसटीएस कॉन्फ़िगरेशन से ज़्यादा सुरक्षित होता है. पहले से सेट किए गए एसटीएस की सुविधा, Android 14 या इसके बाद के वर्शन पर काम करने वाले, UWB की सुविधा वाले सभी डिवाइसों पर काम करती है.
खतरे की कैटगरी | स्टैटिक एसटीएस | पहले से तय किया गया एसटीएस |
---|---|---|
एयर: पैसिव ऑब्ज़र्वर | कम किया गया | कम किया गया |
एयर: सिग्नल एम्प्लफ़िकेशन | कम किया गया | कम किया गया |
एयर: रीप्ले/रिले अटैक | आसानी से प्रभावित होने वाला | कम किया गया |
पहले से सेट किए गए एसटीएस के लिए:
RangingParameters
में उसuwbConfigType
का इस्तेमाल करें जो प्रोवाइड किए गए एसटीएस के साथ काम करता है.sessionKeyInfo
फ़ील्ड में 16-बाइट वाली कुंजी डालें.
स्टैटिक एसटीएस के लिए:
RangingParameters
में उसuwbConfigType
का इस्तेमाल करें जो स्टैटिक एसटीएस के साथ काम करता है.sessionKeyInfo
फ़ील्ड में आठ बाइट वाली कुंजी डालें.
तरीका
UWB API का इस्तेमाल करने के लिए, यह तरीका अपनाएं:
- पक्का करें कि Android डिवाइस, Android 12 या इसके बाद के वर्शन पर काम कर रहे हों. साथ ही, यह भी पक्का करें कि वे
PackageManager#hasSystemFeature("android.hardware.uwb")
का इस्तेमाल करके UWB की सुविधा के साथ काम करते हों. - अगर आपको IoT डिवाइसों के साथ रेंजिंग करनी है, तो पक्का करें कि वे FiRa MAC 1.3 के मुताबिक हों.
- अपनी पसंद के ओओबी (ऑन-ऑन डिवाइस) तरीके का इस्तेमाल करके, UWB की सुविधा वाले पीयर डिवाइसों को ढूंढें. जैसे,
BluetoothLeScanner
. - अपनी पसंद के सुरक्षित ओओबी (ऑनलाइन आउट ऑफ़ बैंड) तरीके का इस्तेमाल करके, रेंजिंग पैरामीटर एक्सचेंज करें. जैसे,
BluetoothGatt
. - अगर उपयोगकर्ता सेशन को रोकना चाहता है, तो सेशन का दायरा रद्द करें.
उपयोग प्रतिबंध
UWB API के इस्तेमाल पर ये पाबंदियां लागू होती हैं:
- UWB रेंजिंग के नए सेशन शुरू करने वाला ऐप्लिकेशन, फ़ोरग्राउंड ऐप्लिकेशन या सेवा होना चाहिए. ऐसा तब तक ज़रूरी है, जब तक बैकग्राउंड रेंजिंग की सुविधा काम नहीं करती.
- सेशन के दौरान, ऐप्लिकेशन के बैकग्राउंड में जाने पर, हो सकता है कि ऐप्लिकेशन को रेंजिंग रिपोर्ट न मिलें. हालांकि, UWB सेशन को निचली लेयर में बनाए रखा जाएगा. जब ऐप्लिकेशन फिर से फ़ोरग्राउंड में चलने लगेगा, तब रेंजिंग रिपोर्ट फिर से शुरू हो जाएंगी.
कोड के सैंपल
सैंपल ऐप्लिकेशन
UWB Jetpack लाइब्रेरी का इस्तेमाल करने का पूरा उदाहरण देखने के लिए, GitHub पर हमारा सैंपल ऐप्लिकेशन देखें. इस सैंपल ऐप्लिकेशन में, Android डिवाइस पर यूडब्ल्यूबी की सुविधा के काम करने की पुष्टि करने, ओओबी (ऑन-ऑब्जेक्ट-ब्लूटूथ) सुविधा का इस्तेमाल करके डिवाइस ढूंढने की प्रोसेस चालू करने, और यूडब्ल्यूबी की सुविधा वाले दो डिवाइसों के बीच यूडब्ल्यूबी रेंजिंग सेट अप करने के बारे में बताया गया है. सैंपल में, डिवाइस कंट्रोल और मीडिया शेयर करने के इस्तेमाल के उदाहरण भी शामिल हैं.
यूडब्ल्यूबी रेंजिंग
यह कोड सैंपल, कंट्रोल किए जा रहे डिवाइस के लिए 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 क्लाइंट के साथ इंटरऑपरेबिलिटी हासिल की जा सके. इस लाइब्रेरी की मदद से, रेंजिंग के नतीजे Observable या Flowable स्ट्रीम के तौर पर पाए जा सकते हैं. साथ ही, 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 की सुविधा वाले मोबाइल डिवाइस
जनवरी 2025 से, ये डिवाइस Android UWB Jetpack लाइब्रेरी के साथ काम करते हैं:
वेंडर | डिवाइस का मॉडल |
---|---|
Pixel Pro (6 Pro और उसके बाद के वर्शन), Fold, और टैबलेट | |
Motorola | Edge 50 Ultra |
Samsung | Galaxy Note 20, Galaxy Plus और Ultra (S21 और उसके बाद के वर्शन), Galaxy Z Fold (Fold2 और उसके बाद के वर्शन) |
ध्यान दें: बैकग्राउंड UWB रेंजिंग की सुविधा, इन डिवाइसों को छोड़कर सभी डिवाइसों पर काम करती है:
- Pixel 6 Pro और Pixel 7 Pro.
- Android 13 या उससे पहले के वर्शन वाले Samsung फ़ोन.
- Android 14 या उससे पहले के वर्शन वाले, चीन में बने Samsung फ़ोन.
तीसरे पक्ष के SDK टूल
अप्रैल 2023 तक, ये पार्टनर समाधान, Jetpack की मौजूदा लाइब्रेरी के साथ काम करते हैं.
- Estimote यूडब्ल्यूबी डेवलपमेंट किट.
- मोबाइल नॉलेज MK UWB Kit Mobile Edition 2.0.
ज्ञात समस्या: MAC पते और स्टैटिक एसटीएस वेंडर आईडी फ़ील्ड के लिए, बाइट का क्रम उलटा है
Android 13 और इससे पहले के वर्शन पर, Android UWB स्टैक इन फ़ील्ड के लिए बाइट के क्रम को गलत तरीके से उलट देता है:
- डिवाइस का MAC पता
- डेस्टिनेशन मैक पता
- स्टैटिक एसटीएस वेंडर आईडी
बाइट ऑर्डर में बदलाव इसलिए होता है, क्योंकि Android स्टैक इन फ़ील्ड को वैल्यू के तौर पर इस्तेमाल करता है, न कि ऐरे के तौर पर. हम FiRa के साथ मिलकर, UCI स्पेसिफ़िकेशन (CR-1112) को अपडेट करने पर काम कर रहे हैं. इससे यह साफ़ तौर पर बताया जा सकेगा कि इन फ़ील्ड को ऐरे के तौर पर माना जाना चाहिए.
2320XXXX
रिलीज़ में, GMS Core के अपडेट की मदद से इस समस्या को ठीक कर दिया जाएगा.
इसके बाद, Android डिवाइसों के साथ काम करने के लिए, IOT वेंडर को आपके लागू किए गए तरीके में बदलाव करना होगा, ताकि इन फ़ील्ड के बाइट के क्रम को उलटने से बचा जा सके.