安卓手机APP开发__超宽带(UWB)通信

安卓手机APP开发__超宽带(UWB)通信

目录

概述

控制方/发起方与控制方/响应方

参数范围

后台测距

[STS 配置](#STS 配置)

步骤

使用限制

代码示例

示例应用

[UWB 范围](#UWB 范围)

[RxJava3 支持](#RxJava3 支持)

生态系统支持

[支持 UWB 的移动设备](#支持 UWB 的移动设备)

[第三方 SDK](#第三方 SDK)


概述

注意 :UWB 目前仅支持 Jetpack。

超宽带通信是一种无线技术,侧重于设备间的精确测距(将位置测量精确到 10 厘米)。

这种无线电技术可以使用低功率密度进行短距离测量,并在很大一部分无线电频谱

上执行高带宽信号。UWB 的带宽大于 500 MHz(或超过带宽的 20%)。

控制方/发起方与控制方/响应方

UWB 通信发生在两个设备之间,一个设备是控制器,另一个是受控设备。控制器会

确定两台设备将共享的复杂频道 (UwbComplexChannel),并且是发起方,而受控方

是响应方。

一个控制器可以处理多个控制方,但一个控制方只能订阅一个控制器。控制器/发起

方配置和控制方/响应方配置均受支持。

参数范围

控制器和被控制者需要相互识别并传达测距参数,以开始测距。这种交换交由应用

使用他们选择的安全带外 (OOB) 机制来实现,例如蓝牙低功耗 (BLE)。

范围参数包括本地地址、复杂渠道和会话密钥等等。请注意,在测距会话结束后,

这些参数可能会旋转或以其他方式发生变化,并且需要重新通信以重启测距。

后台测距

如果设备支持,在后台运行的应用可以启动 UWB 测距会话。如需查看设备功能,

请参阅 RangingCapabilities。

应用在后台运行时不会收到测距报告;当应用进入前台时会收到测距报告。

STS 配置

应用或服务使用加扰时间戳序列 (STS) 为每个会话预配会话密钥。预配的 STS

比静态 STS 配置更安全。所有搭载 Android 14 或更高版本且支持 UWB 的设备

都支持预配的 STS。

威胁类别 静态 STS 预配的 STS

空气:被动观测器 已缓解 已缓解

空气:信号放大 已缓解 已缓解

Air:重放/中继攻击 易受感染 已缓解

对于预配的 STS:

在支持所配置的 STS 的 RangingParameters 中使用 uwbConfigType。

在 sessionKeyInfo 字段中提供 16 字节的密钥。

对于静态 STS:

在支持静态 STS 的 RangingParameters 中使用 uwbConfigType。

在 sessionKeyInfo 字段中提供 8 字节的密钥。

步骤

如需使用 UWB API,请按以下步骤操作:

确保 Android 设备搭载的是 Android 12 或更高版本,并使用

PackageManager#hasSystemFeature("android.hardware.uwb") 支持 UWB。

如果要针对 IoT 设备测距,请确保这些设备符合 FiRa MAC 1.3 标准。

使用您选择的 OOB 机制(例如 BluetoothLeScanner)发现支持 UWB 的对等设备。

使用您选择的安全 OOB 机制(例如 BluetoothGatt)交换测距参数。

如果用户想要停止会话,请取消会话的范围。

使用限制

UWB API 的使用存在以下限制:

启动新的 UWB 测距会话的应用必须是前台应用或服务,除非支持后台测距(如前所述)。

当应用转到后台(当会话正在进行时)时,应用可能不会再接收测距报告。

不过,UWB 会话将继续在较低层级维护。当应用返回前台时,测距报告将恢复。

代码示例

示例应用

如需查看有关如何使用 UWB Jetpack 库的端到端示例,请参阅 GitHub 上的示

例应用。此示例应用介绍了如何验证 Android 设备上的 UWB 兼容性、使用

OOB 机制启用发现流程,以及如何在两台支持 UWB 的设备之间设置 UWB

范围。该示例还介绍了设备控制和媒体共享用例。

UWB 范围

以下代码示例可启动和终止受控方的 UWB 测距:

Kotlin 复制代码
// 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 客户端的互操作性。此库提供了

一种方法来获取可观察或可流形式的测距结果,以及将 UwbClientSessionScope

检索为单个对象。

Kotlin 复制代码
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 年 3 月,这些设备支持 Android UWB Jetpack 库:

供应商 设备型号

Google Pixel 6 Pro、7 Pro、8 Pro、 Fold、平板电脑

三星 Galaxy Note 20、S21+、S22+、S23+、S24+ Z Fold 2、3、4、5

第三方 SDK

截至 2023 年 4 月,这些合作伙伴解决方案与当前的 Jetpack 库兼容。

Estimote UWB 开发套件。

移动知识 MK UWB Kit 移动版本 2.0。

已知问题:MAC 地址和静态 STS 供应商 ID 字段的字节顺序颠倒

在 Android 13 及更低版本中,Android UWB 堆栈错误地反转以下字段的字节顺序:

设备 MAC 地址

目标 MAC 地址

静态 STS 供应商 ID

之所以发生字节顺序逆转,是因为 Android 堆栈将这些字段视为值,而不是数组。

我们正在与 FiRa 合作更新 UCI 规范 (CR-1112),以明确声明这些字段应被视为数组。

此问题将通过 2320XXXX 版本中的 GMS Core 更新来修复。从那时起,为了与

Android 设备兼容,IoT 供应商需要修改您的实现,以免反转这些字段的字节顺序。

相关推荐
没有了遇见19 分钟前
Android 通过 SO 库安全存储敏感数据,解决接口劫持问题
android
hsx66620 分钟前
使用一个 RecyclerView 构建复杂多类型布局
android
hsx66621 分钟前
利用 onMeasure、onLayout、onDraw 创建自定义 View
android
守城小轩23 分钟前
Chromium 136 编译指南 - Android 篇:开发工具安装(三)
android·数据库·redis
island13141 小时前
节点小宝:手机图片备份至电脑功能实测体验
智能手机
whysqwhw1 小时前
OkHttp平台抽象机制分析
android
hsx6662 小时前
Android 内存泄漏避坑
android
whysqwhw2 小时前
OkHttp之okhttp-bom模块的分析
android
餐桌上的王子2 小时前
Android 构建可管理生命周期的应用(二)
android
幽你一默3 小时前
Android 版本差异速查表(开发者视角)
android