安卓手机APP开发__超宽带(UWB)通信
安卓手机APP开发__超宽带(UWB)通信
目录
概述
控制方/发起方与控制方/响应方
参数范围
后台测距
STS 配置
步骤
使用限制
代码示例
示例应用
UWB 范围
RxJava3 支持
生态系统支持
支持 UWB 的移动设备
第三方 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 测距:
// 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
检索为单个对象。
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 供应商需要修改您的实现,以免反转这些字段的字节顺序。
相关文章:
安卓手机APP开发__超宽带(UWB)通信
安卓手机APP开发__超宽带(UWB)通信 目录 概述 控制方/发起方与控制方/响应方 参数范围 后台测距 STS 配置 步骤 使用限制 代码示例 示例应用 UWB 范围 RxJava3 支持 生态系统支持 支持 UWB 的移动设备 第三方 SDK 概述 注意 :UWB 目前仅支持 Jetpac…...
儿童股骨干骨折用儿童悬吊如何进行康复
儿童股骨干骨折后的悬吊康复训练,应根据骨折的具体情况和儿童的年龄来制定个性化的康复计划。悬吊康复训练主要目的是通过减轻骨折部位的压力,促进骨折愈合,同时保持和增强儿童的肌肉力量和关节活动能力。 悬吊康复训练的方法 1.垂直悬吊皮牵…...
vscode plantuml插件安装使用(windows)
1、安装JDK,网址 https://www.oracle.com/java/technologies/,添加系统变量JAVA_HOME 2、安装graphviz,网址 Download | Graphviz, 并添加用户变量GRAPHVIZ_DOT 3、vscode安装插件plantuml 4、新增wsd文件,按照使用…...
Linux内核编译流程3.10
一、内核源代码编译流程 编译环境: cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) Linux内核版本: uname -r 3.10.0-693.el7.x86_64 编译内核源代码版本:linux-4.19.90-all-arch-master cp /boot/config-xxx到内核源代码目录/.configmake menuconfi…...
OSPF多区域组网实验(华为)
思科设备参考:OSPF多区域组网实验(思科) 技术简介 OSPF多区域功能通过划分网络为多个逻辑区域来提高网络的可扩展性和管理性能。每个区域内部运行独立的SPF计算,而区域之间通过区域边界路由器进行路由信息交换。这种划分策略适用…...
解密MySQL二进制日志:深度探究mysqlbinlog工具
欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 解密MySQL二进制日志:深度探究mysqlbinlog工具 前言mysqlbinlog工具概述mysqlbinlog的…...
妙解设计模式之策略模式
目录 策略模式的概念生活中的例子编程中的例子 软件工程中的实际应用数据排序文件压缩支付方式图形绘制 策略模式的概念 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并…...
Linux DHCP server 配置
参考:linux dhcp配置多vlan ip_linux 接口vlan-CSDN博客 配置静态IP地址: 给固定的MAC地址分配指定的IP地址,固定的IP地址不必包含在指定的IP池中,如果包含在IP地址池中,固定的IP地址会从IP地址池中移除 配置方法&…...
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
力扣166题:分数到小数 在本篇文章中,我们将详细解读力扣第166题“分数到小数”。通过学习本篇文章,读者将掌握如何使用多种方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解&am…...
新疆 | 金石商砼效率革命背后的逻辑
走进标杆企业,感受名企力量,探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是新疆砼行业的龙头企业:新疆兵团建工金石商品混凝土有限责任公司(以下简称:新疆金石)。 从年产80万方到120万方&am…...
Dinky MySQLCDC 整库同步到 Doris
资源:flink 1.17.0、dinky 1.0.2、doris-2.0.1-rc04 问题:Cannot deserialize value of type int from String ,detailMessageunknowndatabases ,not a valid int value 2024-05-29 16:52:20.136 ERROR org.apache.doris.flink.…...
基于Qt的网上购物系统的设计与实现
企鹅:2583550535 代码和论文都有 第1章 绪论... 1 1.1 项目背景... 1 1.2 国内外研究现状... 1 1.3 项目开发意义... 3 1.4 报告主要内容... 3 第2章 关键技术介绍... 4 2.1 后端开发技术... 4 2.1.1 C. 4 2.1.2 Qt框架... 4 2.1.3 MySQL数据库... 5 2.2 …...
设计软件有哪些?建模和造型工具篇(4),渲染100邀请码1a12
建模使用到的工具有很多,这次我们接着介绍。 1、PolyBoost PolyBoost是由Digimation公司开发的3ds Max插件,旨在增强软件的多边形建模功能。该插件提供了一系列强大的建模工具,如边缘控制、顶点编辑、面片调整等,使用户能够更加…...
Java基础:面向对象(二)
Java基础:面向对象(二) 文章目录 Java基础:面向对象(二)1. 面向对象编程思想2. 类与对象2.1 类2.1.1 类的定义2.1.2 成员变量2.1.3 局部变量 2.2 对象2.2.1 对象的定义2.2.2 对象的使用2.2.3 对象创建的原理…...
【汽车之家注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
cocos 通过 electron 打包成 exe 文件,实现通信问题
cocos 通过 electron 打包成 exe 文件,实现通信问题 首先,我使用的 cocos 版本是 2.4.12,遇到一个问题,是啥子呢,就是我要把用 cocos 开发出来的项目打包成一个 exe 可执行程序,使用的是 electron …...
python中pow是什么意思
pow()方法返回xy(x的y次方)的值。 语法 以下是math模块pow()方法的语法: import math math.pow( x, y ) 内置的pow()方法 pow(x, y[, z]) 函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效…...
Go语言数据库框架 — Gorm
Go入门之Gorm 框架_go gorm-CSDN博客 https://zhuanlan.zhihu.com/p/677057361 一、简介 Gorm框使用ORM技术,将对象(O)和关系数据库(R)之间的映射(M)抽象出来,开发者通过操作对象的方式操作数据库,不需要直接处理SQL语句,降低了…...
Python库之PyQuery的高级用法深度解析
Python库之PyQuery的高级用法深度解析 引言 PyQuery是一个强大的Python库,它提供了类似于jQuery的语法来解析和操作HTML和XML文档。虽然PyQuery的基本用法已经相当直观,但本文将深入探讨一些高级用法,帮助开发者更高效地处理复杂的HTML文档…...
「架构」单元测试及运用
在参与管理和研发软件项目的过程中,单元测试的实际运用对于确保最终产品的质量至关重要。以下是一些实际运用的案例和说明。 静态测试的实际运用 在TechCorp的电子商务平台项目中,静态测试作为代码质量保证的第一道防线。开发团队在编写代码的同时,使用SonarQube等静态代码…...
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南
ESP32智能硬件开发实战:基于MCP协议的AI语音助手全栈指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 在AIoT(人工智能物联网)…...
从LVGL V7.11到V9.1:我维护中文文档这三年踩过的坑与实战经验
从LVGL V7.11到V9.1:一个中文文档维护者的技术叙事 三年前,当我第一次在嵌入式项目中尝试使用LVGL时,完全没想到这个轻量级图形库会成为我技术生涯中的重要篇章。作为国内最早系统维护LVGL中文文档的开发者之一,这段跨越三个大版本…...
告别手动调参!用大津法(OTSU)实现8路灰度传感器的自适应巡线(附完整C代码)
告别手动调参!用大津法实现8路灰度传感器的智能巡线方案 当你在电赛现场调试机器人巡线时,是否经历过这样的场景:刚在A场地调好的阈值参数,换到B场地就完全失灵;上午还能精准巡线的小车,下午因为光照变化就…...
sinx/x在0到无穷积分的条件收敛性分析与证明
1. 从物理现象到数学问题:为什么研究sinx/x的积分? 我第一次接触sinx/x的积分是在信号处理课程中,这个看似简单的函数在傅里叶变换和频谱分析中扮演着关键角色。工程师们用它来描述理想低通滤波器的频率响应,物理学家则在衍射现象…...
霜儿-汉服-造相Z-Turbo作品集:看看AI能生成多美的汉服少女图
霜儿-汉服-造相Z-Turbo作品集:看看AI能生成多美的汉服少女图 1. 惊艳开篇:AI汉服艺术的魅力 当传统汉服遇上现代AI技术,会碰撞出怎样的火花?霜儿-汉服-造相Z-Turbo给出了令人惊叹的答案。这个基于Xinference部署的文生图模型服务…...
League-Toolkit:3大核心价值的英雄联盟智能辅助工具
League-Toolkit:3大核心价值的英雄联盟智能辅助工具 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit 是一款基于英雄…...
iOSDeviceSupport:解决设备调试兼容性问题的高效管理工具
iOSDeviceSupport:解决设备调试兼容性问题的高效管理工具 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport 问题场景:当新系统遇见旧Xcode "连接失败…...
零域名部署实战:阿里云ECS与宝塔面板的IP直连建站指南
1. 为什么选择IP直连建站? 很多刚接触服务器部署的朋友可能会疑惑:为什么不用域名直接访问网站?其实IP直连建站特别适合以下几种场景。比如你正在开发一个内部测试项目,需要快速让团队成员查看效果;或者你要给客户演示…...
GNU Radio滤波器设计中的实时处理优化与性能权衡策略
GNU Radio滤波器设计中的实时处理优化与性能权衡策略 【免费下载链接】gnuradio GNU Radio – the Free and Open Software Radio Ecosystem 项目地址: https://gitcode.com/gh_mirrors/gn/gnuradio 在数字信号处理领域,滤波器设计始终是核心挑战之一&#x…...
3大场景×5项优化:ComfyUI视频合成VHS_VideoCombine节点全场景应用指南
3大场景5项优化:ComfyUI视频合成VHS_VideoCombine节点全场景应用指南 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 一、基础认知:视频合…...
