PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [WM23 - Android] Dialogue entre deux applications WIndev Mobile via bluetooth.
[WM23 - Android] Dialogue entre deux applications WIndev Mobile via bluetooth.
Débuté par Cezame, 28 juin 2018 18:54 - 11 réponses
Posté le 28 juin 2018 - 18:54
Bonjour,

Voilà mon problème. Je dois pour les besoin d'une application faire communiquer deux applications Windev Mobile via bluetooth.

L'application A envoie à fréquence fixe une chaine de caractère à l'application B qui la traite.

J'ai opté pour un socket bluetooth avec la fonction SocketConnecteBluetooth avec le service SerialPortServiceClass_UUID qui émule un port série. Mais je n'arrive pas à faire fonctionner l'échange.

Auriez vous une solution à me proposer ou au moins une piste.

Je précise que les terminaux sont sous Android et de par l'utilisation nomade l'accès à internet n'est pas possible en permanence.

D'avance merci pour votre aide.

Cezame
Membre enregistré
199 messages
Popularité : +14 (16 votes)
Posté le 29 juin 2018 - 09:34
Bonjour,

Dans la LST 91, il y a l'exemple d'une application qui envoi et reçoit des fichiers par Bluetooth.
Peut-être pourrais-tu trouver ton inspiration dans cet exemple ?

--
Bon développement

Pierre Devillers
Posté le 29 juin 2018 - 10:26
Bonjour,

Je n'ai pas la LST 91 malheureusement.

J'imagine que socketCréeBluetooth est utlilisé? Avec quel service?

D'avance merci

Cezame
Membre enregistré
51 messages
Popularité : +1 (1 vote)
Posté le 29 juin 2018 - 11:09
Je partirai sur un thread qui lit en permanence sur chaque machine avec la fonction SocketLit.
Lorsque l'autre appareil envoie une demande avec SocketEcrit, celui qui lit active alors une fonction de traitement avec ExecuteThreadPrincipal.
Membre enregistré
199 messages
Popularité : +14 (16 votes)
Posté le 29 juin 2018 - 11:50
Voici la procédure de la LST 91 qui attends un fichier

// D'abord on rend visible l'appareil
BTChangeVisibilité(Vrai,300)

SI PAS SocketExiste(gsNomSocket) ALORS
// On crée la socket
SI PAS SocketCréeBluetooth(gsNomSocket,"GenericFileTransferServiceClass_UUID","Transfert de fichier") ALORS
Erreur(ErreurInfo())
RETOUR
FIN
FIN

Patientez()
// On attends le transfert dans un thread
ThreadExecute("ThreadTransfert" + DonneIdentifiant(), threadNormal, AttendsTransfert)

Procedure Patientez()

TitreSuivant("En attente d'un transfert...")
Sablier(Vrai)


--
Bon développement

Pierre Devillers
Posté le 29 juin 2018 - 12:14
Voici le code que j'utilise,

J'utilise côté "serveur" la fonction SocketCréeBluetooth et SocketConnecteBluetooth côté "client" avec le service "SerialPortServiceClass_UUID".

Code création socket côté serveur :

Procedure Connecte_Périphérique_Affichage()

SI SocketCréeBluetooth("Socket_Affichage","SerialPortServiceClass_UUID","Emission")= Vrai ALORS
// Socket.Option = SocketOptionDéfaut
SocketChangeModeTransmission("Socket_Affichage", SocketSansMarqueurFin)
RENVOYER(Vrai)
SINON
// Echec de la connexion Bluetooth
Erreur("Impossible de se connecter au périphérique Bluetooth",
ErreurInfo(errComplet))
RENVOYER(Faux)
FIN


Émission toutes les 3 secondes des données sous forme de chaine de caractères.

Procedure Envoi_données(sChaineAEnvoyer,sAdresseMac)
//sChaineAEnvoyer : données à envoyer
//SAdresseMac : adresse Mac du périphérique client

bufAEnvoyer est un Buffer

bufAEnvoyer = sChaineAEnvoyer

SI SocketEcrit("Socket_Affichage",bufAEnvoyer,sAdresseMac,1) = Vrai ALORS
FEN_MenuPrincipal.IMG_Etat_Emission_BT = FEN_MenuPrincipal.IMG_Voyant_Bleu
Multitâche(-20)
FEN_MenuPrincipal.IMG_Etat_Emission_BT = FEN_MenuPrincipal.IMG_Voyant_Gris
FIN


Côté serveur aucune erreur.

Côté "client" voici le code de connexion au socket :

Procedure Connecte_Affichage(sAdresseMac)


SI sAdresseMac ="" RETOUR

// Connexion socket Bluetooth en spécifiant un nom de service
//ToastAffiche("Connexion en cours...",toastCourt,cvMilieu)
Multitâche(-1)

SI SocketConnecteBluetooth("Socket_Affichage", "SerialPortServiceClass_UUID",sAdresseMac) = Faux ALORS
ToastAffiche("Connexion impossible")
RETOUR
SINON
ToastAffiche("Connexion établie",toastLong)
SocketChangeModeTransmission("Socket_Affichage", SocketSansMarqueurFin)
Lecture_Données()
FIN


Si le socket est bien lancé côté "serveur" la connexion est établie sans soucis.

Code de lecture des données, utilisation d'une boucle dont le programme sort lorsque le socket est fermé.

Procedure Lecture_Données()

bufDonnéeRecue est un Buffer

sDonnéeRecue est une chaîne

Multitâche(-1)
BOUCLE
SI PAS SocketExiste("Socket_Affichage") SORTIR
IMG_Etat_Emission_BT = IMG_Voyant_Bleu
bufDonnéeRecue = SocketLit("Socket_Affichage",Faux)
sDonnéeRecue = bufDonnéeRecue
SI Taille(sDonnéeRecue ) > 0 ALORS
IMG_Etat_Emission_BT = IMG_Voyant_Vert
ToastAffiche(sDonnéeRecue )
//Traitement des données reçues
FIN
Multitâche(-20)
IMG_Etat_Emission_BT = IMG_Voyant_Gris
Multitâche(-80)

FIN


La encore aucun message d'erreur mais sDonnéeRecue est toujours vide!

J'utilise cette méthode pour récupérer des données envoyés par un micro contrôleur sans aucuns soucis côté "client"
J'ai essayé en passant par un buffer comme ici ou en utilisant directelent une chaine, j'ai essayé en utilisant une chaine ANSI également des deux côtés.

Une piste?

Merci d'avance pour votre aide.

Cezame
Posté le 29 juin 2018 - 12:48
DIP a écrit :
Voici la procédure de la LST 91 qui attends un fichier

// D'abord on rend visible l'appareil
BTChangeVisibilité(Vrai,300)

SI PAS SocketExiste(gsNomSocket) ALORS
// On crée la socket
SI PAS SocketCréeBluetooth(gsNomSocket,"GenericFileTransferServiceClass_UUID","Transfert de fichier") ALORS
Erreur(ErreurInfo())
RETOUR
FIN
FIN

Patientez()
// On attends le transfert dans un thread
ThreadExecute("ThreadTransfert" + DonneIdentifiant(), threadNormal, AttendsTransfert)

Procedure Patientez()

TitreSuivant("En attente d'un transfert...")
Sablier(Vrai)


--
Bon développement

Pierre Devillers




Merci de ton aide.

Ce code est côté "serveur" ou "client" ?

Mon adresse email pour l'envoi du code si tu le souhaites.

Encore merci

Cezame
Membre enregistré
199 messages
Popularité : +14 (16 votes)
Posté le 29 juin 2018 - 13:58
Tu peux me communiquer ton adresse mail ?

--
Bon développement

Pierre Devillers
Membre enregistré
51 messages
Popularité : +1 (1 vote)
Posté le 29 juin 2018 - 16:12
Je supposes que voulant faire communiquer deux applications entre elles, chaque application a un côté client et un côté serveur.

A partir de là je constate que dans les 2 cas tu utilises le même nom de socket et que tu ne fermes pas le socket après l'avoir utilisé (avec socketFerme). De quoi peut être perturber le fonctionnement.

De plus, je crois que tu n'a pas besoin de mettre socketLit dans une boucle si tu lui passe Vrai en second paramètre. Il attend alors indéfiniment une réponse.

Suram
Membre enregistré
51 messages
Popularité : +1 (1 vote)
Posté le 29 juin 2018 - 16:43
Suram a écrit :
> A partir de là je constate que dans les 2 cas tu utilises le même nom de socket

Ca c'est normal pardon, fin de journée :p
Posté le 29 juin 2018 - 17:13
Mon adresse email : cezame.concept@free.fr

Merci
Posté le 29 juin 2018 - 17:15
Suram a écrit :
Je supposes que voulant faire communiquer deux applications entre elles, chaque application a un côté client et un côté serveur.

A partir de là je constate que dans les 2 cas tu utilises le même nom de socket et que tu ne fermes pas le socket après l'avoir utilisé (avec socketFerme). De quoi peut être perturber le fonctionnement.

De plus, je crois que tu n'a pas besoin de mettre socketLit dans une boucle si tu lui passe Vrai en second paramètre. Il attend alors indéfiniment une réponse.

Suram



Chaque application utilise un socket peu importe le nom.

Après le socketLit je ne ferme pas le socket c'est normal, intégré dans la boucle il récupère ainsi toutes les chaines envoyées par l'application dite "serveur".

J'uilise cette méthode pour communiquer avec des micro controleurs sans aucuns soucis depuis longtemps.

Cezame