Android BLE de la Connexion à plusieurs périphériques à la fois
Je développe une Application Android qui se connecte à un BLE de l'Appareil et lit le Gatt de Services du Gatt et de Caractéristiques. J'ai utilisé le BluetoothLeGatt exemple de projet à partir de l'Android Développement d'un Site comme ma référence.
Jusqu'à présent, je suis capable de programmation pour vous connecter à un appareil (j'ai pris note de mon Adresse de Périphérique pour être en mesure de le faire) et le filtre de l'Gatt de Service que je veux lire et que des Services de Caractéristiques spécifiques en prenant note de l'UUID de la fois la fonction et les Caractéristiques. L'échantillon fourni par Google met également à jour dès qu'il y a un message envoyé à partir de mon BLE Appareil à mon Application Android. Dans l'ensemble, je n'ai aucun problème à cette fin.
Cependant, à la lecture de plus GATT, j'ai trouvé qu'il est possible de se connecter à de multiples BLE appareils (tous les esclaves OU les serveurs - être celles qui envoient les données) à l'aide d'une seule Application Android (en tant que maître OU client - comme celui qui reçoit ces données). Donc, ce que j'ai essayé de faire, c'était d'avoir 2 BLE Périphériques (Adresse différente), a pris note de leur Adresse, et puis mon application tente de se connecter une fois l'application voit que ces 2 adresses sont en place et en cours d'exécution.
Dans le code, j'appelle cette fonction quand je vois mes 2 BLE Appareils:
private void connectToDevice(){
mDeviceName = deviceList.get(currentIndex).getName();
mDeviceAddress = deviceList.get(currentIndex).getAddress();
Log.e(TAG, "connecting to device name = " + mDeviceName);
mBluetoothLeService.connect(mDeviceAddress);
}
Où currentIndex
est initialement réglé à zéro. Puis une fois que j'aurai une connexion réussie, je n':
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
Log.e(TAG, "connected");
mConnected = true;
if(currentIndex < deviceList.size()-1) currentIndex ++;
connectToDevice();
}
}
};
Où je vérifier si j'ai encore des appareils à connecter dans mon deviceList
, si oui, incrémenter le compteur, puis connectez jusqu'à ce que je échappement tout dans ma liste.
Cependant, il me semble ne pas avoir de succès à tous à l'aide de cette méthode.
Veuillez noter que la commutation de connexion (round robin) entre mes appareils n'est pas une option. Ce sera un problème quand j'ai beaucoup de dispositifs et il est important de faire passer leurs messages en temps réel, sans retards. Cela dit, je dois avoir une connexion en direct à mes appareils.
Quelqu'un a déjà essayé de se connecter à plusieurs BLE Appareils Android? Je ne suis pas sûr de la manière de procéder sur ce.
auriez-vous l'esprit de l'affichage de votre code qui fait le travail? Je te remercie de tous les fils sur ce sujet.
OriginalL'auteur Razgriz | 2016-02-14
Vous devez vous connecter pour publier un commentaire.
En effet, il est possible de se connecter à plus d'un
peripheral
à partir de votre appareil Android. Cependant, elle permettra de rendre votre code plus complexe, puisque vous devrez gérer à chaque connexion et les réponses.Pour chaque connexion pour la mise en œuvre d'un BluetoothGatt avec rappels. Je l'ai testé il y a plusieurs mois avec un mannequin de test et comme je l'ai dit, cela a bien fonctionné et j'ai été en mesure de se connecter à différents périphériques. Toutefois, si vous avez de la chaîne de nombreuses commandes, il semble y avoir un certain chevauchement des questions décrites dans ce fil.
Malheureusement non, c'était un rapide point de contact pour un projet de travaux et une fois que je l'ai testé et il s'est avéré, en raison de sa simplicité, il est allé directement à la poubelle.
Pas de chance pour moi alors. Voulez-vous rappeler si vous avez utilisé un individu
BluetoothLeService
pour chaque appareil que vous devait-il se connecter? Ou avez-vous simplement d'utiliser plusieurs BluetoothGatt et géré leurs rappels individuellement?Bien sûr, j'ai développé de multiples BluetoothGatt cas par connexion et géré leurs rappels individuellement.
Très apprécié. Je vais probablement partager ma réponse ici lorsque je.
OriginalL'auteur GoRoS
Comme demandé voici le code : (Ici l'ArrayList contient l'fondée périphériques)
Cette boucle est une partie de l'interface runnable qui est appelée à l'intérieur d'un gestionnaire ayant un looper.
J'ai utilisé cette approche en raison de leur est beaucoup de communication entre les périphériques d'envoyer et de recevoir des données.
C'est la méthode de connexion, qui à l'intérieur d'un Service :
C'est le mGattCallBack :
Espère qu'il efface peu de choses pour vous
OriginalL'auteur Gautam
Il est possible de se connecter à plusieurs appareils simultanément. dans mon expérience, il fonctionne assez stable et le nombre de dispositifs que vous pouvez connecter à (stable) dépend de votre matériel. J'ai trouvé que la meilleure pratique (pour moi) était de créer un patrimoine Séparé de service pour la numérisation des trucs et un service pour chaque Bluetoothconnection. il est important de ne pas utiliser les services liés, parce que le licenciement d'une connexion n'est pas stible lors de la liaison.
Avec ce modèle, vous pouvez le controle de votre connexion facilement. Pour le transport de données à partir de votre service, vous pouvez utiliser un broadcastreceiver, par exemple si vous souhaitez afficher le datay dans votre activité principale. La terminaison de la connexion est assez important afin d'arrêter le service et dans onDestroy appel
Pour la Numérisation d'une partie, j'ai utilisé une Liste de Chaînes de caractères où j'ai enregistré toutes les Adresses mac que je veux trouver. Quand j'ai trouvé un appareil, je l'ai supprimé de la liste et si la liste est vide, c'arrêtée le scanner de service. Pour transmettre mon appareil détecté, j'ai utilisé un broadcastreceiver et l'a envoyé à mon Activité principale. Là, j'ai communiqué à la droite de service.
Espérons que cela aide
OriginalL'auteur medTech