2017-08-11 2 views
0

Ich versuche, Daten über TCP zu lesen, zu speichern und gleichzeitig zu plotten. Bisher lese ich die Daten und speichere sie in einer Textdatei, aber ich habe Probleme damit. Die Daten kommen als String und ich konnte nicht herausfinden, wie man es in int oder float umwandelt. Oder wie man die Werte in ein Array zum Plotten übergibt.Wie plotten Daten, die von TCP kommen?

Hier sind meine Codes:

Server:

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() 

Auftraggeber:

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() 

Kann mir jemand helfen?

Vielen Dank im Voraus!

Antwort

0

Der Umgang mit nackten Binärdaten von TCP ist unordentlich. Möglicherweise möchten Sie Ihre Daten auf einer Seite serialisieren, so dass sie über TCP-Verbindungen übertragen und auf der anderen Seite wiederhergestellt werden können. Dann sollten Sie möglicherweise ein Trennzeichen zum Teilen von Abschnitten der serialisierten Daten definieren. Sie können die Daten beispielsweise in das JSON-Format serialisieren und '\0' als Trennzeichen behandeln. So auf der Server-Seite, die Sie senden:

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

Und auf der Client-Seite, Sie halten erhalten bis zum Erreichen ‚\ 0‘, wandeln die empfangenen Teil zurück in Python dict, und weiterhin das nächste Stamm erhalten.

Werfen Sie einen Blick auf https://github.com/mdebbar/jsonsocket/blob/master/jsonsocket.py für ein großes einfaches Beispiel.

0

Ich denke, dass Sie diesem Beispiel folgen können, ich bin eine Verbindung zu einem TCP-Socket erstellen und nachdem ich ein animiertes Diagramm zum Drucken der Informationen erstellen (um zu vermeiden, verwenden Sie die True zum Lesen von Daten vom Server).

# 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()