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

avec Java Discussion :

Thread et réception UDP


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Par défaut Thread et réception UDP
    Bonjour,
    Je suis débutant en Java et j'essaye de faire communiquer mon MAC avec un ARDRONE . Avant de mettre en péril le drone je fais mes essais entre deux Mac pour voir si la communication fonctionne et pour la réception ça fait 15 jours que je cherche et que je ne trouve pas ma solution . Je joins la classe ReceiverThread ou il n'y a malheureusement aucune réception et ma Classe Main.

    Est ce que cette absence de réception est lié au fait que la méthode receive() soit "bloquante" ? ou bien est un problème de conception de Thread?
    Pouvez vous m'éclairer sans entrer dans un vocabulaire informatique trop évolué ce n'est pas ma profession , je suis autodidacte et surtout simple passionné.
    En vous remerciant d'avance.

    Mon Main()

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import java.net.InetAddress;
    import java.util.StringTokenizer;
     
    public class MainClass {
     
      public static void main(String[] args) throws Exception {
     
    	  CommandeAT [] Item;
    		Item = new CommandeAT[11];
    		Item[0] = new CommandeAT ("Decollage","AT*REF=",100,290718208);// Faire une incremenatation des N° de sequence et ... recup etat de la batterie
    		Item[1] = new CommandeAT ("Atterrissage","AT*REF=",100,290717696);
    		Item[2] = new CommandeAT ("Stationnaire","AT*PCMD=",100,1,0,0,0,0);
    		Item[3] = new CommandeAT ("plusdegaz","AT*PCMD=",100,1,0,0,1036831949,0);
    		Item[4] = new CommandeAT ("moinsdegaz","AT*PCMD=",100,1,0,0,-1110651699,0);
    		Item[5] = new CommandeAT ("plusdeTangage","AT*PCMD=",100,1,1036831949,0,0,0);
    		Item[6] = new CommandeAT ("moinsdeTangage","AT*PCMD=",100,1,-1110651699,0,0,0);
    		Item[7] = new CommandeAT ("plusMvtLacet","AT*PCMD=",100,1,0,0,0,1036831949);
    		Item[8] = new CommandeAT ("moinsMvtLacet","AT*PCMD=",100,1,0,0,0,-1110651699);
    		Item[9] = new CommandeAT ("plusderoulis","AT*PCMD=",100,1,0,1036831949,0,0);
    		Item[10] = new CommandeAT ("Init","AT*CONFIG=1,\"control:altitude_max\",\"2000\"");
    		Instruction AT = new Instruction("","");
    		int sequence=0;
    		int ordre[] = {10,0,2,1};
        String ip = "192.168.0.16";
        //////////////////////////////////////////////////////////////////////////////
        				//		Codage adresse    //
        ////////////////////////////////////////////////////////////////////////////
        StringTokenizer st = new StringTokenizer(ip, ".");
        byte[] ip_bytes = new byte[4];// on traduit l'adresse ensuite en 4 octets
    	if (st.countTokens() == 4)
    	{
     	    for (int i = 0; i < 4; i++)
     	    {
    		ip_bytes[i] = (byte)Integer.parseInt(st.nextToken());
    	    }
    	}
    	InetAddress ia = InetAddress.getByAddress(ip_bytes); 
    	System.out.println("Inet "+ia);
    //////////////////////////////////////////////////////////////////////////////
    	//                  Envoie de la sequence et de la reception		//
    //////////////////////////////////////////////////////////////////////////////	
    	 for (int j=0 ;j< ordre.length; j++)
    		{	
    			if (Item[ordre[j]].Codage=="AT*REF=") {AT = somme (Item[ordre[j]],sequence);} else 
    			if (Item[ordre[j]].Codage=="AT*CONFIG=1,\"control:altitude_max\",\"2000\"") {AT = somme2 (Item[10]);} else// voir instruction a envoyer;
    			if (Item[ordre[j]].Codage=="AT*PCMD="){AT = somme1 (Item[ordre[j]],sequence);}
    			String a = AT.CodageI;
     
         	byte[] buf = (a + "\r").getBytes();
     
     
        SenderThread sender = new SenderThread(buf, ia , 5556);
        SenderThread sender1 = new SenderThread(buf, ia , 5554);
        sender.start();
        Thread.sleep(500);
        Thread receiver = new ReceiverThread(sender1.getSocket(),ia);
        receiver.start();
    		}
      }
      static Instruction somme (CommandeAT Item1,int compteur)
    	 {
    		 Instruction CodeI = new Instruction("","");
    		 CodeI.CodageI = Item1.Codage+String.valueOf(Item1.param1+compteur)+","+String.valueOf(Item1.param2);
    		 CodeI.InstructionI = Item1.Instruction; 
    	 return CodeI;
    	 }
     
     
    	static Instruction somme1 (CommandeAT Item1,int compteur)//Surdefinition de methode
    	  {
    		  Instruction CodeI = new Instruction("","");
    		  CodeI.CodageI = Item1.Codage+ String.valueOf(Item1.param1 +compteur)+"," +String.valueOf(Item1.param2)+","+String.valueOf(Item1.param3)+","+String.valueOf(Item1.param4)+","+String.valueOf(Item1.param5)+","+String.valueOf(Item1.param6);
    		  CodeI.InstructionI = Item1.Instruction;
    		  return CodeI;
    	  }
     
    	static Instruction somme2 (CommandeAT Item1)//Surdefinition de methode
    	{
    		  Instruction CodeI = new Instruction("","");
    		  CodeI.CodageI = Item1.Codage;
    		  CodeI.InstructionI = Item1.Instruction;
    		  return CodeI;
    	} 
    }
    Ma Classe ReceiverThread:
    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
    32
    33
    34
    35
    36
    37
    38
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
     
    class ReceiverThread extends Thread {
      DatagramSocket socket;
      int port = 5554;
     
      private boolean stopped = false;
     
      public ReceiverThread(DatagramSocket ds,InetAddress ia) throws SocketException {
        this.socket = ds;
        this.socket.connect(ia,port);
      }
     
      public void halt() {
        this.stopped = true;
      }
     
      public void run() {
        byte[] buffer = new byte[1024];
        while (true) {
          if (stopped)  
            return;
          DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
          try {
        	System.out.println(" Port : "+socket.getPort());
        	System.out.println("Inet adresse " + socket.getInetAddress());
            socket.receive(dp);
            String s = new String(dp.getData(), 0, dp.getLength());
            System.out.println(s);
            Thread.yield();
          } catch (IOException ex) {
            System.err.println(ex);
          }
        }

    Encore merci pour vos Réponses

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    donc tu envoie des messages à une machine distante, mais tu ne reçois pas de réponse de cette machine Première chose, est-ce que la machine distante en question reçois bien les message?

  3. #3
    Membre confirmé
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Par défaut Bonjour
    Oui pas de problème mon deuxième Mac reçoit bien les instructions. Et idem dans ma précédente version avec un temps de pause entre chaque émission le Drone faisait bien les instructions demandées. Le problème est vraiment au niveau de la réception des informations.
    Lorsque j'envoie sur le port 5556 mes instructions il n'y a pas de problème le 2ème mac les reçoit par contre le retour sur le port 5554 il est toujours en attente et j'ai beau faire une boucle infinie du 2ème Mac qui envoi les instructions il n'y a rien.
    J'ai aussi essayé de modifier le port de réception en le mettant en 5556 et en envoyant les données de mon premier Mac sur lui même et toujours rien il reste en attente.
    J'ai vérifié qu'il n'y avait pas de Parefeu .
    Merci encore de vous pencher sur mon cas.
    Cordialement

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ok, tu as des trucs bizarres dans ton code, c'est le moins que l'on puisse dire.

    D'abord, pourquoi établis-tu trois connections séparée? Tu en établis une, a priori (vu que je n'ai pas ton sender thread) avec le port distant 5556 et une autre avec le port distant 5554 (sender et sender1)
    Ensuite, tu ne démarre que sender, donc seule cette connection communique effectivement avec ton mac. sender1, il ne sert à rien.
    Et enfin, au final, tu établis une troisième connection vers le port 5554 de la machine distante et tu y lis ce qu'elle envoie, a savoir rien, puisqu'on a rien fais dans cette communication.

    Je ne sais pas quel protocole bizaroide tu essaie d'établir, mais en général, on fais les transmissions sur une seule connection.


    Donc ton code vrais plutot être du genre



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Thread receiver = new ReceiverThread(sender.getSocket());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /**
      * Crée un Receiver qui lit les messages arrivant sur cette connection déjà ouverte déjà ouverte
      */
      public ReceiverThread(DatagramSocket ds) throws SocketException {
        this.socket = ds;
      }

    aussi, ce code est inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    StringTokenizer st = new StringTokenizer(ip, ".");
        byte[] ip_bytes = new byte[4];// on traduit l'adresse ensuite en 4 octets
    	if (st.countTokens() == 4)
    	{
     	    for (int i = 0; i < 4; i++)
     	    {
    		ip_bytes[i] = (byte)Integer.parseInt(st.nextToken());
    	    }
    	}
    	InetAddress ia = InetAddress.getByAddress(ip_bytes);
    tu peux directement écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	InetAddress ia = InetAddress.getByName(ip);

  5. #5
    Membre confirmé
    Homme Profil pro
    Medecin Biologiste
    Inscrit en
    Janvier 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Medecin Biologiste
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 64
    Par défaut Re Bonjour TCHIZE
    Avant tout merci pour votre réponse j'essaye de tester cela ce soir. Néanmoins j'ai besoin de 2 Sockets en effet le Drone Parrot (cf le Mode d'emploi du SDK) précise qu'il reçoit des instructions sur la socket 5556 et qu'il retourne ses mesures sur la socket 5554 . le tout avec un protocole UDP. C'est pour cela que j'ai créé 2 objets (sender et sender1) et que j'ai essayé de faire du Thread . Mais je suis débutant et non professionnel donc peut être que je m'y prends mal pour programmer cela.
    En vous remerciant de votre réponse et de vos conseils
    Bien Cordialement

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ok, je comprends. donc en fait le drone a une connection bi-directionnelle sur le 5556 qui gère les commandes. Donc a priori les messages d'erreurs reviendront de là. Et une deuxième connection sur le port 5554 qui permet d'interroger les valeurs.

    Dans tous les cas, ces socket, sauf particularité bizarre du drone, doivent être initiées par toi et tu dois envoyer des commandes pour que le drone réponde

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réception UDP avec des sockets
    Par Gregory_007 dans le forum Réseau
    Réponses: 18
    Dernier message: 20/07/2012, 02h49
  2. Thread de réception de flux
    Par Shicky dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 13/05/2011, 20h38
  3. Thread sur socket udp
    Par reitsab dans le forum WinDev
    Réponses: 2
    Dernier message: 23/02/2010, 13h57
  4. pb réception UDP avec transfert rapide
    Par loup_precaire dans le forum Réseau
    Réponses: 4
    Dernier message: 23/03/2009, 21h22
  5. Réception UDP et test de chaine
    Par molotov dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 28/03/2008, 17h14

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