Я пытаюсь создать приложение с моим Raspberry Pi 3B, которое получает некоторые данные от подключенных датчиков.Как только я получу данные, я бы хотел отправить их на стационарный компьютер, который находится во внешней сети, через скрипт на Python и библиотеку сокетов.Вот мой код:
На стороне сервера (внешний компьютер):
import socket
ip = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")]
or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]])
+ ["no IP found"])[0]
print("IP ordinateur local: {}".format(ip))
port = 9999
print("Port d'entrée des données sur l'ordinateur local: {}".format(port))
address = ("",port)
serveur = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serveur.bind(address)
serveur.listen(5)
print("En attente de nouvelles connexions")
client, infosClient = serveur.accept()
print("Nouvelle connexion client établie")
print("Infos client: IP = {}, port = {}".format(infosClient[0],infosClient[1]))
msg = "Serveur: connexion acceptee"
client.send(msg.encode())
flag = False
try:
while True:
if flag == False:
msgRecu = client.recv(1024)
print("Message reçu: {}".format(msgRecu.decode()))
msg = input("Entrez une réponse à envoyer \n")
client.send(msg.encode())
print("Réponse envoyée")
print("En attente de la commande d'arrêt")
flag = True
except KeyboardInterrupt:
msg = "Le serveur a enclenché la commande d'arret Ctrl+C"
client.send(msg.encode())
finally:
print("Fermeture de la connexion")
client.close()
serveur.close()
На стороне клиента (RPi):
import socket
ipLocal = (([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")]
or [[(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]])
+ ["no IP found"])[0]
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ipServeur = input("Entrez l'adresse IP du serveur \n")
portServeur = input("Entrez le port du serveur \n")
try:
client.connect((ipServeur,int(portServeur)))
except KeyboardInterrupt:
del client
print("Connexion établie")
msgRecu = client.recv(1024)
print(msgRecu.decode())
msg = input("Entrez un message à envoyer \n")
client.send(msg.encode())
print("Message envoyé")
answer = client.recv(1024)
print("Réponse serveur: {}".format(answer.decode()))
print("Fermeture de la connexion")
client.close()
К сожалению, когда я ввожу IP-адрес, который серверный сценарий дает мне с помощью первой команды (ip = ...
), клиентский сценарий сообщает мне, что я подключен, но серверный еще ожидает подключения.
Я думаю, что это может быть связано с тем, что IP-адрес, который я получаю от команды, является локальным, но я не знаю, как получить внешний, тем более что сеть серверахорошо защищены.Друг сказал мне, чтобы я использовал VPN, но я мало что знаю о том, как он работает, понимаешь?