You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android BLE开发:如何设置广播始终使用16-bit UUID?

解决BLE广播UUID始终以16-bit形式呈现的问题

嘿,我来帮你搞定这个BLE广播里UUID格式不稳定的问题!

首先得搞明白为什么会出现“有时16位有时128位”的情况:Android的BLE广播框架会自动识别蓝牙SIG官方分配的标准16位UUID——也就是那些基于基础UUID 0000xxxx-0000-1000-8000-00805F9B34FB 的128位UUID,一旦识别到,就会自动把它压缩成16位形式广播;但如果你的128位UUID不符合这个标准格式,或者创建方式不对,系统就会以完整的128位形式发送。

要让UUID始终以16位形式出现,你需要按以下步骤操作:

1. 确认你的UUID属于标准16位范围

首先要确保你的128位UUID是蓝牙SIG官方分配的,也就是必须符合 0000XXXX-0000-1000-8000-00805F9B34FB 的格式,其中 XXXX 就是对应的16位UUID值。如果你的UUID不是这个格式,那蓝牙规范不允许压缩成16位,只能用128位广播。

2. 正确创建ParcelUuid(关键步骤)

不要直接用任意的128位字符串创建UUID,而是要基于标准基础UUID来构造,这样系统才能识别并压缩它。下面是两种可靠的写法:

方法一:直接使用标准格式的UUID字符串

// 替换XXXX为你的16位UUID值,比如FFE0
UUID standardUuid = UUID.fromString("0000XXXX-0000-1000-8000-00805F9B34FB");
ParcelUuid pUuid = new ParcelUuid(standardUuid);

方法二:通过16位数值动态构造标准UUID

如果你的16位UUID是变量,可以用字符串格式化来生成标准UUID:

int sixteenBitUuid = 0xFFE0; // 替换成你的16位UUID值
UUID standardUuid = UUID.fromString(
    String.format("%04x-0000-1000-8000-00805f9b34fb", sixteenBitUuid)
);
ParcelUuid pUuid = new ParcelUuid(standardUuid);

3. 保持AdvertiseData的构建逻辑不变

你的AdvertiseData构建代码不需要改动,只要传入正确的ParcelUuid,系统就会自动以16位形式广播这个UUID的服务数据:

AdvertiseData aData = new AdvertiseData.Builder()
    .setIncludeDeviceName(true)
    .addServiceData(pUuid, data.getBytes(Charset.forName("UTF-8")))
    .build();

为什么之前的代码会不稳定?

大概率是你之前使用的128位UUID有时候符合标准格式,有时候不符合(或者创建时的字符串格式有细微差别),导致系统有时能识别压缩,有时不能。通过上面的方法强制基于标准基础UUID构造,就能确保每次都以16位形式广播。

内容的提问来源于stack exchange,提问作者Hitesh Pratyush V

火山引擎 最新活动