Ultra geniş bant (UWB) iletişim

Ultra geniş bant iletişimi, cihazlar arasında tam aralık oluşturmaya (konumu 10 cm'lik doğrulukla ölçme) odaklanan bir radyo teknolojisidir. Bu radyo teknolojisi, kısa menzilli ölçümlerde düşük enerji yoğunluğunu kullanabilir ve radyo spektrumunun büyük bir bölümünde yüksek bant genişliğine sahip sinyaller gerçekleştirebilir. UWB'nin bant genişliği 500 MHz'den fazlaysa (veya% 20 kesirli bant genişliğini aşıyordur).

Denetleyici/Başlatan ile Denetleyici/Katılımcı Karşılaştırması

Ultra Geniş Bant iletişimi, biri Denetleyici, diğeri Denetleyici olmak üzere iki cihaz arasında gerçekleşir. Denetleyici, iki cihazın paylaşacağı karmaşık kanalı (UwbComplexChannel) ve başlatan, Denetleyici ise yanıt veren kanalı belirler.

Bir Denetleyici, birden fazla Denetleyiciyi işleyebilir ancak bir Denetleyici yalnızca bir Denetleyici'ye abone olabilir. Denetleyici/Başlatıcı ve Denetleyici/Yanıtlayıcı yapılandırmaları desteklenir.

Aralık parametreleri

Denetleyici ve Denetleyici, aralığa başlamak için birbirini tanımlamalı ve aralık parametrelerini iletmelidir. Bu değişim, Bluetooth Düşük Enerji (BDE) gibi tercih ettikleri güvenli bant dışı (OOB) mekanizmasını kullanarak uygulanacak uygulamalara bırakılır.

Aralık parametreleri, diğer parametrelerin yanı sıra yerel adres, karmaşık kanal ve oturum anahtarını içerir. Bu parametrelerin, aralık oturumu sona erdikten sonra dönebileceğini veya başka bir şekilde değişebileceğini ve aralığı yeniden başlatmak için tekrar iletişim kurulması gerektiğini unutmayın.

Arka plan aralığı

Arka planda çalışan bir uygulama, cihaz destekliyorsa ultra geniş bant aralık oturumu başlatabilir. Cihazınızın özelliklerini kontrol etmek için RangingCapabilities sayfasına bakın.

Uygulama, arka planda çalışırken aralıklı raporlar almaz. Uygulama, ön plana geçtiğinde aralık 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. Sağlanan STS, statik STS yapılandırmasından daha güvenlidir. Temel hazırlığı yapılmış STS, Android 14 veya sonraki sürümleri çalıştıran ultra geniş bant özellikli tüm cihazlarda desteklenir.

Tehdit kategorisi Statik STS Öngörülen STS
Hava: Pasif gözlemci Azaltılmış Azaltılmış
Hava: Sinyal yükseltme Azaltılmış Azaltılmış
Air: Tekrar oynatma/rötarlı saldırı Duyarlı Azaltılmış

Temel hazırlığı yapılan STS için:

  1. RangingParameters ürününde temel hazırlığı yapılmış STS'yi destekleyen uwbConfigType kullanın.

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

Statik STS için:

  1. RangingParameters içinde statik STS'yi destekleyen uwbConfigType kullanın.

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

Adımlar

UWB API'yi kullanmak için şu adımları uygulayın:

  1. Android cihazların Android 12 veya sonraki bir sürümü çalıştırdığından ve PackageManager#hasSystemFeature("android.hardware.uwb") kullanarak ultra geniş bant desteği olduğundan emin olun.
  2. IoT cihazları için farklı aralıklar sunuyorsanız cihazların FiRa MAC 1.3 ile uyumlu olduğundan emin olun.
  3. BluetoothLeScanner gibi seçtiğiniz bir OOB mekanizmasını kullanarak ultra geniş bant özellikli eş cihazları keşfedin.
  4. BluetoothGatt gibi güvenli bir OOB mekanizması kullanarak aralık parametrelerini değiştirme.
  5. Kullanıcı oturumu durdurmak isterse oturumun kapsamını iptal edin.

Kullanım kısıtlamaları

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

  1. Arka plan aralığı daha önce gösterildiği gibi desteklenmediği sürece yeni ultra geniş bant aralığı oturumları başlatan uygulama ön plan uygulama veya hizmet olmalıdır.
  2. Uygulama arka plana geçtiğinde (oturum devam ederken) uygulama artık aralık raporları almayabilir. Ancak ultra geniş bant oturumu alt katmanlarda korunmaya devam eder. Uygulama tekrar ön plana alındığında, aralık raporları devam ettirilir.

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 uygulama; Android cihazlarda ultra geniş bant uyumluluğunu doğrulama, OOB mekanizması kullanarak keşif sürecini etkinleştirme ve ultra geniş bant uyumlu iki cihaz arasında ultra geniş bant ayarlama konularını kapsar. Örnekte, cihaz kontrolü ve medya paylaşımı kullanım alanları da ele alınmaktadır.

Ultra Geniş Bant Aralığı

Bu kod örneği, bir Denetleyici için ultra geniş bant aralığını 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 sağlamak için artık Rxjava3 desteği kullanıma sunulmuştur. Bu kitaplık, gözlemlenebilir veya akış olarak akış şeklinde değişen sonuçlar almak ve UwbClientSessionScope öğesini Tek bir nesne olarak almak için bir yol sunar.

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

Mart 2024 itibarıyla şu cihazlar Android UWB Jetpack kitaplığını desteklemektedir:

Satıcı Cihaz Modeli
Google Pixel 6 Pro, 7 Pro, 8 Pro, Fold, Tablet
Samsung Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5

Üçüncü taraf SDK'lar

Nisan 2023 itibarıyla bu iş ortağı çözümleri mevcut Jetpack kitaplığıyla uyumludur.

Bilinen sorun: MAC adresi ve statik STS tedarikçi firma kimliği alanları için bayt sırası tersine döndürüldü

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

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

Bayt sırasının tersine, Android yığınının bu alanları dizi olarak değil, değer olarak değerlendirmesinden kaynaklanır. UCI spesifikasyonunu (CR-1112), bu alanların dizi olarak değerlendirilmesi gerektiğini açıkça belirtecek şekilde güncellemek için FiRa ile birlikte çalışıyoruz.

Bu sorun, 2320XXXX sürümündeki GMS Core güncellemesiyle düzeltilecektir. Bu noktadan itibaren Android cihazlarla uyumlu olması için IoT tedarikçi firmalarının, bu alanların bayt sıralamasını tersine çevirmeyecek şekilde uygulamanızı değiştirmeleri gerekir.