2017-08-11 6 views
0

J'essaie de lire des données sur TCP, de les enregistrer et de les tracer en même temps. Jusqu'à présent, je suis en train de lire les données et d'enregistrer dans un fichier texte, mais j'ai un problème avec le tracé. Les données arrivent en tant que chaîne et je ne pouvais pas comprendre comment le convertir en int ou float. Ou comment passer les valeurs dans un tableau à tracer.Comment tracer des données provenant de TCP?

Voici mes codes:

Serveur:

import socket 
import mraa 
import time 
import numpy 

host = '172.20.61.19' 
port = 5000 

x = mraa.Gpio(20) 
x.dir(mraa.DIR_OUT) 

s = socket.socket() 
s.bind((host, port)) 

s.listen(1) 
c, addr = s.accept() 

print "Connection from: " + str(addr) 
while True: 
     x.write(1) 
     time.sleep(2) 
     data = x.read() 
     print str(data) 
     c.send(str(data)) 
     x.write(0) 
     time.sleep(0.5) 
     data = x.read() 
     print str(data) 
     c.send(str(data)) 
s.close() 

Client:

import socket 
from collections import deque 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

plt.ion() 

fig = plt.figure() 
ax = fig.add_subplot(111) 

host = '172.20.61.19' 
port = 5000 

s = socket.socket() 
s.connect((host,port)) 

while True: 
    data = s.recv(1024) 
    print data 
    secPlot = ax.plot(int(data), 'b-') 
    fig.canvas.draw() 
s.close() 

Quelqu'un peut-il me aider?

Merci d'avance!

Répondre

0

Traiter les données binaires nues de TCP est désordonné. Vous voudrez peut-être sérialiser vos données d'un côté afin qu'elles puissent voyager à travers les connexions TCP et être restaurées de l'autre côté, alors vous voudrez peut-être définir un séparateur pour séparer les sections des données sérialisées. Par exemple, vous pouvez sérialiser les données au format JSON et traiter le '\0' comme séparateur. Donc, du côté du serveur, vous envoyez:

{'data':[1,2,3,4,5]}\0{'data':[6,7,8]}\0{'data':...

Et du côté client, vous continuez à recevoir jusqu'à atteindre « \ 0 », convertir la partie réintégrées dans Python dict et continuer recevoir le tronc suivant. Regardez un https://github.com/mdebbar/jsonsocket/blob/master/jsonsocket.py pour un excellent exemple simple.

0

Je pense que vous pouvez suivre cet exemple, je crée une connexion à un socket TCP et après que je crée un graphique animé pour imprimer les informations (pour éviter d'utiliser le temps vrai pour lire les données du serveur).

# get the information (tcp connector, you can keep your client) 
    reader = DataReader() 
    reader.connect(ip=args.ip, port= args.port) 
    # configure x axis (time data) 
    plt.gca().xaxis.set_major_locator(mdates.HourLocator()) 
    plt.gca().xaxis.set_minor_locator(mdates.MinuteLocator()) 
    # define a figure 
    fig, ax = plt.subplots() 
    # this method is in charge of read the data 
    values = [[],[]] 
    def animate(i): 
     # obtain a message from the socket (s.recv(1024)) 
     message = reader.get_message() 
     data_x = message['x'] 
     data_y = message['y'] 
     values[0].append(data_x) 
     values[1].append(data_y) 
     # clear graph 
     ax.clear() 
     # plot the information   
     ax.plot(values[0],values[1],'o-', label= 'my data') 
     # legends 
     ax.legend() 
     xfmt = mdates.DateFormatter('%H:%M:%S') 
     ax.xaxis.set_major_formatter(xfmt) 

    # animate (this line help us replace the while true) 
    # the interval is the time refresh for our graph 
    ani = animation.FuncAnimation(fig, animate, interval=500) 
    # finally we show the image 
    plt.show()