Comment résoudre l'erreur onClientConnectionState () - status=22 clientIf=7 in BLE

j'ai une application Android qui utilise pour se connecter Bluetooth Basse Énergie (blable) avec mon téléphone. L'application a bien fonctionné dans le presque téléphone tels que Galaxy S5 (Android 5.0.1), Galaxy S6 (Android 6.0). Cependant, il a un problème critique dans Galaxy Note 3 (Android 5.0.1).

quand j'appelle le connect() fonction, et ensuite appeler le readCharacteristic(), elle renvoie l'erreur:

onClientConnectionState ()=22 clientIf=7

L'erreur se produit après j'appelle connect fonction environ 2 secondes. Je chercher une solution, comme la fabrication de retard avant d'appeler readCharacteristic(), mais il ne peut pas résoudre.

auriez-vous un moyen de résoudre mon problème?

Merci à tous.

voici mon code:

 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
   @Override
   public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

     if (newState == BluetoothProfile.STATE_CONNECTED) {               
        mBluetoothGatt.discoverServices();      
     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {}
     }

     @Override
     public void onServicesDiscovered(BluetoothGatt gatt, int status) {
       if (status == BluetoothGatt.GATT_SUCCESS) {
          try {
            Thread.sleep(500);
            readCharacteristic();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }

       } else {
           Log.w(TAG, "onServicesDiscovered received: " + status);
       }
     }

     @Override
     public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic,
                                         int status) {           
     }

     @Override
     public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {            
     }
 };

 public void readCharacteristic() {
   /*check if the service is available on the device*/
   BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00001c00-d102-11e1-9b23-00025b00123"));
   /*get the read characteristic from the service*/
   BluetoothGattCharacteristic mReadCharacteristic = mCustomService.getCharacteristic(UUID.fromString("00001233-d102-11e1-9b23-00025b00a5a5"));
   mBluetoothGatt.setCharacteristicNotification(mReadCharacteristic, true);
   BluetoothGattDescriptor descriptor = mReadCharacteristic.getDescriptor(
                UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
   descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
   mBluetoothGatt.writeDescriptor(descriptor);
 }

Ceci est mon fichier de fonction de service complet à connecter

public class ConnectionService extends Service{
    private BluetoothLeService mBluetoothLeService;
    public String mDeviceAddress="0A:1B:6C:22:11:3D";
    private ServiceMonitor serviceMonitor = ServiceMonitor.getInstance();
    private final ServiceConnection mServiceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder service) {           
            mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
            if (!mBluetoothLeService.initialize()) {
                Log.e(TAG, "Unable to initialize Bluetooth");
            }
            mBluetoothLeService.connect(mDeviceAddress);
        }
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mBluetoothLeService = null;
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();        
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onDestroy() {
        if(mGattUpdateReceiver!=null) {
            unregisterReceiver(mGattUpdateReceiver);
        }
        if(mServiceConnection!=null) {
            unbindService(mServiceConnection);
        }
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {      
        //If some device is connecting to phone, let disconnect 
        if(mConnected==true) {
            mBluetoothLeService.disconnect();           
        } 
        //If bluetooth is enable    
        if (BleUtils.getBluetoothAdapter(getApplicationContext()).enable()) {
            Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
            bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
            registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
            //Try to reconnect if the connect is not successful
            if (mBluetoothLeService != null) {
                new CountDownTimer(3000,1000) {
                    public void onTick(long millisUntilFinished) {}
                    public void onFinish() {
                        final boolean result = mBluetoothLeService.connect(mDeviceAddress);
                        Log.d(TAG, "Connect request result=" + result);
                    }
                }.start();
            }            
        }
        return START_STICKY;
}
18
demandé sur Jame 2016-12-05 05:06:58

1 réponses

Il y a différents paramètres pour connectGatt() méthode, elle diffère de la version API. C'est le code kotlin. Je ne vois pas votre méthode connect nulle part mais je sais que vous devez appeler connectGatt() quelque part.

Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> bluetoothDevice?.connectGatt(applicationContext, true, mGattCallback, BluetoothDevice.TRANSPORT_LE)

else -> bluetoothDevice?.connectGatt(applicationContext, false, mGattCallback)
0
répondu Pedro Varela 2018-06-09 20:39:29