startLeScan avec 128 bits Uuid ne fonctionne pas sur Android natif BLE de mise en œuvre
J'ai de la difficulté à l'aide de startLeScan( nouveau UUID[]{ MY_DESIRED_128_BIT_SERVICE_UUID }, la fonction de rappel ) sur le nouveau introduit BLE de l'API d'Android 4.3 sur mon Nexus 4.
Le rappel n'est pas appelée. Je ne peux toujours voir les paquets dans le journal:
08-02 15:48:57.985: I/bt-hci(1051): btu_ble_process_adv_pkt
08-02 15:48:58.636: I/bt-hci(1051): BLE HCI(id=62) event = 0x02)
Si je n'utilise pas le paramètre de filtre pour les Uuid il fonctionne. Nous sommes à l'aide d'un spécifiques de fabricant 128bit UUID pour l'appareil de notre société.
Maintenant, notre appareil offre plus de services que je fournis dans le tableau. Mais cela ne devrait pas être le problème.
Est une personne confrontée au même problème? Toutes les solutions?
Modifier
Il y a plusieurs problèmes liés à la numérisation, cette question ne traite que de un: Si vous aussi vous avez un problème avec la numérisation, la lecture ce commentaire premier. Aussi garder à l'esprit, que mon appareil impose un 16 bits et 128 bits UUID. La plupart d'entre vous les gars utilisent 16bit Uuid fournis par le BLE standard comme la fréquence Cardiaque ou la Cadence et de Vitesse.
- Je vois exactement ce problème sur un Nexus 4, 4.3 construire JWR66Y. Il arrive même quand je ne comprend pas les Uuid. Parfois j'ai besoin de redémarrer, parfois, je vais commencer à recevoir des rappels lorsque je redémarre une BLE dispositif au sein de la gamme.
- Merci de ne pas mélanger jusqu'à trois problèmes: 1er BLE instable en général (ne pas recevoir les résultats d'analyse) et le 2ème Nexus 4 rapports seulement un résultat de numérisation et de 3ème ne pas être capable de filtrer les résultats d'analyse correctement (cette question). 1er problème: Voir stackoverflow.com/questions/17870189/.... Une solution consiste à désactiver le wifi et le redémarrage de bluetooth si elle ne fonctionne pas. Comme de 2ème problème: Aussi garder à l'esprit, le Nexus 4 n'apporte qu'un résultat de l'analyse par dispositif dans un scanner. Vous devez redémarrer scan si vous voulez en permanence les résultats d'analyse.
- Merci pour l'info. Il est difficile de ne pas confondre l'questions quand je suis confronté à un mélange des trois, parfois en même temps.
- Note le "résultat de l'analyse par dispositif par scan" est en fait parfaitement bien son comportement en fonction de la BLE spec. Vous devez vous attendre.
- Merci pour votre question. J'ai aussi du mal avec le même problème.
Vous devez vous connecter pour publier un commentaire.
@Navin code est bon, mais il comporte un bogue de dépassement de l'original de la 16-bits de code Android. (Si un octet est supérieur à 127, puis il devient un entier négatif.)
Voici une application qui corrige ce bug et ajoute le support 128 bits:
Essayez ceci pour récupérer/filtre de l'appareil de l'annonce de 128 bits Uuid:
List<UUID> uuids = parseUUIDs("0000ffe0-0000-1000-8000-00805f9b34fb".getBytes());
etList<UUID> uuids = parseUUIDs("0000ffe0".getBytes());
etList<UUID> uuids = parseUUIDs("ffe0".getBytes());
byte[] scanRecord
à cette méthode, puis cochez votre choix UUID sur le revenuList<UUID>
C'est un rapport de bogue au moins dans Android 4.3 JWR66Y:
Mon entourage: Mon appareil dispose de 2 Uuid de la publicité (1 16 et 1 128 bits) et 4 Uuid sur la découverte de service (1 128 bits et 3 16bit).
Même si c'est résolu, je mets en garde tout le monde contre l'utilisation de l'option de filtre fourni par Android. Pour la compatibilité descendante et depuis c'est cassé sur le Samsung Galaxy S3 avec Android 4.3
Bien que la 4.3 ne semble pas en charge le filtrage par 128 bits Uuid, ces Uuid sont probablement présentes dans le byte[] scanRecord renvoyé par la LeScanCallback.
Il y a probablement une bonne façon d'analyser ces données, mais si vous obtenez les mêmes données à chaque fois que vous pouvez filtrer les résultats manuellement par trouver les décalages de l'Uuid vous êtes à la recherche pour. Vous pouvez le faire par l'impression de l'analyse de données dans un journal (comme une chaîne hexadécimale) et la recherche pour l'Uuid qui vous intéresse (ils vont probablement suivre un 0x06 ou 0x07 et sera annulée). Une fois que vous trouver l'offset, il ne devrait pas être trop dur à mettre en place une base de filtre.
Voici un exemple simple qui filtre par un seul UUID (utilise Apache Commons Lang pour ArrayUtils et les octets-à-hex méthode à la ici, mais vous pouvez le remplacer par votre propre code, le cas échéant)
Êtes-vous certain que le périphérique est liste le service spécifié UUID dans la publication de données ou d'analyse des données de réponse?
Vous avez besoin d'ajouter un service UUID dans la publication de données comme le lien
Alors vous pouvez essayer de nouveau startLeScan (UUID[],la fonction de rappel).
J'ai dû réussir par cette méthode à la découverte du thermomètre avec dispositif spécifique UUID[0x1809]
Il fonctionne pour moi.
Mon expérience est que j'ai eu pour la fourniture de TOUS les services qu'un dispositif de je veux me connecter à la présente, et pas seulement celui que je suis inquiète. J'ai fait la découverte d'un service après l'analyse de contourner ce problème.
128 bits UUID LE scan a travaillé sur le Samsung S5, fonctionnant sous Android 4.4.2; mais oui, il échoue sur le Nexus 4, 7. Testé sur 4.4.2, 4.4.3, 4.4.4.
J'ai trouvé un bug dans la source Android 5.x, mais n'est pas présent dans 6.x.
Il y a une fonction dans ce fichier:
http://androidxref.com/5.1.1_r6/xref/external/bluetooth/bluedroid/bta/dm/bta_dm_api.c#1560
utilisé pour passer de 32 bits data_mask pour bluetooth le de la publicité et de l'analyse de la réponse de la pile.
Mais la structure "tBTA_DM_API_SET_ADV_CONFIG;" gérer les 16 bits de valeur de type long !!!
Ainsi le changement UINT16 à UINT32 dor data_mask, recompiler Android et ça fonctionne.
Rif
http://androidxref.com/5.1.1_r6/xref/external/bluetooth/bluedroid/bta/dm/bta_dm_int.h#594
J'ai été en cours d'exécution dans le même problème avec la SensorTag de TI à l'aide de ma N7 2013 avec Android 4.3.
Ce que j'ai trouvé pour le début des travaux de la LeScan, attendez une seconde, l'arrêter et de le redémarrer ensuite.
Aussi, j'ai remarqué que, parfois, la connexion n'est pas établie (ce qui pourrait ou ne pourrait pas être lié au firmware de mise en œuvre ou la fermeture de la connexion correctement). De la même manière, il semble que le fait d'essayer de se reconnecter au gatt semble faire l'affaire.
Avoir à utiliser ces solutions de contournement est vraiment décevant...