首页 > 解决方案 > 不一致的 Android BLE 广告

问题描述

我正在尝试在 Android 上通过蓝牙广播数据。它可以在一台设备上运行(Android 6.0.1、Galaxy Samsung Note 4),但不能在另一台设备上运行(Android 10(Oxygen 10.0.3.GM21AA ?)、OnePlus 7 Pro)。我正在查看 BLE Scanner 以了解实际宣传的内容。请参阅addServiceData中间的三行 - 请注意,我一次只使用一个。另请注意,LANCOPY_SERVICE 和 ID 是(16 字节)UUID。

        BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
        advertiser.startAdvertising(new AdvertiseSettings.Builder()
                        .setConnectable(true)
                        .setTimeout(0)
                        .setTxPowerLevel((int) dataOwner.options.getOrDefault("BleAdvertiser.TX_POWER(0-3)", 3))
                        .setAdvertiseMode(0)
                        .build(),
                new AdvertiseData.Builder()
                        // On 6.0.1, yields 2+2 byte field.  On 10, yields 16+2 byte field.
                        .addServiceData(new ParcelUuid(DataOwner.LANCOPY_SERVICE), new byte[]{-1,-2})
                        // On 6.0.1, yields 2+3 byte field.  On 10, field is absent.
                        .addServiceData(new ParcelUuid(DataOwner.LANCOPY_SERVICE), new byte[]{-1,-2,-3})
                        // On 6.0.1, yields 16+2 byte field.  On 10, advertisement fails (error code 1: data too big).
                        .addServiceData(new ParcelUuid(DataOwner.LANCOPY_SERVICE), MeUtils.asBytes(dataOwner.ID))
                        .setIncludeDeviceName(false)
                        .setIncludeTxPowerLevel(false)
                        .build(),
                new AdvertiseCallback() {
                    @Override
                    public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                        super.onStartSuccess(settingsInEffect);
                        Log.d(TAG, "onStartSuccess " + settingsInEffect);
                    }

                    @Override
                    public void onStartFailure(int errorCode) {
                        super.onStartFailure(errorCode);
                        Log.d(TAG, "onStartFailure " + errorCode);
                    }
                });

为什么这些调用在不同的设备上表现不同?这是一个错误,还是晦涩的行为?理想情况下,我希望能够在尽可能广泛的 Android 版本上广播完整的 ID 和尽可能多的 SERVICE id。

作为一个可能单独的问题,当我进行任何类型的过滤时,我还无法让应用程序的不同部分发现广告 - 过滤服务 uuid,过滤服务 uuid 更改为匹配正常的 BT uuid ,按服务数据过滤....当我不过滤时,应用程序会出现,但似乎我应该能够进行预过滤。(顺便说一句,我正在使用 BLESSED 进行扫描。)

标签: androidbluetooth-lowenergy

解决方案


推荐阅读