安卓手机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等静态代码…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...