Ultra geniş bant (UWB) iletişim

Ultra geniş bant iletişimi, cihazlar arasındaki hassas mesafe ölçmeye (konumun 10 cm doğrulukla ölçülmesine) odaklanan bir radyo teknolojisidir. Bu radyo teknolojisi, kısa menzilli ölçümler için düşük enerji yoğunluğu kullanabilir ve radyo aralığının büyük bir kısmı üzerinden yüksek bant genişliğine sahip sinyal gönderebilir. Ultra geniş bantın bant genişliği 500 MHz'ten (veya% 20'lik kesirli bant genişliğini) fazladır.

Denetleyici/Başlatıcı ve Denetlenen/Yanıtlayan

Ultra geniş bant iletişimi, biri denetleyici, diğeri denetlenen iki cihaz arasında gerçekleşir. Denetleyici, iki cihazın paylaşacağı karmaşık kanalı (UwbComplexChannel) belirler ve başlatıcı olur. Denetlenen ise yanıt verendir.

Denetleyici birden fazla Denetlenen'i yönetebilir ancak Denetlenen yalnızca tek bir Denetleyici'ye abone olabilir. Hem Denetleyici/Başlatıcı hem de Denetlenen/Yanıt veren yapılandırmaları desteklenir.

Aralık parametreleri

Aralık belirlemeye başlamak için Denetleyici ve Kontrol Edilen'in birbirlerini tanımlaması ve aralık parametrelerini paylaşması gerekir. Bu değişim, uygulamaların Bluetooth Düşük Enerji (BDE) gibi kendi seçtikleri güvenli bir bant dışı (OOB) mekanizmasını kullanarak uygulamalarına bırakılır.

Aralıklı parametreler arasında yerel adres, karmaşık kanal ve oturum anahtarı yer alır. Bu parametrelerin, menzil belirleme oturumu sona erdikten sonra değişebileceğini veya başka bir şekilde değişebileceğini ve menzil belirleme işlemini yeniden başlatmak için yeniden iletişim kurulması gerektiğini unutmayın.

Arka planda menzil belirleme

Arka planda çalışan bir uygulama, cihaz destekliyorsa ultra geniş bant mesafe ölçümü oturumu başlatabilir. Cihazınızın özelliklerini kontrol etmek için RangingCapabilities bölümüne bakın.

Uygulama arka planda çalışırken menzil raporları almaz; ön plana geçtiğinde menzil raporları alır.

STS yapılandırmaları

Uygulama veya hizmet, karmaşık zaman damgası sırası (STS) kullanarak her oturum için bir oturum anahtarı sağlar. Hazır STS, statik STS yapılandırmasından daha güvenlidir. Hazır STS, Android 14 veya sonraki sürümleri çalıştıran tüm ultra geniş bant özellikli cihazlarda desteklenir.

Tehdit kategorisi Statik STS STS'nin ayrılması
Hava: Pasif gözlemci Azaltılmış Azaltılmış
Hava: Sinyal güçlendirme Azaltılmış Azaltılmış
Hava: Tekrarlama/yineleme saldırısı Duyarlı Azaltılmış

Yapılandırılmış STS için:

  1. RangingParameters içinde, ayrılmış STS'yi destekleyen uwbConfigType öğesini kullanın.

  2. 16 baytlık anahtarı sessionKeyInfo alanına girin.

Statik STS için:

  1. Statik STS'yi destekleyen RangingParameters içindeki uwbConfigType öğesini kullanın.

  2. 8 baytlık anahtarı sessionKeyInfo alanına girin.

Adımlar

Ultra geniş bant API'sini kullanmak için aşağıdaki adımları uygulayın:

  1. Android cihazların Android 12 veya sonraki bir sürümde çalıştığından ve PackageManager#hasSystemFeature("android.hardware.uwb") kullanarak ultra geniş bandı desteklediğinden emin olun.
  2. IoT cihazlarına karşı menzil ölçümü yapıyorsanız bu cihazların FiRa MAC 1.3 uyumlu olduğundan emin olun.
  3. BluetoothLeScanner gibi bir harici cihaz mekanizması kullanarak ultra geniş bant özellikli eş cihazları keşfedin.
  4. BluetoothGatt gibi seçtiğiniz güvenli bir OOB mekanizmasını kullanarak menzil parametrelerini değiştirin.
  5. Kullanıcı oturumu durdurmak isterse oturumun kapsamını iptal edin.

Kullanım kısıtlamaları

UWB API'nin kullanımı için aşağıdaki kısıtlamalar geçerlidir:

  1. Daha önce gösterildiği gibi arka planda menzil belirleme desteklenmediği sürece, yeni ultra geniş bant menzil belirleme oturumlarını başlatan uygulama bir ön plan uygulaması veya hizmeti olmalıdır.
  2. Uygulama arka plana geçtiğinde (oturum devam ederken) artık menzil raporları alamaz. Ancak UWB oturumu, alt katmanlarda sürdürülmeye devam eder. Uygulama ön plana geri döndüğünde menzil raporları devam eder.

Kod örnekleri

Örnek uygulama

UWB Jetpack kitaplığının nasıl kullanılacağına dair uçtan uca bir örnek için GitHub'daki örnek uygulamamıza göz atın. Bu örnek uygulamada; Android cihazda ultra geniş bant uyumluluğunun doğrulanması, harici bir mekanizma kullanarak keşif sürecinin etkinleştirilmesi ve iki ultra geniş bant özellikli cihaz arasında ultra geniş bant aralığının ayarlanması ele alınmaktadır. Örnek, cihaz kontrolü ve medya paylaşımı kullanım alanlarını da kapsar.

Ultra geniş bant mesafe ölçme

Bu kod örneği, bir kontrol cihazı için ultra geniş bant menzillendirmeyi başlatır ve sonlandırır:

// 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 desteği

Java istemcileriyle birlikte çalışabilirlik elde etmenize yardımcı olmak için Rxjava3 desteği artık kullanılabilir. Bu kitaplık, menzil belirleme sonuçlarını Observable veya Flowable akış olarak alma ve UwbClientSessionScope'u tek bir nesne olarak alma yöntemi sağlar.

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();

Ekosistem desteği

Desteklenen iş ortağı cihazları ve üçüncü taraf SDK'ları aşağıda verilmiştir.

Ultra geniş bant özellikli mobil cihazlar

Ocak 2025'ten itibaren aşağıdaki cihazlar Android ultra geniş bant Jetpack kitaplığını destekler:

Satıcı Cihaz Modeli
Google Pixel Pro (6 Pro ve sonraki modeller), Fold, Tablet
Motorola Edge 50 Ultra
Samsung Galaxy Note 20, Galaxy Plus ve Ultra (S21 ve sonraki modeller), Galaxy Z Fold (Fold2 ve sonraki modeller)

Not: Arka planda ultra geniş bant mesafe ölçme özelliği aşağıdakiler hariç tüm cihazlarda desteklenir:

  • Pixel 6 Pro ve Pixel 7 Pro.
  • Android 13 veya önceki sürümleri çalıştıran Samsung telefonlar
  • Android 14 veya önceki sürümleri çalıştıran Çin'de satılan Samsung telefonlar

Üçüncü taraf SDK'ları

Bu iş ortağı çözümleri, Nisan 2023'ten itibaren mevcut Jetpack kitaplığı ile uyumludur.

Bilinen sorun: MAC adresi ve statik STS tedarikçi kimliği alanları için bayt sırası tersine çevrildi

Android 13 ve önceki sürümlerde Android ultra geniş bant yığını, aşağıdaki alanların bayt sırasını yanlış bir şekilde tersine çevirir:

  • Cihaz MAC adresi
  • Hedef MAC adresi
  • Statik STS tedarikçi firma kimliği

Android yığını bu alanları diziler olarak değil, değerler olarak ele aldığından bayt sırası tersine çevrilir. Bu alanların dizi olarak ele alınması gerektiğini açıkça belirtmek için UCI spesifikasyonunu (CR-1112) güncellemek üzere FiRa ile birlikte çalışıyoruz.

Bu sorun, 2320XXXX sürümündeki GMS Core güncellemesiyle düzeltilecektir. Bu tarihten itibaren Android cihazlarla uyumlu olmak için IOT tedarikçi firmalarının, bu alanların bayt sıralamasının tersine çevrilmesini önlemek amacıyla uygulamanızı değiştirmesi gerekir.