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

Réseau/Web Python Discussion :

Envoyer une trame d'octets via Ethernet (Conversion)


Sujet :

Réseau/Web Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Par défaut Envoyer une trame d'octets via Ethernet (Conversion)
    Bonjour,

    J'ai fait un code qui à pour but d'envoyer une trame en hexadécimal en utilisant Ethernet entre client serveur: voici mon code:
    Serveur:

    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
    import socket
    import sys
    import time
     
    global msg_recu
     
    def Demande_Trame():
        global msg_recu
        message_1='Demande de resultat de comptage'
        print(message_1)
     
        message_1=message_1.encode('UTF-8')
        connexion_avec_RPI.send(message_1)
        msg_recu=connexion_avec_RPI.recv(1024).decode('UTF-8')
        print('Réponse : ',msg_recu)
        print('Element 1 : ', msg_recu[0])
     
     
    Demarrer=input('Cliquez sur 1 pour demarrer : ')
    if Demarrer == '1':
        port = 10005
        host = 'localhost'
     
        while 1:
                time.sleep(5)
                connexion_principale=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                try:
                    connexion_principale.bind((host,port))
                except socket.error:
                    print("La liaison  a echouee !")
                    sys.exit()
                print("SAE en attente...sur le port {}\n".format(port))
                connexion_principale.listen(5)
                connexion_avec_RPI,info_connexion=connexion_principale.accept()
     
                Demande_Trame()
    Client:

    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
    import socket
    import sys
     
    def x():
        while 1:
            try:
                hote = 'localhost'
                port = 10005
                Connexion_SAE=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                Connexion_SAE.connect((hote,port))
                print("connexion avec l SAE sur le port {}\n".format(port))
     
                #---------------------------------------------------------------
     
                msg_recu=Connexion_SAE.recv(1024).decode('UTF-8')
                print(msg_recu)
     
                trame=str([0x7E, 0x02, 0x73])
     
                trame=trame.encode('UTF-8')
                Connexion_SAE.send(trame)
            except:
                print('Connexion ...')
     
    x()
    Vous pouvez voir que j'ai fais des boucles pour faire tout marcher en automatique, donc le serveur demande la trame le client reçoit son message et lui envoi celle-ci et le serveur la reçoit et puis l'affiche ! jusque la tout est bon, mais quand je veux utiliser les données de cette trame ! c-à-d quand je veux récupéré le 1er élément de la trame, il m'affiche le crochet "[" donc il comprend cette trame comme une chaîne de caractère !

    je sais que c'est un problème de conversion, mais après plusieurs essais avec de nombreux exemple trouver sur internet, j'ai toujours la même chose ! ou bien des erreurs, donc j'ai préféré rester sur mon 1er code qui marche, et puis posé une question pour avoir de bonne proposition et ne pas me perdre.

    Donc ma question est : comment envoyer une trame d'octets par Ethernet et l'affichée en tant que telle? des indications sur les conversions?

    Voici l'affichage de l'exécution du serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SAE en attente...sur le port 10005
     
    Demande de resultat de comptage
    Réponse :  [126, 2, 115]
    Element 1 :  [  # Donc c'est ça le souci (moi je veux avoir le 126 et non le "["
    Je vous remercie

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Les sockets échangent des "bytes" (c'est pour çà que vous faites .encode, .decode) . Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> trame=str([0x7E, 0x02, 0x73])
    0x7E, 0x02, 0x73 sont la représentation litérale d'entier sous forme hexadécimale.
    [0x7E, 0x02, 0x73] est une liste d'entiers.
    au bout du compte appliquer "str" à cette liste va fabriquer une chaîne de caractère qui essaiera de représenter cette liste de façon raisonnable pour que l'humain y reconnaisse une liste d'entiers lorsqu'il fait "print":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> trame
    '[126, 2, 115]'
    Pour que 0x7E, 0x02, 0x73 soient des bytes, il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> trame=bytes([0x7E, 0x02, 0x73])
    >>> trame
    b'~\x02s'
    >>>
    et plus besoin d'.encode pour les expédier...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Au départ tu crées une liste [0x7E, 0x02, 0x73] et ensuite tu en conserves sa représentation en chaîne de caractères, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> trame=str([0x7E, 0x02, 0x73])
    >>> trame
    '[126, 2, 115]'
    >>> trame.encode('UTF-8')
    b'[126, 2, 115]'
    >>>
    Ce qui signifie aussi que les espaces et virgules font désormais aussi partie de l'information, ce qui n'est pas désiré je suppose.
    Que veux-tu transmettre comme information ? c'est quoi [0x7E, 0x02, 0x73] ?


    EDIT: Pour transmettre un flux d'octets j'utilise ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import io
    byteio = io.BytesIO(b"\x7E\x02\x73")
    Je ne l'utilise pas pour le même usage que toi mais rien ne t'empêche d'essayer.
    Donc c'est byteio que tu transmets avec send()

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Par défaut
    Merci infiniment , j'ai très bien compris mon erreur, et cela marche très bien en changeant les lignes concernées, maintenant je peux donc traiter les données de la trame comme je le voulais, mais y'a juste un petit soucis d'affichage que je n'arrive pas à résoudre !

    Serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def Demande_Trame():
        global msg_recu
        msg_recu=[]
        message_1='Demande de resultat de comptage'
        print(message_1)
     
        message_1=message_1.encode('UTF-8')
        connexion_avec_RPI.send(message_1)
        msg_recu=connexion_avec_RPI.recv(1024)
        print('Réponse : ', msg_recu)
        print('Element 1 : ', msg_recu[0])
    Client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    trame=bytes([0x7E, 0x02, 0x73])
     
                #trame=trame.encode('UTF-8')
                Connexion_SAE.send(trame)
    Affichage Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SAE en attente...sur le port 10005
     
    Demande de resultat de comptage
    Réponse :  b'~\x02s'
    Element 1 :  126
    j'aimerais afficher normalement la réponse (Réponse : b'~\x02s') en (Réponse : 126, 2, 115 ou alors 0x7E, 0x02, 0x73)
    j'ai donc essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print('Réponse : ', bytes(msg_recu))
    toujour le meme affichage
    alors j'ai essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print('Réponse : ', hex(msg_recu))
    J'ai eu cette erreur : TypeError: 'bytes' object cannot be interpreted as an integer

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Par défaut
    Mais ce n'est qu'un problème d'affichage et cela ne gênera pas la suite, l'essentiel c'est que j'ai mes données de trames , donc merci infiniment

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Par défaut
    Je vous remercie VinsS, je comprend plus maintenant, et grâce à la première explication de wiztricks, ça marche !
    Merci à tous

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

Discussions similaires

  1. envoyer une Trame via port com
    Par samirraoui dans le forum VB.NET
    Réponses: 9
    Dernier message: 21/05/2015, 21h31
  2. Envoyer une trame via port série
    Par Lacmé dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 21/04/2015, 08h52
  3. Envoyer une trame ethernet
    Par antoine2641 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/11/2011, 14h43
  4. [USB]envoyer une trame sur le port USB
    Par ced38100 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 12h54
  5. [Réseau] Envoyer une trame tcp
    Par heid dans le forum Web & réseau
    Réponses: 5
    Dernier message: 18/07/2005, 13h07

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