Сверхширокополосная (СШП) связь

Сверхширокополосная связь — это радиотехнология, ориентированная на точное определение местоположения (измерение местоположения с точностью до 10 см) между устройствами. Эта радиотехнология может использовать низкую плотность энергии для измерений на малых расстояниях и осуществлять передачу сигналов с высокой пропускной способностью в большой части радиоспектра. Полоса пропускания СШП превышает 500 МГц (или превышает 20% дробной полосы пропускания).

Контроллер/Инициатор против Контролируемого/Отвечающего

СШП-связь происходит между двумя устройствами, одно из которых является Контроллером, а другое — Контролируемым. Контроллер определяет сложный канал ( UwbComplexChannel ), который будут совместно использовать два устройства, и является инициатором, а Контролируемый — ответчиком.

Контроллер может обслуживать нескольких Контролеров, но Контролер может подписаться только на одного Контроллера. Поддерживаются конфигурации «контроллер/инициатор» и «контролируемый/ответчик».

Параметры ранжирования

Контролеру и Контролируемому необходимо идентифицировать друг друга и сообщить параметры дальности, чтобы начать дальность. Этот обмен предоставляется приложениям для реализации с использованием безопасного внеполосного механизма (OOB) по их выбору, такого как Bluetooth Low Energy (BLE).

Параметры ранжирования включают, среди прочего, локальный адрес, комплексный канал и сеансовый ключ. Обратите внимание, что эти параметры могут меняться или иным образом изменяться после завершения сеанса измерения диапазона, и их необходимо повторно передать для перезапуска диапазона.

Фоновый диапазон

Приложение, работающее в фоновом режиме, может начать сеанс измерения диапазона UWB, если устройство его поддерживает. Чтобы проверить возможности вашего устройства, см. RangingCapabilities .

Приложение не получает отчеты о диапазоне при работе в фоновом режиме; приложение получает отчеты о дальности, когда оно переходит на передний план.

Конфигурации СТС

Приложение или служба предоставляет сеансовый ключ для каждого сеанса, используя зашифрованную последовательность меток времени (STS). Подготовленная STS более безопасна, чем статическая конфигурация STS. Предоставленный STS поддерживается на всех устройствах с поддержкой UWB под управлением Android 14 или более поздней версии.

Категория угрозы Статический СТС Предоставленная СТС
Воздух: Пассивный наблюдатель Смягченный Смягченный
Воздух: усиление сигнала Смягченный Смягченный
Воздух: повтор/эстафетная атака Восприимчивый Смягченный

Для подготовленной STS:

  1. Используйте uwbConfigType в RangingParameters , который поддерживает подготовленную STS.

  2. Укажите 16-байтовый ключ в поле sessionKeyInfo .

Для статического STS:

  1. Используйте uwbConfigType в RangingParameters , который поддерживает статический STS.

  2. Укажите 8-байтовый ключ в поле sessionKeyInfo .

Шаги

Чтобы использовать UWB API, выполните следующие действия:

  1. Убедитесь, что устройства Android работают под управлением Android 12 или более поздней версии и поддерживают UWB, используя PackageManager#hasSystemFeature("android.hardware.uwb") .
  2. При выборе устройств IoT убедитесь, что они совместимы с FiRa MAC 1.3.
  3. Обнаруживайте одноранговые устройства с поддержкой UWB, используя выбранный вами механизм OOB, например BluetoothLeScanner .
  4. Обменивайтесь параметрами дальности с помощью безопасного механизма OOB по вашему выбору, например BluetoothGatt .
  5. Если пользователь хочет остановить сеанс, отмените область сеанса.

Ограничения использования

К использованию UWB API применяются следующие ограничения:

  1. Приложение, инициирующее новые сеансы ранжирования UWB, должно быть приложением или службой переднего плана, если только фоновое ранжирование не поддерживается, как показано ранее.
  2. Когда приложение переходит в фоновый режим (во время сеанса), приложение больше не может получать отчеты о диапазоне. Однако сеанс UWB будет продолжать поддерживаться на нижних уровнях. Когда приложение вернется на передний план, отчеты о ранжировании возобновятся.

Примеры кода

Пример приложения

Комплексный пример использования библиотеки UWB Jetpack можно найти в нашем примере приложения на Github . В этом примере приложения рассматривается проверка совместимости UWB на устройстве Android, включение процесса обнаружения с использованием механизма OOB и настройка диапазона 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, которая помогает обеспечить совместимость с клиентами 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

По состоянию на март 2024 г. эти устройства поддерживают библиотеку Android UWB Jetpack:

Продавец Модель устройства
Google Pixel 6 Pro, 7 Pro, 8 Pro, складной, планшет
Samsung Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5

Сторонние SDK

По состоянию на апрель 2023 года эти партнёрские решения совместимы с текущей библиотекой Jetpack .

Известная проблема: обратный порядок байтов для полей MAC-адреса и статического идентификатора поставщика STS.

В Android 13 и более ранних версиях стек Android UWB неправильно меняет порядок байтов для следующих полей:

  • MAC-адрес устройства
  • MAC-адрес назначения
  • Статический идентификатор поставщика STS

Изменение порядка байтов происходит потому, что стек Android рассматривает эти поля как значения, а не как массивы. Мы работаем с FiRa над обновлением спецификации UCI ( CR-1112 ), чтобы явно указать, что эти поля следует рассматривать как массивы.

Эта проблема будет исправлена ​​в обновлении GMS Core версии 2320XXXX . Чтобы с этого момента обеспечить совместимость с устройствами Android, поставщикам Интернета вещей необходимо изменить вашу реализацию, чтобы избежать изменения порядка байтов в этих полях.