У меня есть 2 Raspberry pi и ноутбук, пытающийся общаться в следующей архитектуре.
Rpi-1 общается с Rpi 2 через Wi-Fi
RPi-2 затем передает данные на ПК.
Rpi-1 действует как конечные узлы (еще немного будет добавлено позже)
Rpi-2 действует как концентратор данных, который объединяет данные со всех конечных узлов.
Я попытался с кодом клиентского сервера TCP таким образом.
Rpi-1 клиент для RPi1,
Сервер Rpi2 для RPi1 и клиент для ПК
ПК как сервер для RPi2
Это технически правильно? сделать RPi2 как клиентом, так и сервером для разных машин
Я пытался передать только RPi 1 - Rpi 2 и Rpi2 - только ПК. Он работает нормально, но когда я интегрировал оба, он не отправлял никаких данных на ПК.
import socket
host = '172.17.116.207'# ip of the DC
port = 5560
def setupSocket():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
return s
def sendReceive(s, message):
s.send(str.encode(message))
print("Message transmitted")
reply = s.recv(1024)
print("We have received a reply.")
print("Send closing message.")
s.send(str.encode("EXIT"))
s.close()
reply = reply.decode('utf-8')
return reply
def transmit(message):
s = setupSocket()
response = sendReceive(s, message)
return response
#code for RPi1
from time import sleep
from monitor_client import transmit
sleepTime = 20
def PhasorDataMonitor():
message="aa0100341e3644853600000041b10000392b0000e36ace7ce36a31830444000009c4000042c80000447a0000461c40003c12d43f"
print("Transmitting Data.")
response = transmit(message)
print(response)
while True:
PhasorDataMonitor()
sleep(sleepTime)
#code for Rpi2
#Use this script to send and receive data over TCP/IP
import socket
#host_PC = '172.17.116.207'
host_PC = '172.17.116.35'
port = 5561
def setupSocket():
s_PC = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_PC.connect((host_PC, port))
return s_PC
def sendReceive(s_PC, message):
s_PC.send(str.encode(message))
print("Message transmitted")
reply = s_PC.recv(1024)
print("We have received a reply.")
print("Send closing message.")
s_PC.send(str.encode("EXIT"))
s_PC.close()
reply = reply.decode('utf-8')
return reply
def transmit(message):
s_PC = setupSocket()
response = sendReceive(s_PC, message)
return response
#code in RPi2
import socket
from time import sleep
from monitor_client_DC import transmit
sleepTime = 5
host = '172.17.116.207'
port = 5560
def setupServer():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Socket created.")
try:
s.bind((host, port))
except socket.error as msg:
print(msg)
print("Socket bind complete.")
return s
def setupConnection():
s.listen(1)
conn, address = s.accept()
print("Connected to: " + address[0] + ":" + str(address[1]))
return conn
def dataTransfer(conn):
while True:
data = conn.recv(1024)
data = data.decode('utf-8')
print(data)
reply = 'Closing socket'
conn.sendall(str.encode(reply))
Print("Reply has been send.")
conn.close()enter code here
s = setupServer()
while True:
try:
conn = setupConnection()
dataTransfer(conn)
sleep(sleepTime)
message="aa0100341e3644853600000041b10000392b0000e36ace7ce36a31830444000009c4000042c80000447a0000461c40003c12d43f"
print("Transmitting Data to PC.")
response = transmit(message)
print(response)
sleep(sleepTime)
except:
break
#code in PC
import socket
host = '172.17.116.35'
#host = '192.168.43.199'
port = 5561
def setupServer():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Socket created.")
try:
s.bind((host, port))
except socket.error as msg:
print(msg)
print("Socket bind complete.")
return s
def setupConnection():
s.listen(1)
conn, address = s.accept()
print("Connected to: " + address[0] + ":" + str(address[1]))
return conn
def dataTransfer(conn):
while True:
data = conn.recv(1024)
data = data.decode('utf-8')
print(data)
reply = 'Unknow`enter code here` Command'
conn.sendall(str.encode(reply))
Print("Reply has been send.")
conn.close()
s = setupServer()
while True:
try:
conn = setupConnection()
dataTransfer(conn)
except:
break
Я должен получить сообщение на ПК, но только до Rpi2