PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → WM21 : BTLEConnecte
WM21 : BTLEConnecte
Débuté par Nico, 08 fév. 2016 10:57 - 18 réponses
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 08 février 2016 - 10:57
Je ne trouve rien dans la documentation par rapport aux fonctions BTLE (nouveauté 21 pour IOS).
Est ce que ces fonctions ne sont tout simplement pas encore disponible ?
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 11 février 2016 - 10:54
Pour ceux que cela intéresse, une mise à jour de WM21 qui "devrait" disposer de cette fonctionnalité sera disponible demain (12 Février)
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 22 février 2016 - 17:24
Bonjour,

J'ai réussi à me connecter à un boitier ibeacon avec les fonctions BTLE, mais j'ai des erreurs fatales lorsque j'essaye de lister l'ensemble des services de mon périphérique.

Lorsque j'exécute le code suivant :
POUR TOUT service DE peripherique..Service
TableAjouteLigne(TABLE_service, service.UUID)
FIN

Le "POUR TOUT" plante systématiquement sur le dernier enregistrement du tableau, comme si le tableau pensait contenir X enregistrement mais qu'il n'y en avait en faite que X-1
Par exemple si j'ai 6 services, le POUR TOUT me renvoi une erreur : "l'indice spécifie 6 est invalide"

Du coup j'aimerai effectuer le parcours moi même (POUR i = 1 a ....) Mais quelle fonction puis je utiliser pour connaitre le nombre d'indice de "peripherique..Service" ? j'ai essayé avec tableauOccurence, mais celui ci me renvoi également une erreur...

Merci beaucoup pour votre aide.

Nicolas
Membre enregistré
950 messages
Popularité : +53 (63 votes)
Posté le 22 février 2016 - 23:42
Bonjour,

si tu adapte ce code la avec ton exemple est-ce que cela fonctionne mieux ?

MonPériph est un BTLEPériphérique
...
tabService est un tableau de BTLEService
tabService = BTLERécupèreTousServices(MonPériph, "ACC54-DAD4D5-DADD")
POUR TOUT ELEMENT service DE tabService
...
FIN


C'est un copier-coller de l'aide en ligne mais des fois faire des étapes supplémentaire ça aide

jordan
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 23 février 2016 - 10:03
Le problème avec ce code, c'est qu'il faut déjà connaitre l'identifiant du service (second paramètre de la fonction "BTLERécupèreTousServices").
La fonction retourne tous les services qui ont cet identifiant...
C'est plutôt bizarre, du coup pour récupérer l'ensemble des services disponibles (sans connaitre leur identifiant à l'avance) il n'y a pas d'autres solution que de mettre en place la boucle que j'ai créé...
Posté le 23 février 2016 - 11:01
Bonjour Nico

dans certains autres languages, les indices de tableau commencent à
ZERO, ce qui pourrait expliquer ton problème.

En attandant mieux, une boucle qui incrémente l'indice du tableau (et
qui commence peut être ) ZERO) et trappe l'erreur avec un quand
exception pourrait peut être faire l'affaire.

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com

On 2/22/2016 11:24 AM, Nico wrote:
Bonjour,

J'ai réussi à me connecter à un boitier ibeacon avec les fonctions BTLE,
mais j'ai des erreurs fatales lorsque j'essaye de lister l'ensemble des
services de mon périphérique.

Lorsque j'exécute le code suivant :
POUR TOUT service DE peripherique..Service
TableAjouteLigne(TABLE_service, service.UUID)
FIN

Le "POUR TOUT" plante systématiquement sur le dernier enregistrement du
tableau, comme si le tableau pensait contenir X enregistrement mais
qu'il n'y en avait en faite que X-1
Par exemple si j'ai 6 services, le POUR TOUT me renvoi une erreur :
"l'indice spécifie 6 est invalide"

Du coup j'aimerai effectuer le parcours moi même (POUR i = 1 a ....)
Mais quelle fonction puis je utiliser pour connaitre le nombre d'indice
de "peripherique..Service" ? j'ai essayé avec tableauOccurence, mais
celui ci me renvoi également une erreur...

Merci beaucoup pour votre aide.

Nicolas
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 24 février 2016 - 08:56
Bonjour Nico,

Une fois connecté au BLE, VotreBTLEPériphérique..Service..Occurrence renvoie le nombre de service. Ceci devrait résoudre votre problème pour la boucle sur le tableau.
Vous pouvez récupérer au passage l'identifiant et le nom du périphérique.

Par contre, j'observe des problème de connexion (les connexions sont aléatoires). J'ai testé avec des balises de chez avvel puis estimote. même soucis...

Observez-vous aussi des problèmes de connexion ?

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 24 février 2016 - 11:12
Bonjour Eric,

Merci beaucoup pour votre retour, cela devrait effectivement résoudre mon problème, je test et vous fait un retour bientôt.
Pour la connexion, cela fonctionne bien avec un petit temps de latence de 3/4 secondes avant que la connexion ne soit bien réalisée.
J'ai eu une fois ou je n'arrivais pas à déconnecter la balise, mais ça ne me l'a plus refait... (peut être un soucis dans mon dev dans mes premiers tests)

Donc, détection ok, connexion ok, déconnexion ok (avec juste un soucis rencontré 1 fois mais que je n'arrive plus à reproduire)

Perso j'ai un ibeacon acheté sur the-beacons.com
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 24 février 2016 - 12:23
Merci encore Eric ça fonctionne maintenant parfaitement.
Pour décrire la petite appli que j'ai créé (et si ça peut aider ceux qui débutent sur le sujet), j'ai 3 champs tableaux qui sont remplit à l'aide d'une procédure "listeBeacon" :

=> BTLEListePériphérique(listeBeacon, 2000)

// Le premier tableaux TABLE_beacon contient la liste des beacons (boitier blte) détecté :
// Code présent dans la procédure listeBeacon
// Peripherique est passé en paramètre à la procédure listeBeacon
SELON BTLEEtatConnexion(peripherique)
CAS btleEtatConnecté
TableAjouteLigne(TABLE_beacon, peripherique.Identifiant, peripherique.Nom, "connecté")
AUTRES CAS
TableAjouteLigne(TABLE_beacon, peripherique.Identifiant, peripherique.Nom, "Non connecté")
// Pour info, j'ai un bouton "connecté" dans l'interface qui me lance la connexion sur le périphérique, ce code est également présent dans la procédure listeBeacon
FIN

// Le second tableau TABLE_service contient la liste des services du périphérique sélectionné dans le tableau "TABLE_beacon"
// Code également présent dans la procédure listeBeacon
IF (TABLE_beacon[TABLE_beacon].COL_Identifiant = peripherique.Identifiant ET BTLEEtatConnexion(peripherique) = btleEtatConnecté) THEN

nNombreService est un entier = peripherique..Service..Occurrence

TableSupprimeTout(TABLE_service)
POUR s = 1 A nNombreService
// Ajout du service dans le tableau
TableAjouteLigne(TABLE_service, peripherique..Service[s]..UUID, peripherique.Identifiant)
FIN

END

// Et le troisème tableau "TABLE_caract" contient la liste des caractéristiques du service sélectionné dans le tableau "TABLE_service"
// Code également présent dans la procédure listeBeacon
IF (TABLE_service[TABLE_service].COL_IdBeacon = peripherique.Identifiant ET BTLEEtatConnexion(peripherique) = btleEtatConnecté) THEN
s, c sont des entiers
nNombreService est un entier = peripherique..Service..Occurrence

TableSupprimeTout(TABLE_caract)
POUR s = 1 A nNombreService
IF (peripherique..Service[s]..UUID = TABLE_service[TABLE_service].COL_IdService) THEN
nNombreCaract est un entier = peripherique..Service[s]..Caractéristique..Occurrence
POUR c = 1 A nNombreCaract
TableAjouteLigne(TABLE_caract, peripherique..Service[s]..Caractéristique[c]..UUID)
FIN
END
FIN
END


Bon dev !

Nico
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 24 février 2016 - 15:10
Merci beaucoup pour ce retour. De toute évidence ces lignes de code rendront service à de nombreuses personnes...
Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Posté le 02 mars 2016 - 14:20
METTRE au meilleur et SUPPRIMER
Posté le 09 novembre 2016 - 19:28
Hello Nico,

You can send to me all code? Because I can't create this example. I'm try create a connection for iBeacon.
Thanks!

My email: tety.emyllinha@hotmail.com
Membre enregistré
47 messages
Posté le 03 avril 2017 - 09:58
Bonjour,

@Nico : avec la fonction BTLEListePériphérique(listeBeacon, 2000) : quels sont les périphériques testés et avec lesquels cela a fonctionné ?
est-ce les balises Estimote ?

Avez-vous fait le dével en iOS ? Je pose la question car l'identifiant généré sous Android est la MAC Adresses du périphérique (ça c'est bien puis que c'est unique) mais sous iOS l'identifiant est aléatoire et la connexion à une balise estimote ne fonctionne pas.

merci pour l'info

A+

Greg
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 03 avril 2017 - 11:26
Bonjour Gregory, comme indiqué un peu plus haut, j'avais fait mes tests avec un ibeacon acheté sur the-beacons.com

De mémoire, ça fonctionnait bien sur IOS avec l'adresse MAC, (que j'enregistrais en BDD afin de pouvoir la lier à un événement).
Je crois avoir vu qu'ils ont enrichi les fonctionnalités BTLE en Windev 22, je ne les aient pas encore testé...
Membre enregistré
47 messages
Posté le 03 avril 2017 - 12:25
Et donc cela sans SDK ?
uniquement avec les fonctions BTLE de PCSoft

Et pour iOS j'ai lu que l'OS d'Apple bloquait l'accès à la mac adresse pour ne pas pouvoir faire du tracking des utilisateurs...
Aurais-je raté qqch ?

Merci pour l'info... de fait j'étais passé à côté de the-beacons.com ;)
Membre enregistré
122 messages
Popularité : +5 (5 votes)
Posté le 03 avril 2017 - 15:22
Effectivement, j'utilisais uniquement les fonctions de BTLE de PCSoft, rien de plus.
C'était pour un projet événementiel (donc passé), du coup je n'ai pas refait de test depuis plus d'un an.
J'ai retrouvé dans ma base de données l'identifiant de mon beacon avec lequel j'avais réalisé mes tests : D7:31:83:C8:50:02

Il s'agit bien d'une adresse MAC non ?

Quand je détectais cet identifiant, j'affichais automatiquement une page dans mon application IOS développé avec WM21.
Étrange l'histoire du tracking des utilisateurs, l'objectif de ce genre de boitier (celui que j'avais en tout cas), c'est de le détecter afin de pouvoir réaliser une action en conséquence sur l'application. Vu qu'en zone fermé (musée par Exemple), le GPS ne fonctionne pas, je ne vois pas d'autre solution qu'obtenir l'identifiant du boitier pour réaliser ce genre d'action.
Membre enregistré
47 messages
Posté le 03 avril 2017 - 16:04
Dans la doc PCSOFT il est dit pour l'identifiant d'un périphérique BTLE :
iOS : Cet identifiant est identifiant unique, géré par le système. Attention : cet identifiant peut changer à chaque nouvelle connexion du même périphérique.
Cette propriété est disponible en lecture uniquement

Sous Androïd on reçoit la Mac Adresse.
J'essaie perso de lister des beacon Estimote sous les 2 systèmes SANS passer par le SDK (je n'ai pas les compétences Java/XCode nécessaires pour implémenter ce dernier). L'exemple fourni dans la LST97 avec le SDK fonctionne mais pas avec les nouveaux produits Estimote donc retour case départ.
La fonction BTLEListePériphérique() me retourne un identifiant non utilisable (car par fiable sous iOS) et sans nom donc je tourne en rond. et le BTLEConnecte retourne vrai mais aucun services... Je vais commander d'autres balises et voir ce que cela va donner. Test en version 22 "J" pour info
Membre enregistré
41 messages
Posté le 07 décembre 2017 - 18:47
Bonjour, SVP est ce que c'est possible de se connecter à un périphérique Bluetooth 4.0 avec son adresse mac et lui envoyer des commandes sous formes des message, je n'ai pas besoin de récupérer les services et les caractéristiques (Communication simple pour commander un robot). MERCI.
Posté le 10 septembre 2021 - 13:53
merci pour ton code,

je rencontre un problème sur la ligne table ajoute, mon tableau se rempli des même périphériques,
j'ai ajouter le code sur un bouton pour faire un scan au démarrage de mon application mais le code tourne en boucle, comment l’arrêter svp?