PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile (earlier versions) → Communications bluetooth appareil android avec balance électronique
Communications bluetooth appareil android avec balance électronique
Started by bergere, Aug., 04 2020 5:33 PM - 4 replies
Registered member
5 messages
Posted on August, 04 2020 - 5:33 PM
Objet :
Problème communications bluetooth entre un appareil android et une balance électronique
Environnement :
Windev mobile 23, Appli compilée pour Android et testée sur Android 7.2.1 et Android 9
Description de la situation :
Je désire faire communiquer par bluetooth, une application sur un appareil Android avec une balance électronique afin que cette dernière retourne dans l’application, une valeur de pesée.
J’ai développé cette même fonction sur un appareil en Windows Mobile (sur Workabout PRO avec Visuall Studio) et en Windows (avec Filemaker Pro) et le tout fonctionne très bien. Quand j’essaie sur un appareil Android, ça ne fonctionne pas. La séquence est la suivante :
1) Je liste les appareils bluetooth disponibles et vus par Android dans l’appli. Cette portion fonctionne bien et complète le tableau avec la liste des appareils disponibles en utilisant le code suivant :
SI BTEtat() = btDésactivé ALORS
BTActive(Vrai)
FIN
sChaîneTmp est une chaîne
sListePériphs est une chaîne
// Liste les périphériques
Sablier(Vrai)
sListePériphs = BTListePériphérique()
Sablier(Faux)
// Vide le champ Table où sont listés les périphériques
TableSupprimeTout(TABLE_Appareils_Bt)
// Remplit le champ Table
SI sListePériphs <> "" ALORS
POUR TOUTE CHAÎNE sChaîneTmp DE sListePériphs SEPAREE PAR RC
sIdentifiant est une chaîne = ExtraitChaîne(sChaîneTmp,1, TAB)
sAdresseMAC est une chaîne = ExtraitChaîne(sChaîneTmp,2, TAB)
sNom est une chaîne = ExtraitChaîne(sChaîneTmp,3, TAB)
SI sNom <> "" ALORS
TableAjouteLigne(TABLE_Appareils_Bt,sIdentifiant,sNom,sAdresseMAC)
FIN

FIN
SINON
Info(ErreurInfo(errComplet))
FIN

2) Ensuite je sélectionne la ligne qui détermine l’appareil que je veux connecter dans la table et je crée un socket pour communiquer avec la balance, socket que j’appèle « Lecteur ». Cette portion fonctionne aussi très bien avec le code suivant et j’ai une réponse positive de la balance électronique qui connecte en bluetooth (Le symbole bluetooth s’allume et la sonorité de connection est émise par la balance) et me retourne l’adresse MAC ainsi que le nom de l’appareil :

nIdentif est un entier = COL_No
smac_adr est une chaîne = COL_MAc_Adr

SI BTAccepteConnexion() ALORS
Info("Connexion acceptée")
SINON
Info("Connexion refusée")
FIN
// la commande de socketConnectBluetooth agit aussi comme une commande SocketCree
SI SocketExiste("Lecteur") ALORS
// le socket existe déjà, on ne le recrée pas car cela causerait une erreur
SINON
SI SocketConnecteBluetooth("Lecteur","ServiceDiscoveryServerServiceClassID_UUID",smac_adr) = Faux ALORS
Info("Ne peut raccorder le socket Bluetooth")
FIN
FIN

3) Ensuite, j’ai un bouton pour lire l’adresse MAC que je store dans la variable globale gsArd_ip et qui lit le port dans la variable globale gssock_port Ceci semble fonctionner, (mais j’ai un petit doute sur le port qui est toujours « 0 »)

SI SocketExiste("Lecteur") ALORS
gssock_port = SocketClientInfo("Lecteur",SocketPort)
gsArd_ip = SocketClientInfo("Lecteur",SocketAdresse)
SAI_Port = gssock_port
SAI_IP = gsArd_ip
SINON
Erreur("Socket n'existe pas")
FIN

4) La section qui suit est la où ça ne fonctionne plus. Je dois envoyer le code {RO} à la balance, qui dans le cas où cela fonctionne, devrait me répondre en me retournant le poids (ce qui se passe dans le cas sur Windows et Windows mobile). Je reçois le message qui me dit que la communication semble se faire (message transmis…), mais rien ne se passe. Voici le code pour cette simple commande :

instruction est une chaîne = "{RO}"
SI SocketEcrit("Lecteur",instruction) = Vrai ALORS
Info("message transmis au Cone 2",SocketEcrit("Lecteur",instruction))
SINON
ErreurInfo(errMessageSystème)
FIN
SAI_identifiant = SocketLit("Lecteur",Faux,3000)
Info(SocketLit("Lecteur",Faux,3000))

J’ai aussi essayé avec la seconde ligne comme suit : SI SocketEcrit("Lecteur","{RO}",gsArd_ip,gssock_port) = Vrai ALORS
Posted on August, 04 2020 - 8:52 PM

instruction est une chaîne = "{RO}"
SI SocketEcrit("Lecteur",instruction) = Vrai ALORS
Info("message transmis au Cone 2",SocketEcrit("Lecteur",instruction))
SINON
ErreurInfo(errMessageSystème)
FIN
SAI_identifiant = SocketLit("Lecteur",Faux,3000)
Info(SocketLit("Lecteur",Faux,3000))

J’ai aussi essayé avec la seconde ligne comme suit : SI SocketEcrit("Lecteur","{RO}",gsArd_ip,gssock_port) = Vrai ALORS


ton problème est très vraisembleblement du au fait qu'en windows et windows mobile, les chaines sont, par défaut, des chaines ANSI. Sous android, ce sont des chaines unicodes... La chaine que tu envoie au mobile est donc deux fois plus longue et contient des zero binaires entre chaque caractère, ce que la balance ne comprend pas.

donc, commence par essayer avec Intruction est une chaine ANSI=...
Registered member
5 messages
Posted on August, 05 2020 - 2:05 PM
Bonjour, et en premier, merci pour votre réponse.
En effet, vous avez raison: avec le code qui suit, je peux communiquer vers la balance et le témoin lumineux sur la balance semble m'indiquer que l'instruction est reçue. J'ai donc avancé d'un pas.

instruction est une chaîne = "{RO}"
poids est un Buffer = ""
SI SocketEcrit("Lecteur",UnicodeVersAnsi(instruction)) = Vrai ALORS
//info("message transmis au Cone 2")
SINON
ErreurInfo(errMessageSystème)
FIN

Par contre, maintenant, je tente de recevoir la réponse (la valeur de lla pesée de la balance) et si je fais l'instruction suivante à la suite de ce qui est ci-haut

poids = SocketLit("Lecteur",Faux)

alors tout gèle. Je réussis à éviter que le mobile Android gèle en fermant et réouvrant le socket comme suit:

poids = SocketLit("Lecteur",Faux)
SAI_poids = poids
SocketFerme("Lecteur")
SocketConnecteBluetooth("Lecteur","ServiceDiscoveryServerServiceClassID_UUID",gsArd_ip)

Par contre, je n'ai toujours pas de réponse de pesée de la balance

J'ai donc essayé en tentant de reconvertir la réponse en UniCode par le code suivant (mais toujours rien !):

instruction est une chaîne = "{RO}"
poids est un Buffer = ""
SI SocketEcrit("Lecteur",UnicodeVersAnsi(instruction)) = Vrai ALORS
//info("message transmis au Cone 2")
SINON
ErreurInfo(errMessageSystème)
FIN
poids = AnsiVersUnicode(SocketLit("Lecteur",Faux))
SAI_poids = poids // saisie pour afficher la valeur à l'écran
SocketFerme("Lecteur")
SocketConnecteBluetooth("Lecteur","ServiceDiscoveryServerServiceClassID_UUID",gsArd_ip)

Si vous avez d'autres bonnes idées, c'est hyper apprécié.
Merci !
Registered member
3,311 messages
Popularité : +93 (137 votes)
Posted on August, 08 2020 - 1:20 PM
Argus t'as demander d'écrire

instruction est une chaîne ANSI = "{RO}"

Or tu ne l'as pas fait
Registered member
5 messages
Posted on August, 10 2020 - 1:18 AM
En fait, oui. Mon code est le suivant:

instruction est une chaîne ANSI= "{RO}"
poids est une chaîne ANSI = ""
SI SocketEcrit("Lecteur",instruction) = Vrai ALORS
//info("message transmis au Cone 2")
SINON
ErreurInfo(errMessageSystème)
FIN
//poids = AnsiVersUnicode(SocketLit("Lecteur",Faux))
SI SocketLit("Lecteur",Faux) = Vrai ALORS
Info ("lecture après arret de 1 secondes")
SINON
Info("socket non lu")
FIN
poids = (SocketLit("Lecteur",Faux))
SAI_poids = AnsiVersUnicode(poids)
SocketFerme("Lecteur")
SocketConnecteBluetooth("Lecteur","ServiceDiscoveryServerServiceClassID_UUID",gsArd_ip)

C'est juste que dans mon message antérieur du 5 août, l'instruction:
SI SocketEcrit("Lecteur",UnicodeVersAnsi(instruction))
fait le même travail et dans un cas comme dans l'autre, ça fonctionne très bien: le message est bien transmis la balance quiagit comme ce doit en éteignant un LED de confirmation de message reçu.

Le problème actuel est pour aller chercher le poids dans la balance car la fonction SocketLit ne semble pas fonctionner:
Si je laisse:

SI SocketLit("Lecteur",Faux) = Vrai, ALORS

j'obtient toujours le message "Socket non lu" (voir ci-haut)

Si je met un délai dans la fonction socketLit, comme par exemple:
SocketLit("Lecteur",Faux,3000)
Alors tout gèle et lle programme ne répond plus. On dirait que Androvin n'accepte pas cette fonction malgré que l'aide Windev dit que ça devrait fonctionner.