IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windev Mobile Discussion :

connexion bluetooth entre androide et module bluetooth RN-42


Sujet :

Windev Mobile

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut connexion bluetooth entre androide et module bluetooth RN-42
    Bonjour,

    Je dois réaliser une connexion Bluetooth entre un smartphone androïde et une carte électronique embarquée piloté par un pic (microcontroleur) via un module Bluetooth RN-42 de roving networks

    voici le lien pour ceux que cela intéresse :
    http://www.rovingnetworks.com/products/RN_42

    j'ai d'abord fait une petite application avec windev mobile pour connecter deux androide entre eux (smartphone htc incredible s et tablette asus transformer prime) pour cela:
    - j'ai configuer la tablette en serveur en créent un socket Bluetooth
    - configurer le smartphone en client en me connectant au socket créer sur la tablette.

    1er question : on créer le socket du coté serveur et le client s'y connecte est ce bien la bonne terminologie ou est ce l'inverse ?

    2em question : le serveur est bien le slave et le client le master ?

    je pose ces questions parce que pour le module on ne parle plus de socket mais de service, on ne parle plus non plus de serveur et client mais de master et slave. je préféré donc bien comprendre avant de tout faire à l'envers.

    merci de votre aide.

    Vincent.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Bonjour vinowan,
    Je suis un peu dans la même situation (prog développé avec WinDev mobile 17)
    Je dois faire dialoguer un PPC avec un module bluetooth (sur une carte arduino).
    Pour le moment, je le fait manuellement et cela fonctionne.
    Coté PPC, j'allume mon bluetooth (a la main), je lance mon programme sur le PPC, il me propose une connexion avec le module bluetooth concerné, je fais OK, et c'est bon.
    Voila, maintenant, il faudrait que j'automatise tout ceci, et la, c'est le grand vide.
    En fait, je ne sais même pas par quoi commencer.
    Entre les fonctions socket et les fonctions bluetooth, je nage.
    Aussi, comme je vois que tu as un peu plus avancé que moi, pourrais tu me faire profiter du bout de code que tu as écrit et qui gère tout ça ?
    Si, sur le forum quelqu’un as des éléments concrets à me fournir, je suis naturellement preneur (ce sont des exemples qui me manquent le plus)
    Merci à tous
    JP

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Je suis preneur si quelqu'un trouve comment faire.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    bonjour,

    j'ai pas trop mal avancer et ma connexion fonctionne bien entre mon smartphone htc ou tablette et le module Bluetooth RN42

    voici en résumer les étapes a suivre pour communiquer avec un module Bluetooth. (enfin la maniéré que moi j'utilise).

    1) le module BT doit être visible et le code d'appairage connu (0000 ou 1234 pour débuter).

    2) faire une recherche manuelle avec le smart pour voir les périphérique BT à portée, et appairé celui-ci avec le smart. j'ai préférer faire cela en dehors de l'appli androïde car quand cela est fait une fois c'est bon.

    3) au démarrage de l'appli androïde je démarre le Bluetooth si il n'est pas encore activer:
    4) création d'un socket pour la communication
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SI SocketConnecteBluetooth("Socket"+mac_adresse_machine_a_connecter,"SerialPortServiceClass_UUID",mac_adresse_machine_a_connecter,15000) = Vrai ALORS
    		SocketChangeModeTransmission("Socket"+Table_de_machine.Mac_adresse,SocketTailleDébut)
     
    FIN
    REM : Je donne comme nom au socket "socket "+ l'adresse mac mais on mais ce que l'on veut.
    Je change le mode de transmission mais c'est juste une question de sécurité et de faciliter dans le traitement de la trame reçue ensuite par un pic connecter au module BT.
    De mémoire je pense que cette action est bloquante, donc moi, j'ai placer cette fonction dans un tread pour pouvoir faire tourner un sablier en attendant que la connexion soit faite.

    5) pour envoyer une trame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    message_a_envoyer est une chaîne
    message_a_envoyer += Caract(Hd_1)
    message_a_envoyer += Caract(Cmd_1)
     
    SI SocketEcrit(nom_socket,UnicodeVersAnsi(message_a_envoyer)) = Vrai ALORS
    	Ferme() //action si reussit
    SINON
    	Info("erreur",ErreurInfo(errCode))
    FIN
    la fonction Caract(8) pour envoyer un code 8 bits 0x08 et pas le code ascii de 8 (0x38)
    unicodeversansi() pour envoyer les 2 byte Hd_1 et Cmd_1 et pas 4 byte

    REM: il faut faire suppert attention au format ansi, unicode, decimale on s'y perd très vite.

    6) réception d'une trame.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SI SocketExiste("Socket"+Table_de_machine.Mac_adresse) = Vrai ALORS
     
         trame_reception = AnsiVersUnicode( SocketLit("Socket"+Mac_adresse,Faux,50))
    ansiversunicode () car j'envoie du pic via le module BT au smart des code ascii sur 8 bits et androide fonctionne en unicode donc reconversion.

    REM: les trame reçues s'empile sur une pile et à chaque procédure de lecture on ne lit que la première trame recue, il faut donc refaire la fonction socketlit jusqu’à ce que cette pile soit vide.
    Perso, j'ai fait un tread lancé au démarrage qui test constamment l’existence du socket, qui test l'arrivée d'une nouvelle trame et qui stock les donnée reçue.

    end) j'ai passé pas mal de temps a chercher dans tous les coins, je ne sais pas si c'est la solution mais ca fonctionne et même pas mal du tout.

    j’espère que cela vous aideras car c'est vrai que l'aide en ligne n'est pas encore très fournie sur les socket Bluetooth mais ta touche F1 est devenue mon amie lol.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Merci super réponse et bien expliqué. IL me semble que j'ai tout fait pareil mais ça ne marche pas. Je vérifie tout dés que j'ai un moment.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Bonjour,
    vinowan, je galère apparemment plus que toi et knarf44 (même si j'ai un peu avancé avec l'aide de knarf44).
    Pourrais tu, comme l'a fait knarf44 me faire passer le listing de toute ta partie connexion (en MP si tu veux), afin que j’essaie de comprendre la manière dont ça fonctionne.
    Mon problème se situe surtout dans la réception des infos en provenance de la carte Arduino.
    Cette partie m'intéresse beaucoup
    REM: les trame reçues s'empile sur une pile et à chaque procédure de lecture on ne lit que la première trame reçue, il faut donc refaire la fonction socketlit jusqu’à ce que cette pile soit vide.
    Perso, j'ai fait un tread lancé au démarrage qui test constamment l’existence du socket, qui test l'arrivée d'une nouvelle trame et qui stock les donnée reçue.
    Pour le moment le partie émission semble fonctionner correctement.
    En te remerciant, toi ainsi que knarf44
    JP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    j'ai créer une coolection de procedure globale et j'ai placer la procedure suivante dedans


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    PROCEDURE Thread_reception_data_socket()
     
    trame_reception est une chaîne
    sansfin est un entier = 1;
     
    BOUCLE	//boucle sans fin ne pose pas de probleme car dans un thread
     
     
    	//test si le socket existe
    	SI SocketExiste("Socket"+Mac_adresse) = Vrai ALORS
     
    		trame_reception = AnsiVersUnicode( SocketLit("Socket"+Mac_adresse,Faux,50))	
     
    		SI trame_reception <> "" ALORS
     
    			//traitement de la trame recus depand de ce que l'on veur en faire
    			//il est impossible de modifier l'IMH d'une fenetre via un thread, il faut 
    			//donc enregister les donnée utile via une variable globale à la fenetre par exemple
    			//et ensuite appeler une autre procedure globale via la commande ExécuteThreadPrincipal(nom de la procedure globale à appeler pour faire le refresh de l'IMH)
     
    			FEN_ma_fenetre_1.string_recue = trame_reception				
    			ExécuteThreadPrincipal(Job_refresh_IMH_ma_fenetre_1)
     
    			trame_reception = ""		
     
    		FIN
     
    	FIN		
     
     
    A FAIRE TANTQUE sansfin = 1
    je lance ce tread comme ceci en initilaisation de ma fenetre de depart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThreadExécute("thread_reception_data_socket",threadNormal,Thread_reception_data_socket)
    et voici un appercu de la procedure de refresh de l'imh qui est donc aussi une procedure globale crée dans une collection de procedure globale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE Job_refresh_IMH_ma_fenetre_1()
     
    FEN_ma_fenetre_1.SAI_test_reception = FEN_ma_fenetre_1.string_recue
    REMARQUE: il faut bien faire attention que le type de trame envoyée doit être le même que celle recue, si on configure le socket a sa creation comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SocketChangeModeTransmission("Socket"+Table_de_machine.Mac_adresse,SocketTailleDébut)
    la trame de à envoyer au smathpone (androide) doit avoir le même format c'est à dire :

    - nbr de byte à recevoir codé en ascii (attention si 10 byte recus sera codé sur 2 bytes et si 100 byte recus sera codé sur 3 byte)
    - 13 (dec)
    - 10 (dec)
    - byte 0
    - byte 1
    - byte ...
    - byte n

    donc si on utilise un port uart d'un pic par exemple pour envoyer les byte 1,2,3 decimale il faut envoyer cette trame complete :
    - 51,13,10,1,2,3 (tout en decimale)
    ou 51 = 3 en ascii
    ou 13,10 = carred return
    et ou 1,2,3 sont les 3 byte recus dans la variable trame_reception

    et la par contre je bloque encore sur le fait que si un bug par exemple dans le pic ou un parasite (on ne sait jamais) fait qu'il manque un byte de la trame en emmision du pic et bien la procedure socketlit reste plantée indefiniment et independament du time out definit dans les parametre de cette fonction.

    j'espere avoir été clair dans mes explications, je ne prétend pas que ceci est la bonne solution mais je n'ai pas trouver autre chose si quelqu'un fait autrement et que cela fonctionne je suis preneur aussi.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Bonjour Vinowan,
    Comme Bricopin, je n'y arrive pas. J'ai essayé de passer les octets dans un sens, dans l'autre avec la taille au début ou sans en décodant l'unicode ou pas..; bref tout ce que j'i pu imaginé mais au final ça ne marche pas. Je suis sûr que ça vien de windev parce que je test les mêmes fonctionnalité avec eclipse sans pb.

    Pourrais-tu m'envoyer ton code windev STP.

    Merci

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Salut
    Je n'ai pas testé encore la solution de Vinowan.
    Je vais essayer de voir ça demain.
    Je vous tiens au courant.
    Pour info, j'ai développé cette appli sur un PPC et la, ça fonctionne parfaitement
    JP

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    Désolé pour le retard dans mes réponses,

    est ce dans l'envoi ou dans la reception que vous avez des probleme?

    je veux dire envoi de l'androide vers le periphérique ou en reception toujours vu de l'androide ?

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    Pour moi les deux mais de toute manière pour recevoir il faut que j'interroge donc tant que je n'arriverais pas à emettre je n'aurais rien.
    knarf

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 68
    Points : 50
    Points
    50
    Par défaut
    utiliser vous bien la bonne mac adresse ?

    voici comment faire pour recuperer une liste avec tout les peripherique bluetooth identifié par le smart ou la tablette. j'utilise une zone répetée avec 3 attribut ID, Adresse mac et le nom, mais c'est surtout l'adresse mac qui est importante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    PROCEDURE AffichePériphériques()
    sChaineTmp est une chaîne
    sListePériphs est une chaîne
     
    SI BTEtat() = btActif ALORS
    	// Liste les périphériques
    	sListePériphs = BTListePériphérique(btListeSimple,btEtatAuthentifié,10)
    	// Vide la zr où sont listés les périphériques
     
    	ZoneRépétéeSupprimeTout(ZR_liste_bluetooth_module_disponible)
     
    	// Remplit la zr liste
    	SI sListePériphs <> "" ALORS
    		POUR TOUTE CHAÎNE sChaineTmp DE sListePériphs SEPAREE PAR RC
    			// Récupération des valeurs
    			sIdentifiant est une chaîne = ExtraitChaîne(sChaineTmp,1, TAB)
    			sAdresseMAC est une chaîne = ExtraitChaîne(sChaineTmp,2, TAB)
    			sNom est une chaîne = ExtraitChaîne(sChaineTmp,3, TAB)
    			SI sNom <> "" ALORS
    					ZoneRépétéeAjoute(ZR_liste_bluetooth_module_disponible,sChaineTmp)
    			FIN
    		FIN
    	SINON
    		Info("Aucun périphérique disponible.")
    	FIN
    FIN
    une fois l'adresse mac memorisée, c'est celle la qui faut utiliser lors de la création du socket.

    lors de mes premiers pas pour tester l'envoi d'une trame avec un socket bluetoot, j'ai utiliser le soft lookrs232 gratuit pour visualiser ce que je recevais avec le module bluetooth RN42 et ceci afin de voir les different type de trame selon le mode de transmision choisit.

    n'hesité pas a poster les morceau de code qui vous pose probleme, je ne suis pas un pros en windev mobile mais qulequ'un peux toujours voir quelque chose qui ne fonctionne pas.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    J'ai bien tout fait ça (je sui sparti de l'exemple android system) je viens de recevoir mon module arduino je rééssaye au moins je pourrais voir ce qui arrive à l'oscillo.
    Merci

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Bonjour à tous,
    Bon, j'ai pu me remettre un peu sur le projet.
    Comme indique précédemment, je veux faire dialoguer une carte arduino et un smartphone android au travers d'un module bluetooth.
    Grâce à vos renseignements, la partie descendante (android vers arduino) fonctionne.
    Par contre la partie montante (arduino vers android.
    ne fonctionne pas trop bien.
    J'ai simplifié à l’extrême le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROCEDURE LectureDonnees()
    POSVERINS est une chaîne
    TEMP_POSVERINS est un Buffer
    TEMP_POSVERINS = (SocketLit(SocketEnCours))
    POSVERINS = (TEMP_POSVERINS)
    LIB_Info_connexion=POSVERINS
    Que ce passe t'il.
    L'arduino doit me retourner des valeurs (9 variables de 1 à 3 chiffres) concaténés en une seul variable de type string.
    Je reçois bien cette variable au niveau de l'android mais...je ne la reçoit pas instantanément.
    Après de nombreux essais, il s’avere que le délai est fonction de la valeur de ma variable.
    Ex si ma valeur est de 100, le délai est 150s si ma valeurs est de 200, le délai est de 300s etc.
    Le rapport entre la valeur de la variable et le délai est toujours 1.5.
    Je ne comprends pas, d'autant que normalement, la variable étant de type chaine, elle ne devrait pas être prise en compte de par sa valeur.
    Qu'en pensez vous ?
    Cdlt
    JP

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par vinowan Voir le message
    la trame de à envoyer au smathpone (androide) doit avoir le même format c'est à dire :

    - nbr de byte à recevoir codé en ascii (attention si 10 byte recus sera codé sur 2 bytes et si 100 byte recus sera codé sur 3 byte)
    - 13 (dec)
    - 10 (dec)
    - byte 0
    - byte 1
    - byte ...
    - byte n
    Bonjour,

    Je suis arrivé à la même conclusion, le format de la trames à envoyer est imposé
    On se retrouve obligatoirement avec l'entête ci-dessus.
    Comment on peut faire si on doit recevoir/envoyer des trames sans cet entête ?

    Cordialement

    Xavier

  16. #16
    Inactif  
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2017
    Messages : 43
    Points : 40
    Points
    40
    Par défaut
    Bonjour,
    je suis en galère avec la connexion entre une application windev mobile et arduino avec module bluetooth HC -05(maintenant en simulation ISIS), je connecte avec la fonction socketconnectebluetooth(en mettant MAC du PC) mais quand j'envoie un message le mesage a bien envoyé mais sur la carte arduino je ne recoie rien.
    SVP Vos aides

Discussions similaires

  1. Connexion Bluetooth entre PC et smartphone Android
    Par BinKentsu dans le forum Windows Forms
    Réponses: 0
    Dernier message: 22/03/2013, 09h57
  2. Réponses: 3
    Dernier message: 15/08/2010, 00h05
  3. Réponses: 1
    Dernier message: 25/04/2010, 02h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo