BLE在Android Oreo中宣传32位Service-UUID

时间:2017-08-25 13:09:54

标签: android android-ble android-8.0-oreo

我有一个小应用程序只执行BLE广告。 该应用在 Nexus 5x with Android 8.0

上运行

这是启动BLE广告的代码:

            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
                    try {
                        List<Address> addresses = geoCoder
    .getFromLocation(location.getLatitude(), location.getLongitude(), 1);

                        if (addresses.size() > 0) {
                            if (addresses.size() > 0) {
                                 userLocality = addresses.get(0).getLocality();
                                 userCountry = addresses.get(0).getCountryName();

                                locationProvidedTextView.setText("Your address: " + userLocality + ", " + userCountry);

                            }
                        }
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

广告开始,但有效载荷是错误的。在 Pre -Android 8.0设备上,当使用第二台设备扫描此消息时,我们会收到正确的service-uuid:

private fun startAdvertising() {
    val serviceUuid = ParcelUuid.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB")

    val data = AdvertiseData.Builder()
            .setIncludeTxPowerLevel(false)
            .setIncludeDeviceName(false)
            .addServiceUuid(serviceUuid)
            .build()

    val settings = AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
            .setConnectable(true)
            .build()

    bluetoothLeAdvertiser!!.startAdvertising(settings, data, advertiserCallback)
}

但是,当我使用Android 8.0在我的Nexus 5x上开始播放广告时,我收到了错误的服务 - uuid:

32-bit Service-UUID: 0xDAB5D1DC

对于BLE扫描部分,我使用playstore中的nrf Connect应用程序。

如果我宣传一个常见的128位服务UUID而不是32位服务UUID,那么一切都按预期工作。

对于我的问题,Android 8.0是否有任何更改?

更新2017-08-28:

Nexus 6P上的相同问题。创建了一个问题:https://issuetracker.google.com/issues/65099899

2 个答案:

答案 0 :(得分:0)

仅使用ParcelUuid.fromString(“ DAB5D1DC”) 这将使您的数据包更小。 您的问题可能是因为您广告的数据包太大,我认为最大为32个字节。

答案 1 :(得分:0)

创建常量

 public static final UUID serviceUuid = UUID.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB");

 val data = AdvertiseData.Builder()
        .setIncludeTxPowerLevel(false)
        .setIncludeDeviceName(true)
        .addServiceUuid(new ParcelUuid(Constants.serviceUuid))
        .build()