Partage
  • Partager sur Facebook
  • Partager sur Twitter

Udp Socket send receive

Sujet résolu
    25 janvier 2021 à 12:41:04

    NB: LE SUJET à été modifier car de 1 j'avais aucune solution ni réponse dans ce forum, du coup j'ai cru que j'ai mal expliqué ce que je veux c'est pour ça que j'ai modifier pour faire un autre. Voila

    Bonjour,

    je travaille sur un petit programme, je devrais envoyer des un message à une carte et recevoir la réponse,
    Le message doit être de ce type


    et je veux lire cette information

    Le code pour envoyer le message 
    
    public void senderUdpClient(char message_Type, byte Command_Class, byte command_code,Int32 argument_Comm)
            {
                string serverIP = "192.168.2.11";
                int sendPort = 40960;
                List<char> tx_buffer2 = new List<char>();
                byte Cs = 0;
                //BufferSend
    
                tx_buffer2.Add(message_Type);
                tx_buffer2.Add((char)Command_Class);
                tx_buffer2.Add((char)command_code);
                tx_buffer2.Add((char)argument_Comm);
    
                for (int i = 0; i < tx_buffer2.Count; i++)
                {
                    Cs += Convert.ToByte(tx_buffer2[i]);
                }
    
                tx_buffer2.Add((char)Cs);   
                
                UdpClient senderClient = new UdpClient();
    
                sendEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), sendPort);
                try
                {
                    senderClient.Connect(this.sendEndPoint);
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString());
    
                }
                Byte[] sendBytes = Encoding.ASCII.GetBytes(tx_buffer2.ToArray());
                senderClient.Send(sendBytes, sendBytes.Length);
                senderClient.Close();
    
                MessageBox.Show("Message Sent");
            }

    Le code pour la lecture

     public void readerUdpClient()
            {
                string serverIP = "192.168.2.11";
                int receivePort = 40961;
                try
                {
                    var remoteEP = new IPEndPoint(IPAddress.Parse(serverIP), receivePort);
                    UdpClient readerClient = new UdpClient();
                    readerClient.Connect(remoteEP);
                    byte[] bytesReceived = readerClient.Receive(ref remoteEP);
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString());
                }
            }

    Event Button

            private void Btn_Save_Click(object sender, EventArgs e)
            {
                ObjHundler.senderUdpClient('1', 1, 0x22, 1);
                ObjHundler.readerUdpClient();
                MessageBox.Show("okkk");
            }



    Le programme ne marche pas , il se bloque dans cette ligne sans aucun message d’erreur

     byte[] bytesReceived = readerClient.Receive(ref remoteEP);

    -
    Edité par MagAka 27 janvier 2021 à 16:20:12

    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2021 à 13:14:24

      Bonjour,

      et donc le problème ?

      Tu nous donnes aucun code qui écrit le message...

      • Partager sur Facebook
      • Partager sur Twitter
        25 janvier 2021 à 13:37:29

        !

        -
        Edité par MagAka 25 janvier 2021 à 13:38:36

        • Partager sur Facebook
        • Partager sur Twitter
          25 janvier 2021 à 14:41:32

          Charmant. Vider son message de son contenu (quelqu'en soit la raison) n'est pas très élégant, et surtout s'il s'agit d'un sujet où tu poses une question… La moindre des choses serait de remettre le premier message comme il était à l'origine et de poster la solution, puisque c'est résolu, afin de partager ladite solution.
          • Partager sur Facebook
          • Partager sur Twitter

          Pas d'aide concernant le code par MP, le forum est là pour ça :)

            25 janvier 2021 à 14:43:55

            @Lamecarlarte ne cherche pas, je viens de regarder sur Developpez, le même topic a été créé et il est dans le même état, donc il/elle ne reviendra pas.

            Tu peux fermé et même supprimer si c'est possible

            • Partager sur Facebook
            • Partager sur Twitter
              25 janvier 2021 à 15:08:14

              Bonjour, effectivement supprimer ses message n'est pas chose à faire, je recopie ci après le message d'origine.

              MouadLyriciste a écrit:

              Bonjour, je travaille sur un petit programme, je devrais envoyer des un message à une carte et recevoir la réponse,

              Je veux quelqu'un qui peut m'aider à bien construire mon message en respectant bien la structure donnée (string sendString = "Message!"

              public static void senderUdpClient()
                      {
                          UdpClient senderClient = new UdpClient();
                          senderClient.Connect(sendEndPoint);
                          string sendString = "Message!";
                          Byte[] sendBytes = Encoding.ASCII.GetBytes(sendString);
                          Thread t = new Thread(() => {
                              while (true)
                              {
                                  senderClient.Send(sendBytes, sendBytes.Length);
                                  Thread.Sleep(1000);
                              }
                          });
                          t.Start();
                      }

              le message que je dois envoyer dois être de cette structure

              et je veux lire cette information

              Ma Classe UDPHandler

              class UDPHandler
                 {
                     private int receivePort, sendPort;
                     private string serverIP;
                     public static IPEndPoint sendEndPoint, receiveEndPoint;
               
                     public UDPHandler(string serverIP, int receivePort, int sendPort)
                     {
                         this.serverIP = serverIP;
                         this.receivePort = receivePort;
                         this.sendPort = sendPort;
                         sendEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.sendPort);
                         receiveEndPoint = new IPEndPoint(IPAddress.Parse(this.serverIP), this.receivePort);
                     }
               
                     public static void senderUdpClient()
                     {
                         UdpClient senderClient = new UdpClient();
                         senderClient.Connect(sendEndPoint);
                         string sendString = "Message!";
                         Byte[] sendBytes = Encoding.ASCII.GetBytes(sendString);
                         Thread t = new Thread(() => {
                             while (true)
                             {
                                 senderClient.Send(sendBytes, sendBytes.Length);
                                 Thread.Sleep(1000);
                             }
                         });
                         t.Start();
                     }
               
                     public static void readerUdpClient()
                     {
                         UdpClient readerClient = new UdpClient();
                         IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Any, 3000);
                         readerClient.Client.Bind(localEndpoint);          //Tried both Connect and Bind
                         //readerClient.Connect(this.receiveEndPoint);
                         Thread t = new Thread(() => {
                             Console.WriteLine("Awaiting data from server...");
                             var remoteEP = new IPEndPoint(IPAddress.Any, 3000);
                             byte[] bytesReceived = readerClient.Receive(ref remoteEP);
                             //The above throws:     System.InvalidOperationException: 'You must call the Bind method before performing this operation'
                             Console.WriteLine("Received data from " + remoteEP.ToString());
                         });
                         t.Start();
                     }
                 }<br><br>

              Ma form1

              public partial class Form1 : Form
                  {
                      public Form1()
                      {
                          InitializeComponent();
                          string serverIP = "192.168.2.11";
                          int sendPort = 40960;
                          int receivePort = 40961;
                          UDPHandler ObjHundler = new UDPHandler(serverIP, receivePort, sendPort);
                      }
               
                      private void button1_Click(object sender, EventArgs e)
                      {
                          UDPHandler.senderUdpClient();
                          UDPHandler.readerUdpClient();
                      }
                  }


              • Partager sur Facebook
              • Partager sur Twitter
                27 janvier 2021 à 16:19:04

                NB: LE SUJET à été modifier car de 1 j'avais aucune solution ni réponse dans ce forum, du coup j'ai cru que j'ai mal expliqué ce que je veux c'est pour ça que j'ai modifier pour faire un autre. Voila
                • Partager sur Facebook
                • Partager sur Twitter
                  27 janvier 2021 à 16:35:43

                  Aucune réponse ?

                  J'attends toujours la réponse à ma question

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 janvier 2021 à 17:28:28

                    Matioso a écrit:

                    Aucune réponse ?

                    J'attends toujours la réponse à ma question

                    C'est la ou je constitue mon message, avec type de message, command class, command code, et l'argument

                    pour le checksum je le calcule aprés dans la variable CS

                    mais je sais pas si c'est exactement ce que ça devrais être le message

                    Le code pour envoyer le message
                     
                    public void senderUdpClient(char message_Type, byte Command_Class, byte command_code,Int32 argument_Comm)
                            {
                                string serverIP = "192.168.2.11";
                                int sendPort = 40960;
                                List<char> tx_buffer2 = new List<char>();
                                byte Cs = 0;
                                //BufferSend
                     
                                tx_buffer2.Add(message_Type);
                                tx_buffer2.Add((char)Command_Class);
                                tx_buffer2.Add((char)command_code);
                                tx_buffer2.Add((char)argument_Comm);
                     
                                for (int i = 0; i < tx_buffer2.Count; i++)
                                {
                                    Cs += Convert.ToByte(tx_buffer2[i]);
                                }
                     
                                tx_buffer2.Add((char)Cs);  
                                 
                                UdpClient senderClient = new UdpClient();
                     
                                sendEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), sendPort);
                                try
                                {
                                    senderClient.Connect(this.sendEndPoint);
                                }
                                catch (Exception err)
                                {
                                    MessageBox.Show(err.ToString());
                     
                                }
                                Byte[] sendBytes = Encoding.ASCII.GetBytes(tx_buffer2.ToArray());
                                senderClient.Send(sendBytes, sendBytes.Length);
                                senderClient.Close();
                     
                                MessageBox.Show("Message Sent");
                            }


                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 janvier 2021 à 8:04:09

                      Voila, il manquait ce code !

                      Je ne pense pas que le message est bon.

                      Il te manque l'argument 2 qui fait que ton message est trop court.

                      Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 janvier 2021 à 15:32:50

                         
                        	Le code en C# si quelqu'un en a besoin 
                         
                                    // Calcul CheckSum
                                    // We know the message plus the checksum has length 12
                                    var packedMessage2 = new byte[12];
                                    // We use the new Span feature
                                    var span = new Span<byte>(packedMessage2);
                                    // We can directly set the single bytes
                                    span[0] = message_Type;
                                    span[1] = Command_Class;
                                    span[2] = command_code;
                                    // The pack is <, so little endian. Note the use of Slice: first the position (3 or 7), then the length of the data (4 for int)
                                    BinaryPrimitives.WriteInt32LittleEndian(span.Slice(3, 4), argument1);
                                    BinaryPrimitives.WriteInt32LittleEndian(span.Slice(7, 4), argument2);
                                    // The checksum
                                    // The sum is modulo 255, because it is a single byte.
                                    // the unchecked is normally useless because it is standard in C#, but we write it to make it clear
                                    var sum = unchecked((byte)packedMessage2.Take(11).Sum(x => x));
                                    // We set the sum
                                    span[11] = sum;
                                    // Without checksum
                                    Console.WriteLine(string.Concat(packedMessage2.Take(11).Select(x => $@"\x{x:x2}")));
                                    // With checksum
                                    Console.WriteLine(string.Concat(packedMessage2.Select(x => $@"\x{x:x2}")));
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 janvier 2021 à 19:18:40

                          Matioso a écrit:

                          Voila, il manquait ce code !

                          Je ne pense pas que le message est bon.

                          Il te manque l'argument 2 qui fait que ton message est trop court.

                          Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)

                          11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)

                          La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?

                          Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 janvier 2021 à 8:51:27

                            umfred a écrit:

                            Matioso a écrit:

                            Voila, il manquait ce code !

                            Je ne pense pas que le message est bon.

                            Il te manque l'argument 2 qui fait que ton message est trop court.

                            Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)

                            11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)

                            La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?

                            Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)


                            Oh punaise, j'avais mal lu xD

                            Mais de toute façon le code n'était pas bon.

                            Mais ne cherche pas de réponse, il/elle a trouvé du code sur internet et la traduit en C# sans se poser de question

                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 janvier 2021 à 9:54:08

                              umfred a écrit:

                              Matioso a écrit:

                              Voila, il manquait ce code !

                              Je ne pense pas que le message est bon.

                              Il te manque l'argument 2 qui fait que ton message est trop court.

                              Ton checksum non plus, il doit seulement prendre les 11 derniers bits (byte veut dire octet, un octet contient 8 bits)

                              11 bytes, soit les 11 octets qui composent le message. le check sum est sur 1 octet (8bits)

                              La commande est mal envoyée si tu ne reçois pas de réponse. Pourquoi tu envoies le caractère '1' (soit 0x31) pour le 1er octet et la valeur 1 pour le second ? les 2 sont de même type, non ?

                              Le message à envoyer devrait être 1, 1, 0x22, 0x00,0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24 (qui est le CRC=0x22+1+1+8*0=0x24); les argument sont à mettre à 0 (si il faut les transmettre) (attention les arguments sont sur 32 bits donc 4 octets chacun)

                              Enfin une réponse pertinente et bien expliqué, Merci à vous

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Udp Socket send receive

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown