Giao tiếp băng tần siêu rộng (UWB)

Giao tiếp băng tần siêu rộng là công nghệ vô tuyến tập trung vào phạm vi chính xác (đo vị trí với độ chính xác 10 cm) giữa các thiết bị. Công nghệ vô tuyến này có thể sử dụng mật độ năng lượng thấp cho các phép đo phạm vi ngắn và thực hiện tín hiệu băng thông cao trên phần lớn phổ vô tuyến. Băng thông của UWB lớn hơn 500 MHz (hoặc vượt quá 20% phân số băng thông).

Bộ điều khiển/Người khởi tạo so với Người được kiểm soát/Người phản hồi

Hoạt động giao tiếp UWB diễn ra giữa hai thiết bị, trong đó một thiết bị là Tay điều khiển và một người khác là Người được kiểm soát. Bộ điều khiển xác định kênh phức tạp (UwbComplexChannel) mà hai thiết bị sẽ dùng chung và là người khởi tạo, trong khi Người được kiểm soát là người khởi tạo người trả lời.

Một Đơn vị kiểm soát có thể xử lý nhiều Người được kiểm soát, nhưng Người được kiểm soát chỉ có thể đăng ký cho một Bộ điều khiển duy nhất. Cả đơn vị kiểm soát/Người khởi tạo và Người được kiểm soát/Người phản hồi cấu hình được hỗ trợ.

Thông số khác nhau

Đơn vị kiểm soát và Người được kiểm soát cần nhận dạng lẫn nhau và giao tiếp nhiều tham số khác nhau để bắt đầu thay đổi phạm vi. Quá trình trao đổi này dành cho ứng dụng tới triển khai bằng cách sử dụng cơ chế ngoài băng tần (OOB) an toàn mà họ chọn, chẳng hạn như Bluetooth năng lượng thấp (BLE).

Các thông số phạm vi bao gồm địa chỉ địa phương, kênh phức tạp và khoá phiên, v.v. Ghi chú rằng các thông số này có thể xoay vòng hoặc thay đổi sau phiên hoạt động kết thúc và cần được thông báo để bắt đầu lại phạm vi ngày.

Khoảng cách giữa các nền

Một ứng dụng chạy ở chế độ nền có thể bắt đầu phiên trong khoảng không quảng cáo UWB nếu thiết bị hỗ trợ nó. Để kiểm tra các chức năng của thiết bị, hãy xem RangingCapabilities.

Ứng dụng không nhận được các báo cáo khác nhau khi chạy trong nền; ứng dụng nhận được nhiều báo cáo khi quảng cáo chuyển sang nền trước.

Cấu hình STS

Ứng dụng hoặc dịch vụ cung cấp khoá phiên cho mỗi phiên bằng cách sử dụng Chuỗi dấu thời gian (STS). STS được cấp phép an toàn hơn so với STS tĩnh . STS đã cấp phép được hỗ trợ trên tất cả thiết bị có hỗ trợ UWB (băng tần siêu rộng) đang chạy Android 14 trở lên.

Danh mục mối đe doạ STS tĩnh STS được ghi nhận
Air: Quan sát thụ động Đã giảm thiểu Đã giảm thiểu
Air: Khuếch đại tín hiệu Đã giảm thiểu Đã giảm thiểu
Air: Tấn công phát lại/chuyển tiếp Dễ nhận biết Đã giảm thiểu

Đối với STS được cấp phép:

  1. Sử dụng uwbConfigType trong RangingParameters hỗ trợ STS được cấp phép.

  2. Cung cấp khoá 16 byte vào trường sessionKeyInfo.

Đối với STS tĩnh:

  1. Sử dụng uwbConfigType trong RangingParameters hỗ trợ STS tĩnh.

  2. Cung cấp khoá 8 byte vào trường sessionKeyInfo.

Các bước

Để sử dụng API UWB, hãy làm theo các bước sau:

  1. Đảm bảo các thiết bị Android đang chạy trên Android 12 trở lên và chúng hỗ trợ UWB bằng PackageManager#hasSystemFeature("android.hardware.uwb").
  2. Nếu đấu với các thiết bị IoT, hãy đảm bảo rằng chúng là FiRa MAC 1.3 tuân thủ chính sách.
  3. Khám phá các thiết bị ngang hàng có hỗ trợ UWB thông qua cơ chế OOB tuỳ ý, chẳng hạn như BluetoothLeScanner.
  4. Trao đổi nhiều thông số bằng cơ chế OOB bảo mật mà bạn chọn, chẳng hạn như BluetoothGatt.
  5. Nếu người dùng muốn dừng phiên, hãy huỷ phạm vi của phiên đó.

Giới hạn mức sử dụng

Việc sử dụng API UWB phải tuân theo các quy định hạn chế sau:

  1. Ứng dụng khởi tạo các phiên trong phạm vi UWB mới phải là nền trước ứng dụng hoặc dịch vụ trừ phi hỗ trợ dải nền như hình minh hoạ trước đó.
  2. Khi ứng dụng chuyển sang chạy ở chế độ nền (trong khi phiên đang diễn ra), ứng dụng có thể không nhận được báo cáo dao động nữa. Tuy nhiên, phiên UWB sẽ tiếp tục được duy trì ở các lớp dưới. Khi ứng dụng quay lại nền trước, các báo cáo phạm vi sẽ tiếp tục.

Mã mẫu

Ứng dụng mẫu

Để xem toàn bộ ví dụ về cách sử dụng thư viện Jetpack UWB, hãy xem ứng dụng mẫu của chúng tôi trên GitHub. Ứng dụng mẫu này bao gồm việc xác thực khả năng tương thích UWB trên một thiết bị Android, cho phép quá trình khám phá bằng cơ chế OOB và thiết lập UWB giữa 2 thiết bị hỗ trợ UWB. Mẫu này cũng đề cập đến các trường hợp sử dụng để điều khiển thiết bị và chia sẻ nội dung nghe nhìn.

Phạm vi UWB

Mã mẫu này sẽ bắt đầu và chấm dứt UWB trong phạm vi một Bên được kiểm soát:

// 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()
    }
}

Hỗ trợ RxJava3

Hiện đã có tính năng hỗ trợ Rxjava3 để giúp đạt được khả năng tương tác với Java khách hàng. Thư viện này cung cấp cách thức để nhận được các kết quả khác nhau dưới dạng Có thể quan sát hoặc Luồng có thể chạy và để truy xuất UwbClientSessionScope dưới dạng một đối tượng Đơn.

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

Hỗ trợ hệ sinh thái

Dưới đây là các thiết bị được hỗ trợ của đối tác và các SDK của bên thứ ba.

Thiết bị di động hỗ trợ UWB

Kể từ tháng 3 năm 2024, những thiết bị sau đây hỗ trợ thư viện Android UWB Jetpack:

Nhà cung cấp Mẫu thiết bị
Google Pixel 6 Pro, 7 Pro, 8 Pro, Fold, Máy tính bảng
Samsung Galaxy Note 20, S21+, S22+, S23+, S24+ Z Fold 2, 3, 4, 5

SDK của bên thứ ba

Kể từ tháng 4 năm 2023, các giải pháp dành cho đối tác này tương thích với thư viện Jetpack hiện tại.

Vấn đề đã biết: thứ tự byte bị đảo ngược cho địa chỉ MAC và các trường ID nhà cung cấp STS tĩnh

Trên Android 13 trở xuống, ngăn xếp UWB Android đảo ngược byte không chính xác thứ tự cho các trường sau:

  • Địa chỉ MAC của thiết bị
  • Địa chỉ MAC đích
  • Mã nhà cung cấp STS tĩnh

Đảo ngược thứ tự byte xảy ra vì ngăn xếp Android xử lý các trường này dưới dạng giá trị chứ không phải mảng. Chúng tôi đang hợp tác với FiRa để cập nhật thông số kỹ thuật của UCI (CR-1112) để nêu rõ rằng những trường này nên được xem là mảng.

Vấn đề này sẽ được khắc phục thông qua bản cập nhật GMS Core trong bản phát hành 2320XXXX. Từ thời điểm đó trở đi, để tương thích với thiết bị Android, các nhà cung cấp IOT cần sửa đổi triển khai của bạn để tránh đảo ngược thứ tự byte của các trường này.