Упаковка данных с помощью TCP

#python #sockets #tcp

#python #сокеты #tcp

Вопрос:

У меня есть скрипт, который считывает данные из АЦП, которые я хотел бы передать через TCP. Две рассматриваемые машины подключены через Ethernet, и у меня уже есть рабочая серверно-клиентская платформа, т.е. я могу отправить «привет, мир». Я довольно новичок в работе в сети, и мне было интересно, какие процессы используются для передачи данных. Как мне включить функцию для чтения значений АЦП с помощью сокетов?

Сервер:

 import socket
import sys

#Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#bind the socket to the port
server_address = ('0.0.0.0', 10000)
print >> sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
 

#прослушивание входящего соединения
sock.listen(1)

 while True:
    #wait for connection
    print >> sys.stderr, 'waiting for connection'
    connection, client_address = sock.accept()

try:
    print >> sys.stderr, 'connection from', client_address

    #receive data in small chunks
    while True:
       data = connection.recv(16)
       print >> sys.stderr, 'received "%s"' % data
       if data:
           print >> sys.stderr, 'sending data back to client'
           connection.sendall(data)
       else:
           print >> sys.stderr, 'no more data from', client_address
           break

finally:
    #clean up connection
    connection.close()
 

Клиент:

 import socket
import sys

#Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


#bind the socket to the port
server_address = ('SERVER_IP', 10000)

print >> sys.stderr, 'connecting to %s port %s' % server_address
sock.connect(server_address)

try:
    #send data
    message = 'Transmitting this message . . .'
    print >> sys.stderr, 'sending "%s"' % message
    sock.sendall(message)

    #look for response
    amount_received = 0
    amount_expected = len(message)

        while amount_received < amount_expected:
            data = sock.recv(24)
            amount_received  = len(data)
            print >> sys.stderr, 'received "%s"' % data
finally:
        print >> sys.stderr, 'closing socket'
        sock.close()
 

И функция, которая считывает значения АЦП, которые я хочу интегрировать:

 def readadc(adcnum):


        #this function will open the SPI and read it to see the current value
        # this will then be written to a text value
        # using the write_to_file function

    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([1,8   adcnum << 4,0])

    adcout = ((r[1] amp; 3) << 8)   r[2]
    return adcout


while True:
    Inp1 = int(round(readadc(0)/10.24))  # defines Inp1 as an integer to be read in
    count = count  1
    time.sleep(0.1)                      # puts the system to sleep for 0.1 seconds
 

Комментарии:

1. Опубликуйте некоторый код для отправки «hello world» и некоторый код, который показывает данные, которые вы на самом деле пытаетесь отправить.

2. Не используйте сокеты, а фреймворк более высокого уровня, если у вас нет особых причин для создания низкоуровневых сокетов. Простые способы — создать веб-сервер, [XML] RPC или, возможно, использовать ZeroMQ (который находится где-то между первым и TCP-сокетами).

3. TCP просто показался лучшим вариантом из того, что я читал, я приведу некоторые примеры кода.

Ответ №1:

Я не тестировал это, и я редко касаюсь python, но я думаю, что вы можете использовать только pickle свои данные. Что-то вроде:

 # Write 
fp = sock.makefile('wb')
pickle.dump(Inp1, fp)

# Read
fp = connection.makefile('rb')
pickle.load(fp)