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:
Sử dụng
uwbConfigType
trongRangingParameters
hỗ trợ STS được cấp phép.Cung cấp khoá 16 byte vào trường
sessionKeyInfo
.
Đối với STS tĩnh:
Sử dụng
uwbConfigType
trongRangingParameters
hỗ trợ STS tĩnh.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:
- Đả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")
. - 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.
- 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
. - 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
. - 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:
- Ứ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 đó.
- 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ị |
---|---|
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.
- Ước tính Bộ phát triển UWB.
- Kiến thức về di động MK UWB Kit Mobile Edition 2.0.
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.