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

Giao tiếp băng tần siêu rộng là một công nghệ vô tuyến tập trung vào việc đo khoảng cách 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 để đo tầm ngắn và thực hiện tín hiệu băng thông cao trên phần lớn phổ tần số vô tuyến. Băng thông của UWB lớn hơn 500 MHz (hoặc vượt quá 20% băng thông phân đoạn).

Bộ điều khiển/Trình khởi tạo so với Bộ điều khiển/Trình phản hồi

Giao tiếp UWB diễn ra giữa hai thiết bị, trong đó một thiết bị là Thiết bị điều khiển và thiết bị còn lại là Thiết bị được điều khiển. Bộ điều khiển xác định kênh phức tạp (UwbComplexChannel) mà hai thiết bị sẽ chia sẻ và là phương thức khởi tạo, trong khi Bộ điều khiển là phương thức phản hồi.

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

Tham số đo khoảng cách

Bộ điều khiển và Bộ điều khiển cần xác định lẫn nhau và giao tiếp các tham số phạm vi để bắt đầu phạm vi. Việc trao đổi này được để cho các ứng dụng triển khai bằng cách sử dụng cơ chế ngoài băng tần (OOB) bảo mật mà họ chọn, chẳng hạn như Bluetooth năng lượng thấp (BLE).

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

Đo khoảng cách trong nền

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

Ứng dụng không nhận được báo cáo đo khoảng cách khi chạy ở chế độ nền; ứng dụng nhận được báo cáo đo khoảng cách khi chuyển sang chế độ 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 Trình tự dấu thời gian bị xáo trộn (STS). STS được cấp phép an toàn hơn so với cấu hình STS tĩnh. STS được cấp phép được hỗ trợ trên tất cả thiết bị hỗ trợ UWB chạy Android 14 trở lên.

Danh mục mối đe doạ STS tĩnh STS đã được cấp phép
Không khí: Người quan sát thụ động Đã giảm thiểu Đã giảm thiểu
Không khí: Khuếch đại tín hiệu Đã giảm thiểu Đã giảm thiểu
Không khí: Tấn công phát lại/chuyển tiếp Nhạy cảm Đã giảm thiểu

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

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

  2. Cung cấp khoá 16 byte trong 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 trong 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 thiết bị Android đang chạy Android 12 trở lên và hỗ trợ UWB bằng cách sử dụng PackageManager#hasSystemFeature("android.hardware.uwb").
  2. Nếu đo khoảng cách với các thiết bị IoT, hãy đảm bảo rằng các thiết bị đó tuân thủ FiRa MAC 1.3.
  3. Khám phá các thiết bị ngang hàng có khả năng UWB bằng cách sử dụng cơ chế OOB mà bạn chọn, chẳng hạn như BluetoothLeScanner.
  4. Trao đổi các tham số đo khoảng cách bằng cách sử dụng cơ chế OOB an toàn 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

Các hạn chế sau đây áp dụng cho việc sử dụng API UWB:

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

Mã mẫu

Ứng dụng mẫu

Để biết ví dụ toàn diện 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 với UWB trên thiết bị Android, bật quy trình khám phá bằng cơ chế OOB và thiết lập phạm vi UWB giữa hai thiết bị có khả năng UWB. Mẫu này cũng bao gồm 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.

Đo khoảng cách UWB

Mã mẫu này khởi tạo và kết thúc phạm vi UWB cho một thiết bị được điều khiển:

// 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 ứng dụng Java. Thư viện này cung cấp cách để nhận kết quả đo khoảng cách dưới dạng luồng Observable hoặc Flowable, cũng như để 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

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

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

Kể từ tháng 1 năm 2025, các thiết bị sau đây sẽ hỗ trợ thư viện Android UWB Jetpack:

Nhà cung cấp Mẫu thiết bị
Google Pixel Pro (6 pro trở lên), điện thoại gập, máy tính bảng
Motorola Edge 50 Ultra
Samsung Galaxy Note 20, Galaxy Plus và Ultra (S21 trở lên), Galaxy Z Fold (Fold2 trở lên)

Lưu ý: Tính năng đo khoảng cách UWB ở chế độ nền được hỗ trợ trên tất cả các thiết bị, ngoại trừ những thiết bị sau:

  • Pixel 6 Pro và Pixel 7 Pro.
  • Điện thoại Samsung chạy Android 13 trở xuống.
  • Điện thoại Samsung ở Trung Quốc chạy Android 14 trở xuống.

SDK của bên thứ ba

Kể từ tháng 4 năm 2023, các giải pháp của đối tác này sẽ 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 đối với địa chỉ MAC và trường mã nhận dạng nhà cung cấp STS tĩnh

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

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

Việc đảo ngược thứ tự byte xảy ra vì ngăn xếp Android coi các trường này là giá trị chứ không phải mảng. Chúng tôi đang làm việc với FiRa để cập nhật thông số kỹ thuật UCI (CR-1112) để nêu rõ rằng các trường này phải được coi 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. Để tuân thủ các thiết bị Android kể từ thời điểm đó, các nhà cung cấp IOT cần sửa đổi cách triển khai của bạn để tránh đảo ngược thứ tự byte của các trường này.