蓝牙外设 ADVERTISE_FAILED_DATA_TOO_LARGE [英] Bluetooth Peripheral ADVERTISE_FAILED_DATA_TOO_LARGE

查看:12
本文介绍了蓝牙外设 ADVERTISE_FAILED_DATA_TOO_LARGE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 NEXUS 9 中做广告并收到 ADVERTISE_FAILED_DATA_TOO_LARGE 的错误.当我在成功广告后添加服务时,它工作得非常好,但是如果我通过广告数据构建器添加服务以便其他设备可以在扫描时过滤,我会收到错误代码 1,即 ADVERTISE_FAILED_DATA_TOO_LARGE

I am trying to advertise in NEXUS 9 and getting the error of ADVERTISE_FAILED_DATA_TOO_LARGE. It was working perfectly fine when I was adding the service after successfully advertising but if I add the service through Advertise Data builder so that other devices can filter while scanning, I get error code 1 i.e ADVERTISE_FAILED_DATA_TOO_LARGE

a) 工作代码

     public void startAdvertisingService() {
    AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
            .setTimeout(0)
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)      
            .build();


     AdvertiseData.Builder advertiseData = new AdvertiseData.Builder();
    advertiseData.setIncludeDeviceName(true);

     BluetoothLeAdvertiser myBluetoothLeAdvertiser = btAdapter.getBluetoothLeAdvertiser();
      myBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);

    myBluetoothLeAdvertiser.startAdvertising(settings, advertiseData.build(),mAdvertiseCallback);

   }
    private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {

    @Override
    public void onStartSuccess(AdvertiseSettings settingsInEffect) {
        super.onStartSuccess(settingsInEffect);
        BLEBroadcast();
    }

    @Override
    public void onStartFailure(int errorCode) {
        String description = "";
        if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED)
            description = "ADVERTISE_FAILED_FEATURE_UNSUPPORTED";
        else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS)
            description = "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS";
        else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED)
            description = "ADVERTISE_FAILED_ALREADY_STARTED";
        else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE)
            description = "ADVERTISE_FAILED_DATA_TOO_LARGE";
        else if (errorCode == AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR)
            description = "ADVERTISE_FAILED_INTERNAL_ERROR";
        else description = "unknown";

    }
};

并添加服务:

 void BLEBroadcast() {

    BluetoothGattCharacteristic characteristic = new     BluetoothGattCharacteristic(characteristicUUID, BluetoothGattCharacteristic.PROPERTY_NOTIFY | BluetoothGattCharacteristic.PROPERTY_INDICATE | BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE, BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PERMISSION_WRITE);

    BluetoothGattDescriptor desc = new BluetoothGattDescriptor(descriptorUUID, BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE);
    desc.setValue("".getBytes());

    characteristic.addDescriptor(desc);

    BluetoothGattService service = new BluetoothGattService(serviceUUID,     BluetoothGattService.SERVICE_TYPE_PRIMARY);
    service.addCharacteristic(characteristic);

    mGattServer.addService(service);
 }

b) 最初添加服务时不起作用,以便可以通过中央过滤器发现:

b) Not working when adding service initially so that can be discovered by central through filter:

在调用 startAdvertisingService() 之前调用 BLEBroadcast() 函数并添加

calling BLEBroadcast() function before calling startAdvertisingService() and also adding

        AdvertiseData.Builder advertiseData = new AdvertiseData.Builder();
        advertiseData.addServiceUuid(new ParcelUuid(serviceUUID)); 

给出错误代码为 1 的广告失败.

gives advertising failure with error code 1.

推荐答案

我怀疑这是导致问题的代码行:

I suspect that this is the line of code causing the trouble:

advertiseData.setIncludeDeviceName(true);

广告将没有足够的空间用于设备名称和 16 字节的服务 UUID.因此,如果您包含上述内容,请添加:

The advertisement will not have enough space for both the device name and a 16 byte service UUID. So if you include the above then add:

advertiseData.addServiceUuid(new ParcelUuid(serviceUUID)); 

您将收到您描述的错误.尝试删除第一行.

You will get the error you describe. Try removing the first line.

这篇关于蓝牙外设 ADVERTISE_FAILED_DATA_TOO_LARGE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆