我使用以下代码通过Bluetooth Low Energy广告Android设备:
private void advertise() {
BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setConnectable(false)
.build();
ParcelUuid pUuid = new ParcelUuid(UUID.fromString(getString(R.string.ble_uuid)));
byte[] messageToSend = "Data".getBytes(Charset.forName("UTF-8"));
AdvertiseData data = new AdvertiseData.Builder()
.addServiceUuid(pUuid)
.addServiceData(pUuid, messageToSend)
.build();
AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
Log.d("Successful", "start");
super.onStartSuccess(settingsInEffect);
}
@Override
public void onStartFailure(int errorCode) {
Log.e("BLE", "Advertising onStartFailure: " + errorCode);
super.onStartFailure(errorCode);
}
};
advertiser.startAdvertising(settings, data, advertisingCallback);
}
计划如下:向附近的每个BLE兼容设备发送消息(在这种情况下为"数据" ),并通过广告打开蓝牙。我已对其进行了测试,另一台设备已在AdvertiseData
对象中成功收到" Data" 字符串。但是我知道这种方法存在局限性(也许我在接下来的任何一点都错了,请随意纠正我;)):
AdvertiseData
对象)最多可为32个字节如果我理解了最后一点,那就意味着我可以用一个AdvertiseData
对象发送由UTF-8编码的20个ASCII字符(我希望这种情况类似于{{3}的答案) }发送超过20个字节的问题)。但是,目前我最多可以发送9个ASCII字符 - 如果我想再发送一个,则回调的onStartFailure()
方法将返回errorCode
1 {ADVERTISE_FAILED_DATA_TOO_LARGE
根据{ {3}})。当然这个限制'当我使用非ASCII字符(例如重音字符 - é
,ű
等)时,它会更小......
我的方法可能不是最好的,因为我在网上发现了不同的例子来发送广告数据......所以也许我正在用一些构建AdvertiseData
对象占用数据空闲空间的不必要对象。所以基本上我想知道:
AdvertiseData
对象的大小是多少字节?你可以帮助我进行实验吗? :d
我的AdvertiseData对象如下所示:
AdvertiseData
[mServiceUuids=
[bdc7950d-731f-4d4d-8e47-c090502dbd63],
mManufacturerSpecificData={},
mServiceData=
{bdc7950d-731f-4d4d-8e47-c090502dbd63=[68, 97, 116, 97]},
mIncludeTxPowerLevel=false,
mIncludeDeviceName=false]