web-dev-qa-db-fra.com

Différence entre fermer () et déconnecter ()?

L'API Android Bluetooth Low Energy implémente 1 méthode pour se connecter à l'appareil connectGatt() mais 2 méthodes pour fermer la connexion disconnect() et close().

La documentation dit:

  • disconnect(): Déconnecte une connexion établie ou annule une tentative de connexion en cours.

  • close(): l'application doit appeler cette méthode le plus tôt possible après l'avoir effectuée avec ce client GATT.

Le code source de BluetoothGatt.Java montre que close () désenregistre l'application et déconnecte () déconnecte le client. Cependant, il ne dit pas ce que cela signifie réellement. Je veux dire, s'il n'y a qu'une seule façon de se connecter au client, pourquoi il y a 2 façons de fermer/déconnecter la connexion?

42
Arturs Vancans

Avec disconnect(), vous pouvez appeler plus tard connect() et continuer ce cycle.

Une fois que vous appelez close(), vous avez terminé. Si vous souhaitez vous reconnecter, vous devrez appeler à nouveau connectGatt() sur le BluetoothDevice; close() libérera toutes les ressources détenues par BluetoothGatt.

62
Douglas Jones

Voici un peu de grain à moudre:

Tant que vous n'avez pas appelé close sur le Gatt, vous pouvez toujours essayer de vous connecter ou de découvrir. Ainsi, lorsque j'essaie de découvrir des services pour une machine, j'exécute généralement un thread ou exécutable qui fait la demande de connexion à la machine pendant un certain temps.

La première tentative de connexion à une machine renvoie un objet BluetoothGatt que vous pourrez utiliser ultérieurement pour essayer de découvrir les services de l'objet BluetoothDevice. Il semble assez facile à connecter, mais beaucoup plus difficile à découvrir les services de la machine.

mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);

Donc dans mon thread/runnable, je vais vérifier si le BluetoothGatt est nul. Si c'est le cas, j'appellerai à nouveau la ligne de code ci-dessus, sinon j'essaierai de découvrir les services BluetoothGatt en tant que tels.

mBluetoothGatt.discoverServices();

Oh, et je m'assure TOUJOURS d'appeler BluetoothAdapter.cancelDiscovery () avant toute tentative de connexion ou de découverte du service.

mBluetoothAdapter.cancelDiscovery();

Voici une méthode utilisée pour se connecter dans mon exécutable, etc.:

public void connectToMachineService(BLEMachine machine) {
    Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName());

    mBluetoothAdapter.cancelDiscovery();

    if(mBluetoothGatt == null)
        mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
    else
        mBluetoothGatt.discoverServices();
}

Enfin, assurez-vous de fermer tous les objets BluetoothGatt auxquels vous vous êtes connecté. Il semble que Android peut gérer cinq objets BluetoothGatt avant de commencer à dire "impossible de se connecter au serveur Gatt" ou autre chose du genre.

Sur chaque BluetoothGatt que je crée, j'appellerai close dessus, puis je diffuserai une mise à jour indiquant que la connexion est fermée. Il semble qu'il y ait de nombreuses fois où le BluetootGatt ne répondra pas avec un changement d'état lorsqu'il sera déconnecté. Ma méthode de fermeture du BluetoothGatt ressemble à ceci. Je laisse la méthode ouverte pour que l'activité appelle le service et se déconnecte si une machine ne répond plus et que l'état de déconnexion n'est pas appelé.

public void disconnectGatt(BluetoothGatt gatt) {
    if(gatt != null) {
        gatt.close();
        gatt = null;
    }

    broadcastUpdate(ACTION_STATE_CLOSED);
}
13
Droid Chris

Je constate que mon téléphone se reconnecte automatiquement à mon module lorsque le module redémarre si je n'appelle pas close() && aucun transfert de données entre la période de mise hors tension.

Je pense que c'est une caractéristique importante de ble.

0
Xixiaxixi