2017-08-29 1 views
0

J'ai remarqué que lorsque vous vous déconnectez pour un périphérique Bluetooth dans une application, l'appareil iOS continue à maintenir cette connexion pendant environ 10 secondes. J'ai essayé de contourner cela en écrivant à une caractéristique qui fait que le module bluetooth annule la connexion avec le périphérique iOS à la place mais cela ne fonctionne pas (principalement parce que j'ai changé le module et iOS ne voit pas le changement parce que Je suppose que le périphérique est mis en cache quelque part). Y at-il un moyen de le déconnecter instantanément dans le code? J'utilise la commande rapide manager.cancelPeripheralConnection(peripheral) actuellement.Déconnecter l'heure pour iOS BLE

Répondre

1

Malheureusement, il n'y en a pas. La seule façon de dire au système de déconnecter un périphérique est via la méthode cancelPeripheralConnection que vous utilisez déjà. Pourtant, si vous appelez cette méthode, cela ne signifie pas nécessairement que le périphérique sera déconnecté.

Contexte

Sur iOS toute la gestion de la connexion BLE est maintenue par le système d'exploitation. Cela signifie qu'aucune application ne "possède" une connexion. Toutes les fonctionnalités BLE sont multiplexées pour permettre à plus d'une application d'accéder aux centraux et aux périphériques. Par exemple, si vous avez installé une application de fitness qui suit les données de votre capteur de fréquence cardiaque en arrière-plan, vous pouvez également vous connecter au capteur de fréquence cardiaque de votre application, mais vous ne pourrez pas déclencher une véritable déconnexion. tant que l'application de fitness maintient une connexion.

Le délai de déconnexion que vous avez remarqué est essentiellement une optimisation du système d'exploitation. Si aucune application ne maintient une connexion avec le périphérique, elle attendra un certain temps (pour éviter des cycles de connexion/déconnexion inutiles), puis déclenchera la déconnexion sur la puce Bluetooth.

Espérons que ça aide.

+0

Le fait de débrancher le module BLE force-t-il le système d'exploitation à abandonner la connexion ou va-t-il encore s'y accrocher? – Ubarjohade

+1

En théorie, cela devrait fonctionner mais il y a quelques problèmes: Tout d'abord, iOS essaiera de se reconnecter automatiquement pendant un certain temps (lors de l'utilisation de liaison/appariement).Deuxièmement, vous devez prendre en compte les paramètres de connexion, le délai de supervision de la connexion et la latence de l'esclave en particulier. Ils déterminent quand je la connexion est considérée comme perdue. Si vous vous déconnectez du côté périphérique, votre centrale affichera toujours une connexion en fonction des paramètres mentionnés ci-dessus. Voir le lien suivant pour plus d'informations: https://devzone.nordicsemi.com/question/60/what-is-connection-parameters/. –

0

Dans iOS lorsque vous appelez la méthode CBCentralManager cancelPeripheralConnection (CBPeripheral), la connexion n'est pas toujours immédiatement interrompue. Comme le dit la documentation d'Apple:

Because other apps may still have a connection to the peripheral, canceling a local connection does not guarantee that the underlying physical link is immediately disconnected. From the app’s perspective, however, the peripheral is considered disconnected, and the central manager object calls the centralManager:didDisconnectPeripheral:error: method of its delegate object.

Si vous avez besoin de mettre fin immédiatement une connexion par programmation, par exemple pour libérer le périphérique à raccorder à un autre dispositif central ou de réinitialiser sa propre couche de sécurité, vous devez suivre la procédure décrite dans le fil StackOverflow suivant:

iOS 6 - Bluetooth LE disconnect

qui est pour l'application d'envoyer votre commande propriétaire au périphérique qui indique le périphérique à déconnecter par des moyens normaux (par exemple « GAPRole_TerminateConnection » ou « GAP_TerminateLinkReq » ou "LL_Disconnect" ou "HCI_Disconnect [_ *]" avec la raison HCI_DISCONNECT_REMOTE_USER_TERM). Cela fonctionne toujours et est pas retardé par le délai de supervision de connexion, car il s'agit d'une déconnexion formelle notifiant le périphérique central (c'est-à-dire iOS). Le délai de supervision (jusqu'à 6 secondes sur iOS, sur Android par défaut est de 20 secondes) n'est pris en compte que si la déconnexion n'est pas planifiée ou si le périphérique se déconnecte sans avertir le périphérique distant comme avec "LL_EXT_DisconnectImmed "(disponible uniquement dans certaines implémentations périphériques BLE).