Différence entre fermer() et disconnect()?
Android Bluetooth Low Energy API implémente la méthode 1 pour vous connecter à l'appareil connectGatt()
mais 2 méthodes pour fermer la connexion disconnect()
et close()
.
Documentation dit:
-
disconnect()
: Déconnecte une connexion est établie, ou de l'annulation d'une tentative de connexion
actuellement en cours. -
close()
: Application doit appeler cette méthode dès que possible après qu'il est fait avec
cette GATT client.
Le code source de BluetoothGatt.java montre que close() annule la demande et disconnect() déconnecter le client. Cependant, il ne dit pas ce que cela signifie réellement. Je veux dire, si ce n'est que 1 façon de se connecter au client, pourquoi il y a 2 façons de fermer/fermer la connexion?
- Je suppose que
Close
signifie que vous n'utilisez plus Gatt objet
Vous devez vous connecter pour publier un commentaire.
Avec
disconnect()
vous pouvez appeler plus tardconnect()
et continuer avec ce cycle.Une fois que vous appelez
close()
vous avez terminé. Si vous souhaitez vous connecter à nouveau, vous aurez pour appelerconnectGatt()
sur leBluetoothDevice
de nouveau;close()
libèrent les ressources détenues parBluetoothGatt
.disconnect()
et restent en cours d'exécution hors de BT interfaces de la prévention de toutes les nouvelles connexions. L'appel declose()
empêche cela.disconnect()
ouclose()
la méthode de rappelonConnectionStateChange
jamais appelée indiquant STATE_DISCONNECTED.close()
, sans appeldisconnect()
? EtonConnectionStateChange
être appelé dans le cas?disconnect()
etclose()
laonCharacteristicChanged()
événement continue de tir. Quelqu'un at-il une solution pour cela?mBluetoothGatt = device.connectGatt()
une seule fois.close()
au lieu de deux. Mais, je viens de découvrir sur un Nexus 6P fonctionnant sous Android 7.0, que si je l'appelleclose()
sur un appareil qui est actuellement en attente d'être connecté, mais pas encore connecté, le smartphone encore se reconnecte à l'appareil dès qu'il sera de nouveau visible...disconnect()
n'aboutit pas à unonConnectionStateChange()
si la connexion n'a pas déjà été créé.Voici quelques éléments de réflexion:
Aussi longtemps que vous n'avez pas appelé à proximité du Gatt, vous pouvez toujours essayer de s'y connecter, ou de découvrir. Donc, lorsque j'essaie de découvrir des services pour une machine, je vais généralement exécuter un thread ou un exécutable qui en fait la demande à se connecter à la machine pour une certaine période de temps.
La première tentative avec une connexion de la machine, sera de retour avec un BluetoothGatt objet que vous pouvez ensuite utiliser pour essayer de découvrir les services de la BluetoothDevice objet. Il semble assez facile de se connecter, mais beaucoup plus difficile à découvrir la machine servces.
Donc dans mon thread /praticable, je vais vérifier pour voir si le BluetoothGatt est null. Si elle l'est, je vais appeler la ligne ci-dessus du code à nouveau, sinon je vais tenter de découvrir le BluetoothGatt services en tant que tels.
Oh, et j'ai TOUJOURS assurez-vous d'appeler BluetoothAdapter.cancelDiscovery() avant toute tentative de raccordement de découvrir le service.
Ici est une méthode qui est utilisée pour se connecter à mon exécutable, etc:
Enfin, assurez-vous de fermer BluetoothGatt les objets que vous avez connecté. Il semble que Android peut gérer les cinq BluetoothGatt objets avant qu'il commence en disant: "impossible de se connecter au Gatt de serveur" ou autre chose comme ça.
Sur chaque BluetoothGatt que j'ai créer, je vais appeler close sur elle, puis la diffusion d'une mise à jour, indiquant que la connexion est fermée. Il semble que il ya beaucoup de fois où la BluetootGatt ne répondra pas par un changement d'état lorsqu'il est déconnecté. Ma méthode de fermeture de la BluetoothGatt va quelque chose comme ceci. Je laisse la méthode qui s'est ouverte pour l'Activité d'appeler le service et la débrancher si une machine ne répond plus et le débrancher de l'état n'est pas appelé.
disconnectGatt
lorsque vous appelez réellementclose()
au lieu dedisconnect()
.