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.

Python UDP

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.