Scambiare dati tra computer utilizzando il protocollo udp
(informazioni aggiuntive seguendo questo link Python UDP)
Ho la necessità di scambiare dati tra una scheda Raspberry e un computer che fanno parte di una rete locale. Il metodo più veloce è quello di utilizzare il protocollo UDP perchè è molto semplice da implementare, veloce e funzionale. In particolare il codice che gira sul Raspberry deve inviare una stringa contenente le informazioni sullo stato di attivazione di otto relay. Questa stringa è composta da otto etichette separate da un carattere di due punti (:). L’etichetta varia in funzione dello stato del relay, La parte di gestione dei relay e della modifica della stringa è stata ommessa per semplificare il codice.
Il programma Python che gira sul Raspberry crea un thread che ogni tre secondi invia la stringa verso il computer locale. Ho inserito dei commenti per descrivere le varie istruzioni del programma:
codice python raspberry:
#python udp raspberry import socket import threading import time #IP computer locale UDP_IP_ADDR = "192.168.178.24" #Porta computer locale UDP_PORT_NUMBER = 20001 #Creo una tupla ip_port_Data = (UDP_IP_ADDR, UDP_PORT_NUMBER) #Stringa contenente lo stato dei relay relay_status = "RL01_OFF:RL02_OFF:RL03_OFF:RL04_OFF:RL05_OFF:RL06_OFF:RL07_OFF:RL08_OFF" #funzione per invio dei dati via UDP viene eseguita dal thread def client_Send_Data(): print("Avvio THREAD Send Data...") #Crea un socket udp per l'invio e la ricezione di dati serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: #converto la stringa in byte msgToSend = str.encode(relay_status) #invio i dati specificando ip e porta serversocket.sendto(msgToSend, ip_port_Data) #attendo 3 secondi time.sleep(3) if __name__=="__main__": #Avvio un thred print("Start program") t1 = threading.Thread(target=client_Send_Data) t1.start()
Il codice che invece gira sul computer locale deve mettersi in ascolto sulla porta utilizzata per l’invio dei dati, attendere la ricezione dei dati e poi mostrarli sulla console. Anche in questo codice ho inserito diversi commenti che spiegano le varie istruzioni:
codice python computer
#python udp computer import socket import threading import time #IP computer locale UDP_IP_LISTENER = "192.168.178.24" #Porta computer locale UDP_PORT_LISTENER = 20001 #creo una tupla ip_port_Listener = (UDP_IP_LISTENER, UDP_PORT_LISTENER) def client_Receive_Data(): print("Avvio THREAD Receive Data...") #creo un socket udp serversocket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #assoccio il socket a ip e porta serversocket1.bind((UDP_IP_LISTENER, UDP_PORT_LISTENER)) while True: #leggo i dati ricevuti dal socket data, address = serversocket1.recvfrom(100) #converto i byte in stringa cmd = bytes.decode(data) #printo i dati sul terminale o console print(cmd) #metto in pausa il thread per 1 secondo time.sleep(1) if __name__=="__main__": print("Start program") t1 = threading.Thread(target=client_Receive_Data) #Avvio thread t1.start()
Osservando il codice (Python udp Raspberry e Python udp computer) si nota che sono presenti gli stessi indirizzi ip. Questo perché il codice che riceve i dati si mette in ascolto sull’indirizzo ip della macchina e su una determinata porta. Il codice sul Raspberry invierà i dati sull’ip della macchina e sulla porta di ascolto.
Related posts
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test