在 Android 中构建 iBeacon 广告时出现问题

Problem constructing an iBeacon advertisment in Android

我正在尝试使用 BluetoothLeAdvertiser 模拟 iBeacon。 我设法毫无困难地扫描并找到了 iBeacon,但是当我自己创建 iBeacon 时,发出的广告数据似乎是错误的。

我发现的信标具有以下格式: 字节 0 值:0x02 数据长度——2 个字节 字节 1 值:0x01 数据类型——标志 字节 2 值:0x06 LE 和 BR/EDR 标志 字节 3 值:0x1a 数据长度——26 字节 字节 4 值:0xff 数据类型 - 制造商特定数据 字节 5 值:0x4c 制造商数据 字节 6 值:0x00 制造商数据 ..等

我试图通过构造一个数组并复制上面的值来构造类似的广告数据来模拟使用 AdvertiseData.Builder.addManufacturerData 的 iBeacon。但是,当我发送广告数据时,在开头添加了额外的字节: 0x1a 0xff 0x4c 0x00

我注意到额外字节数及其值会根据我设置广告设置数据的方式而变化。例如, AdvertiseData.Builder.setConnectable(真);在我的广告数据的开头添加另外 3 个字节(在 BluetoothAdapter.LeScanCallback 中检测到)。

有没有办法绝对控制广告商发送的数据?我检查了 https://github.com/AltBeacon/android-beacon-library/blob/master/src/main/java/org/altbeacon/beacon/BeaconTransmitter.java,但据我所知,这或多或少是在做我正在做的事情。 在 Android 9.0

上使用蓝牙 5

Android BLE 广告 API 无法让您完全控制传输的数据包。 一个 "manufacturer advertisement" 帧以长度字节开始,然后是 0xff 到表示它是制造商类型,后面是两个字节的制造商代码。

因此,当您看到 0x1a 0xff 0x4c 0x00 时,您只能部分控制这些字节。 0xff 是根据您发送的广告类型固定的。 0x1a 是你的数据包的长度(你可以根据你放入广告的字节数来部分控制)和 0x4c 0x00 你可以通过设置制造商代码来控制。

剩余的字节是您的有效负载,您可以完全控制它们,直到达到有限的数据包大小。长度之前的任何后续字节(在您的情况下为 0x1a)都是标志 headers,并且 Android 让您无法控制这些。