+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Futur Membre du Club
    Inscrit en
    juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : juin 2008
    Messages : 51
    Points : 17
    Points
    17

    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
    Candidat au titre de Membre du Club
    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 : 14
    Points
    14

    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2011
    Messages : 38
    Points : 16
    Points
    16

    Par défaut

    Je suis preneur si quelqu'un trouve comment faire.

  4. #4
    Futur Membre du Club
    Inscrit en
    juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : juin 2008
    Messages : 51
    Points : 17
    Points
    17

    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 :
    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 :
    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 :
    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2011
    Messages : 38
    Points : 16
    Points
    16

    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
    Candidat au titre de Membre du Club
    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 : 14
    Points
    14

    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
    Futur Membre du Club
    Inscrit en
    juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : juin 2008
    Messages : 51
    Points : 17
    Points
    17

    Par défaut

    j'ai créer une coolection de procedure globale et j'ai placer la procedure suivante dedans


    Code :
    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 :
    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 :
    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 :
    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2011
    Messages : 38
    Points : 16
    Points
    16

    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
    Candidat au titre de Membre du Club
    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 : 14
    Points
    14

    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
    Futur Membre du Club
    Inscrit en
    juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : juin 2008
    Messages : 51
    Points : 17
    Points
    17

    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2011
    Messages : 38
    Points : 16
    Points
    16

    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
    Futur Membre du Club
    Inscrit en
    juin 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : juin 2008
    Messages : 51
    Points : 17
    Points
    17

    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 :
    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
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    juillet 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2011
    Messages : 38
    Points : 16
    Points
    16

    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
    Candidat au titre de Membre du Club
    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 : 14
    Points
    14

    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 :
    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
    Invité régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : mars 2014
    Messages : 7
    Points : 8
    Points
    8

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •