Android BLE - 如何计算AdvertiseData的大小(整体和按组件)?

时间:2017-05-23 12:47:08

标签: android bluetooth bluetooth-lowenergy

我使用以下代码通过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个字节
  • 从这个结构中,20个字节可用于发送自定义广告数据

如果我理解了最后一点,那就意味着我可以用一个AdvertiseData对象发送由UTF-8编码的20个ASCII字符(我希望这种情况类似于{{3}的答案) }发送超过20个字节的问题)。但是,目前我最多可以发送9个ASCII字符 - 如果我想再发送一个,则回调的onStartFailure()方法将返回errorCode 1 {ADVERTISE_FAILED_DATA_TOO_LARGE根据{ {3}})。当然这个限制'当我使用非ASCII字符(例如重音字符 - éű等)时,它会更小......

我的方法可能不是最好的,因为我在网上发现了不同的例子来发送广告数据......所以也许我正在用一些构建AdvertiseData对象占用数据空闲空间的不必要对象。所以基本上我想知道:

  1. AdvertiseData对象的大小是多少字节?
  2. 这个物体是如何分裂的?在计算过程中我需要考虑哪些部分,它们有多大?
  3. 你可以帮助我进行实验吗? :d

    我的AdvertiseData对象如下所示:

    AdvertiseData 
      [mServiceUuids=
        [bdc7950d-731f-4d4d-8e47-c090502dbd63], 
      mManufacturerSpecificData={}, 
      mServiceData=
        {bdc7950d-731f-4d4d-8e47-c090502dbd63=[68, 97, 116, 97]}, 
      mIncludeTxPowerLevel=false,
      mIncludeDeviceName=false]
    

0 个答案:

没有答案