TCP-сервер-клиент для трех устройств - PullRequest
0 голосов
/ 09 июля 2019

У меня есть 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

...