| |
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
BTChangeVisibilité(Vrai,300)
SI PAS SocketExiste(gsNomSocket) ALORS SI PAS SocketCréeBluetooth(gsNomSocket,"GenericFileTransferServiceClass_UUID","Transfert de fichier") ALORS Erreur(ErreurInfo()) RETOUR FIN FIN
Patientez()
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 SocketChangeModeTransmission("Socket_Affichage", SocketSansMarqueurFin) RENVOYER(Vrai) SINON 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)
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
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 ) 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 BTChangeVisibilité(Vrai,300)
SI PAS SocketExiste(gsNomSocket) ALORS SI PAS SocketCréeBluetooth(gsNomSocket,"GenericFileTransferServiceClass_UUID","Transfert de fichier") ALORS Erreur(ErreurInfo()) RETOUR FIN FIN
Patientez()
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 |
| |
| |
| | | |
|
| | |
| |
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 |
| |
| |
| | | |
|
| | |