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