如何使用 TCP 在两个独立房屋中的两个 Raspberry Pi 之间发送数据
How to send data between two Raspberry Pis in two separate houses using TCP
所以我想弄清楚如何在两个 Pi 零 W 单元之间发送字符串数据。我希望其中一个和我在一起,其中一个和我的一个朋友在她家里。我真的很困惑这将如何工作。我发现了一些似乎适用于我家两个单元的代码,但是在将 IP 地址更改为我朋友的 public IP 并尝试在她家使用它之后,没有任何结果。我对使用 Internet 协议还很陌生,因此我们将不胜感激。
Send.py
import sys
from socket import socket, AF_INET, SOCK_DGRAM
SERVER_IP = ''
PORT_NUMBER = 5000
SIZE = 1024
print ("Test client sending packets to IP {0}, via port
{1}\n".format(SERVER_IP,
PORT_NUMBER))
mySocket = socket( AF_INET, SOCK_DGRAM )
while True:
myMessage = input()
mySocket.sendto(myMessage.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
sys.exit()
Receive.py
#!/usr/bin/env python3
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import sys
PORT_NUMBER = 5000
SIZE = 128
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.bind( (hostName, PORT_NUMBER) )
print ("Test server listening on port {0}\n".format(PORT_NUMBER))
while True:
(data,addr) = mySocket.recvfrom(SIZE)
print(data.decode('utf-8'))
sys.exit()
如果你想将它们连接在一起:
- 侦听传入 TCP 连接 (Receive.py) 的 RPI 必须在 RPI (https://raspberrypi.stackexchange.com/questions/69123/how-to-open-a-port)
上打开防火墙端口
- 必须在您的家庭路由器上打开将 RPI 连接到 ISP 的端口
- 您的 RPI 不能落后于提供商的 NAT 网络 - 有时,您可以从提供商那里购买静态 IP 地址,该地址不会更改,或者至少 public IP 地址会随时间动态变化。
您可以在路由器管理页面检查您是否落后于 NAT,检查路由器从 ISP 分配的 IP 是否与 Internet 上的服务器看到的 IP 地址相同。执行此查询:
https://www.google.com/search?q=what+is+my+ip+address)
如果它们相同,则说明您不在 ISP 的 NAT 后面,问题可能不存在。如果不同,您将与其他 ISP 的客户共享 IP,并且您不能 运行 您自己的服务器应用程序会将其端口公开到互联网。
所以我想弄清楚如何在两个 Pi 零 W 单元之间发送字符串数据。我希望其中一个和我在一起,其中一个和我的一个朋友在她家里。我真的很困惑这将如何工作。我发现了一些似乎适用于我家两个单元的代码,但是在将 IP 地址更改为我朋友的 public IP 并尝试在她家使用它之后,没有任何结果。我对使用 Internet 协议还很陌生,因此我们将不胜感激。
Send.py
import sys
from socket import socket, AF_INET, SOCK_DGRAM
SERVER_IP = ''
PORT_NUMBER = 5000
SIZE = 1024
print ("Test client sending packets to IP {0}, via port
{1}\n".format(SERVER_IP,
PORT_NUMBER))
mySocket = socket( AF_INET, SOCK_DGRAM )
while True:
myMessage = input()
mySocket.sendto(myMessage.encode('utf-8'),(SERVER_IP,PORT_NUMBER))
sys.exit()
Receive.py
#!/usr/bin/env python3
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import sys
PORT_NUMBER = 5000
SIZE = 128
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket( AF_INET, SOCK_DGRAM )
mySocket.bind( (hostName, PORT_NUMBER) )
print ("Test server listening on port {0}\n".format(PORT_NUMBER))
while True:
(data,addr) = mySocket.recvfrom(SIZE)
print(data.decode('utf-8'))
sys.exit()
如果你想将它们连接在一起:
- 侦听传入 TCP 连接 (Receive.py) 的 RPI 必须在 RPI (https://raspberrypi.stackexchange.com/questions/69123/how-to-open-a-port) 上打开防火墙端口
- 必须在您的家庭路由器上打开将 RPI 连接到 ISP 的端口
- 您的 RPI 不能落后于提供商的 NAT 网络 - 有时,您可以从提供商那里购买静态 IP 地址,该地址不会更改,或者至少 public IP 地址会随时间动态变化。
您可以在路由器管理页面检查您是否落后于 NAT,检查路由器从 ISP 分配的 IP 是否与 Internet 上的服务器看到的 IP 地址相同。执行此查询:
https://www.google.com/search?q=what+is+my+ip+address)
如果它们相同,则说明您不在 ISP 的 NAT 后面,问题可能不存在。如果不同,您将与其他 ISP 的客户共享 IP,并且您不能 运行 您自己的服务器应用程序会将其端口公开到互联网。