Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > Windev Mobile
Windev Mobile Forum d'entraide sur la programmation Windev Mobile (Pocket PC, SmartPhone,...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/12/2012, 10h17   #1
vinowan
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 50
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juin 2008
Messages : 50
Points : 12
Points : 12
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.
vinowan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 19h13   #2
bricopin
Candidat au titre de Membre du Club
 
Homme JP
Inscription : janvier 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme JP
Localisation : France, Corrèze (Limousin)

Informations forums :
Inscription : janvier 2012
Messages : 14
Points : 13
Points : 13
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
bricopin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2013, 08h48   #3
knarf44
Candidat au titre de Membre du Club
 
Homme
Inscription : juillet 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 37
Points : 12
Points : 12
Je suis preneur si quelqu'un trouve comment faire.
knarf44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2013, 16h15   #4
vinowan
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 50
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juin 2008
Messages : 50
Points : 12
Points : 12
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.
vinowan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2013, 17h40   #5
knarf44
Candidat au titre de Membre du Club
 
Homme
Inscription : juillet 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 37
Points : 12
Points : 12
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.
knarf44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2013, 08h20   #6
bricopin
Candidat au titre de Membre du Club
 
Homme JP
Inscription : janvier 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme JP
Localisation : France, Corrèze (Limousin)

Informations forums :
Inscription : janvier 2012
Messages : 14
Points : 13
Points : 13
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
Citation:
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
bricopin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2013, 16h57   #7
vinowan
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 50
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juin 2008
Messages : 50
Points : 12
Points : 12
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.
vinowan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2013, 17h08   #8
knarf44
Candidat au titre de Membre du Club
 
Homme
Inscription : juillet 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 37
Points : 12
Points : 12
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
knarf44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2013, 19h21   #9
bricopin
Candidat au titre de Membre du Club
 
Homme JP
Inscription : janvier 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme JP
Localisation : France, Corrèze (Limousin)

Informations forums :
Inscription : janvier 2012
Messages : 14
Points : 13
Points : 13
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
bricopin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2013, 14h27   #10
vinowan
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 50
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juin 2008
Messages : 50
Points : 12
Points : 12
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 ?
vinowan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2013, 10h39   #11
knarf44
Candidat au titre de Membre du Club
 
Homme
Inscription : juillet 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 37
Points : 12
Points : 12
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
knarf44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2013, 10h41   #12
vinowan
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 50
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juin 2008
Messages : 50
Points : 12
Points : 12
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.
vinowan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2013, 19h49   #13
knarf44
Candidat au titre de Membre du Club
 
Homme
Inscription : juillet 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 37
Points : 12
Points : 12
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
knarf44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2013, 21h10   #14
bricopin
Candidat au titre de Membre du Club
 
Homme JP
Inscription : janvier 2012
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme JP
Localisation : France, Corrèze (Limousin)

Informations forums :
Inscription : janvier 2012
Messages : 14
Points : 13
Points : 13
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
bricopin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h22.


 
 
 
 
Partenaires

Hébergement Web