|
Communications bluetooth appareil android avec balance électronique |
Iniciado por bergere, ago., 04 2020 5:33 PM - 4 respostas |
| |
| | | |
|
| |
Membro registado 5 mensagems |
|
Publicado em agosto, 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 |
| |
| |
| | | |
|
| | |
| |
Publicado em agosto, 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=... |
| |
| |
| | | |
|
| | |
| |
Membro registado 5 mensagems |
|
Publicado em agosto, 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 ! |
| |
| |
| | | |
|
| | |
| |
Membro registado 3.311 mensagems Popularité : +93 (137 votes) |
|
Publicado em agosto, 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 |
| |
| |
| | | |
|
| | |
| |
Membro registado 5 mensagems |
|
Publicado em agosto, 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. |
| |
| |
| | | |
|
| | | | |
| | |
|