蓝牙能告诉你设备“大概在附近”,超宽带(UWB)却能告诉你它就在42厘米外、偏右18度——直到拿设备的人转身,方向信息消失。这个差距,正是Codename One最新版本想解决的痛点。

Codename One是一个开源框架,开发者可以用一套Java或Kotlin代码库,构建原生iOS、Android、桌面和Web应用。本周的更新中,PR #5589通过com.codename1.nearby下的三个包,把近距离设备交互的边界能力暴露给了开发者。

打开网易新闻 查看精彩图片

三个包,回答三个不同的问题

这套API按能力拆分为三个独立包:测距(Ranging)、伴随设备(CompanionDevices)和本地传输(NearbyTransport)。引用哪个包,就代表你选择启用哪项能力。只导入测距包的应用,不会获得本地连接、多点连接、本地网络提示或配套配置文件权限——构建时会扫描字节码,只包含所引用包需要的框架。

官方建议用能力查询代替平台判断:

  • Ranging.isSupported()——判断是否支持精确查找
  • CompanionDevices.isSupported()——判断是否支持设备关联
  • NearbyTransport.isSupported()——判断是否支持本地对等传输

很多当前手机没有UWB硬件,测距不可用时,应用仍然需要给出有用的状态提示。

测距从交换令牌开始

UWB测量的是无线电飞行时间,实际目标精度大约在十厘米级别。相比之下,蓝牙信号强度估算在手掌遮挡手机时,误差可能摆动数米。但UWB本身不能发现或识别对端设备。

两台设备需要先通过已有通道交换测距令牌,蓝牙低功耗(BLE)的GATT特征值是常见选择。拿到对方令牌后,测距会话才能启动。代码示例中,控制器角色先准备会话,通过蓝牙特征写入本地令牌,然后监听测距更新——距离以厘米显示,方向用箭头角度呈现。

值得注意的是,RangingUpdate的每个字段除了时间戳都是可选的。对端在手机背后时,可能只报告距离而没有方向;在无线电边缘,两者都可能暂时消失。开发者需要独立检查hasDistance()和hasDirection()。

方位角依赖平台实现:零度表示正前方,正值表示右侧。Android报告的范围是-90到90度,仅凭方位角无法区分设备在前还是在后;iOS则返回方向向量。

这套API的设计思路很清晰:把平台差异封装在能力查询后面,让开发者专注于业务逻辑,而不是为每个操作系统写不同的判断分支。