7

Sto tentando di fare pubblicità in NEXUS 9 e ottenere l'errore di ADVERTISE_FAILED_DATA_TOO_LARGE. E 'stato funzionando perfettamente bene quando stavo aggiungendo il servizio dopo il successo pubblicità, ma se aggiungo il servizio attraverso Pubblicizzare builder dati in modo che altri dispositivi in ​​grado di filtrare durante la scansione, ottengo il codice di errore 1, cioè ADVERTISE_FAILED_DATA_TOO_LARGEPeriferiche Bluetooth ADVERTISE_FAILED_DATA_TOO_LARGE

a) codice di lavoro

 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"; 

    } 
}; 

e aggiungendo anche il servizio:

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) Non funziona quando si aggiunge il servizio inizialmente in modo che può essere scoperto da centrale attraverso filte R:

chiamando BLEBroadcast() funzione prima di chiamare startAdvertisingService() e anche l'aggiunta di

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

dà fallimento pubblicitaria con il codice di errore 1.

+0

Puoi modificare la tua domanda per mostrare (a) il codice che ha funzionato "perfettamente bene" e (b) il codice che non funziona? Non è chiaro cosa è cambiato. – davidgyoung

+0

@davidgyoung Ho modificato la mia domanda, spero che ora tu possa prendermi. – Shubham

risposta

15

Ho il sospetto che questa è la riga di codice che causa il disturbo:

advertiseData.setIncludeDeviceName(true); 

L'annuncio non avrà spazio sufficiente per il nome del dispositivo e un UUID del servizio a 16 byte. Quindi, se includi quanto sopra, aggiungi:

advertiseData.addServiceUuid(new ParcelUuid(serviceUUID)); 

Otterrai l'errore che descrivi. Prova a rimuovere la prima riga.

2

Fondamentalmente, i dati superano i 31 byte, quindi è necessario ridurlo.

cambiare questo in fasle, funzionerà.

advertiseData.setIncludeDeviceName (false);