Android BLE:在广播 iBeacon 数据包时是否可以同时添加服务数据和制造商数据?

问题描述 投票:0回答:2

我目前正在做一个实验,以触发信标检测设备。这是检测到的信标示例,可用于触发该设备。

在我的实验中,我尝试使用 Android BLE 库和 iBeacon 协议来复制上图所示的信标,因为检测设备声称它遵循 iBeacon 协议。首先,我尝试使用 AdvertiseData 对象设置服务 UUID 和服务数据,然后对其进行广告。代码大致如下:

AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();

byte[] experimentData = {0x48, 0x6E, (byte) 0xDD, 0x2A, 0x40, (byte) 0xA6, (byte) 0xF0, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] uuidBytes = {0x10, 0x02}
byte[] advertisingBytes = getAdvertisingBytes();

ParcelUuid parcelUuid = parseUuidFrom(uuidBytes);
dataBuilder.addServiceData(parcelUuid, experimentData);
dataBuilder.addServiceUuid(parcelUuid);
dataBuilder.setIncludeTxPowerLevel(false);
dataBuilder.setIncludeDeviceName(false);
//dataBuilder.addManufacturerData(manufacturerCode, advertisingBytes);

AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
settingsBuilder.setAdvertiseMode(0);
settingsBuilder.setTxPowerLevel(3);
settingsBuilder.setConnectable(false);
bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), null);

我暂时评论了

addManufacturerData()
部分。结果看起来像这样。

现在我修改代码,不再使用 Service UUID 和 Service Data,而是使用

addManufacturerData
来通告数据。代码如下所示:

AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();    
byte[] experimentData = {0x48, 0x6E, (byte) 0xDD, 0x2A, 0x40, (byte) 0xA6, (byte) 0xF0, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] uuidBytes = {0x10, 0x02}
byte[] advertisingBytes = getAdvertisingBytes();

//ParcelUuid parcelUuid = parseUuidFrom(uuidBytes);
//dataBuilder.addServiceData(parcelUuid, experimentData);
//dataBuilder.addServiceUuid(parcelUuid);
//dataBuilder.setIncludeTxPowerLevel(false);
//dataBuilder.setIncludeDeviceName(false);
dataBuilder.addManufacturerData(manufacturerCode, advertisingBytes);

AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
settingsBuilder.setAdvertiseMode(0);
settingsBuilder.setTxPowerLevel(3);
settingsBuilder.setConnectable(false);
bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), null);

结果如下所示。 “Service Data”部分消失了,现在被识别为 iBeacon 数据包:

现在,在第一张图片中,有“服务数据”部分和“信标”部分,所以我认为通过添加服务数据和制造商数据,将显示这两个部分。我取消了所有代码的注释,现在看起来像这样:

AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();    
byte[] experimentData = {0x48, 0x6E, (byte) 0xDD, 0x2A, 0x40, (byte) 0xA6, (byte) 0xF0, 0x07, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] uuidBytes = {0x10, 0x02}
byte[] advertisingBytes = getAdvertisingBytes();

ParcelUuid parcelUuid = parseUuidFrom(uuidBytes);
dataBuilder.addServiceData(parcelUuid, experimentData);
dataBuilder.addServiceUuid(parcelUuid);
dataBuilder.setIncludeTxPowerLevel(false);
dataBuilder.setIncludeDeviceName(false);
dataBuilder.addManufacturerData(manufacturerCode, advertisingBytes);

AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
settingsBuilder.setAdvertiseMode(0);
settingsBuilder.setTxPowerLevel(3);
settingsBuilder.setConnectable(false);
bluetoothLeAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), null);

但是广告包根本不会显示在信标检测应用程序中。也不例外,所以不知道beacon有没有做广告

那么,可以使用 Android BLE 库来复制信标,如第一张图所示(服务数据和信标/制造商数据在一个数据包中)?

android bluetooth bluetooth-lowenergy ibeacon android-ble
2个回答
1
投票

单个广告数据包仅限于大约 23 个数据字节,因此它没有空间容纳示例中大小的制造商数据和服务数据。

尝试在各自的广告中同时做广告。 Android设备支持同时发送多个广告。


0
投票

这部分迟到了,但接受的答案是错误的。它们与数据包有效负载混淆。 广告包最大长度为 37,有效负载最大为 31。

© www.soinside.com 2019 - 2024. All rights reserved.