récupération donnée dans des paquet UDP

récupération donnée dans des paquet UDP - Python - Programmation

Marsh Posté le 16-03-2015 à 16:15:37    

Salut a tous  :hello:  
 
Je bosse sur un projet de réseau de capteurs, ces dernier envoie leur données via le réseau TCP/IP dans des paquet UDP.
 
Savez -vous comment je pourrais récupérer les données de ces paquet UDP via un petit programme ( en quel langage je ne sais pas encore. a déterminer, je suis ouvert a toute proposition =)
l'objectif serai de pouvoir écrire ces donneés dans des fichiers texte brut , pour ensuite y ecrire proprement dans une base mysql
 
Merci de votre aide =)


Message édité par lysitheas le 17-03-2015 à 08:47:28

---------------
Rog G501 | win8.1 | Linux Mint 17.3 | use TLP fom linrunner for battery use on Liunx. | Visit my site : opentrux.fr
Reply

Marsh Posté le 16-03-2015 à 16:15:37   

Reply

Marsh Posté le 16-03-2015 à 18:13:14    

Si tu veux juste vérifier que ça fonctionne, tu peux utiliser l'outil netcat (installé en standard sous OS X et linux), avec une commande du genre:

$ nc -l -u -p 12345


Écoutera sur le port UDP 12345. Si c'est du binaire qui est envoyé, tu ne verra probablement rien d'intéressant. Si tu veux faire ça par programme, tu peux te baser sur ce genre de pseudo-code :

Code :
  1. SOCKADDR_IN addr_local;
  2. SOCKADDR_IN addr_dest;
  3. SOCKET      sock;
  4.  
  5. /* We now accept packet on given UDP port, send query */
  6. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  7.  
  8. if (sock == -1) return;
  9.  
  10. memset(&addr_local, 0, sizeof addr_local);
  11. addr_local.sin_port   = htons(port);
  12. addr_local.sin_family = AF_INET;
  13.  
  14. if (bind(sock, (PSOCKADDR) &addr_local, sizeof addr_local) == 0)
  15. {
  16.     TEXT packet[512];
  17.     int  len, slen = sizeof addr_dest;
  18.  
  19.     while ((len = recvfrom(sock, packet, sizeof packet, 0, (SOCKADDR *) &addr_dest, &slen)))
  20.     {
  21.         /* Tu viens de recevoir un packet de <len> octet dans <packet> */
  22.     }
  23.     closesocket(sock);
  24. }


Note: ça utilise l'API winsock et non BSD. À toi de faire la conversion.

Reply

Marsh Posté le 16-03-2015 à 20:48:12    

A noter qu'un datagramme UDP ne peut être reçu que par un seul appel recvfrom à la fois. Si la taille précisée dans recvfrom est inférieure à la taille du datagramme réellement reçu, le reste sera perdu. Ceci peut être problématique dans le cas de la réception de datagrammes grands et de tailles variables ( ce qu'il ne faudrait pas faire dans l'absolu ).

Reply

Marsh Posté le 17-03-2015 à 08:50:46    

Merci pour vos réponse, je voit que ca à l'air possible  :lol:  
 
Quand tu parle de pseudo code, on est en C (c'est ca ^^)
 
y'aurai pas moyen de faire ca en python ?


---------------
Rog G501 | win8.1 | Linux Mint 17.3 | use TLP fom linrunner for battery use on Liunx. | Visit my site : opentrux.fr
Reply

Marsh Posté le 17-03-2015 à 11:55:17    

C'est le b a ba de la programmation réseau, ça, tu prends n'importe quel bouquin de programmation réseau dans le langage de ton choix et tu auras des exemples de code.
Si tu veux en python, tu cherches dans un bouquin python/réseau.
Suffit de taper "python udp client" dans la recherche google pour avoir un tas d'exemples.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-03-2015 à 11:42:11    

Hey salut tout le monde !  :hello:  
Après quelque recherche, voici ce que j'ai trouvé:
Code server.py

Code :
  1. root@oxygen:~/capteur/serv_cli_udp# cat receiv.py
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. import sys
  5. import MySQLdb
  6. import socket
  7. import time
  8. UDP_IP = "127.0.0.1"
  9. UDP_PORT = 5005
  10. sock = socket.socket(socket.AF_INET, # ca c'est pour internet
  11.                         socket.SOCK_DGRAM) # et ca pour UDP
  12. sock.bind((UDP_IP, UDP_PORT))
  13. while True:  # boucle infinie pour recupérer les data
  14.         data, addr = sock.recvfrom(1024) # on dit que le buffer faire 1024 bytes
  15.         print "received data : ",data


 
et client:

Code :
  1. root@oxygen:~/capteur/serv_cli_udp# cat sending.py
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. import sys
  5. import MySQLdb
  6. import socket
  7. import time
  8. print "This is ths send UDP paquet program"
  9. UDP_IP = "127.0.0.1"
  10. UDP_PORT = 5005
  11. MESSAGE = raw_input("Tapez votre message : " )
  12. print "Envoie de '", MESSAGE, "'"
  13. print "UDP Target ip : ", UDP_IP
  14. print "UDP Targer port : ",UDP_PORT
  15. print "message :", MESSAGE
  16. sock = socket.socket(socket.AF_INET, # ca c'est internet
  17.                         socket.SOCK_DGRAM) # mode datagram pour UDP
  18. sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))


 
 
Ma question est maintenant que j'arrive a transmettre des données via des paquet UDP.
j'aimerai pouvoir lire les en-tete UDP. le but serai de recupérer:
port source | Port  destinaion | longueur | checkSUM
 
Merci =)


Message édité par lysitheas le 20-03-2015 à 11:43:03

---------------
Rog G501 | win8.1 | Linux Mint 17.3 | use TLP fom linrunner for battery use on Liunx. | Visit my site : opentrux.fr
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed