Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...

Pagina creata da Francesco Battaglia
 
CONTINUA A LEGGERE
Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...
Multigroup Chat
in Python hosted on Raspberry PI

               a cura di
       Raimondi Cominesi Simone
                  &
            Voltolini Pietro

                   1
Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...
Indice

   Introduzione
   Settaggio impostazioni Raspberry
       o Abilitazione protocollo ssh
       o Abilitazione protocollo ftp
       o Configurazione Router
   clientGui.py
   serverchat.py
   clientserverchat.py
   Socket TCP Multiclient

                                2
Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...
Introduzione
L’idea di sviluppare il progetto di una chat utilizzando le Socket e il
linguaggio Python è nata in seguito all’interesse di approfondire gli
argomenti che sono stati trattati durante il corso di Reti. Il nostro intento è
stato quello di approfondire la parte delle Socket concentrandoci sulla
possibilità di poter realizzare una chat MultiGroup, dove più utenti
possono scambiarsi messaggi all’interno di stanze separate, astraendo la
semplice chat a stanza singola.
A differenza delle socket implementate attraverso il linguaggio C, per
spingere oltre la nostra conoscenza e per imparare un nuovo linguaggio di
programmazione abbiamo deciso di sviluppare la chat in Python
implementando anche una parte di grafica per quanto riguarda i client
adottando la libreria Tkinter.
Avendo già una conoscenza del Raspberry e del suo sistema operativo
Raspbian (Lite) abbiamo voluto creare un server web dove poter ospitare
il server della nostra applicazione facendo si che la chat si possa utilizzare
non solo a livello locale ma anche a livello globale.

Settaggio delle impostazione del Raspberry

Innanzitutto abbiamo installato la versione Raspbian (Lite) sul nostro
dispositivo, successivamente mediante il terminale e attraverso il comando
sudo raspi-config abbiamo selezionato la voce Interfacing Options per poi
attivare il protocollo SSH al fine di comandare da esterno il server.

                                       3
Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...
Abilitazione protocollo FTP
Attraverso i seguenti comandi seguendo una guida online abbiamo
installato pure-ftpd andando a creare uno user con relativa password che ci
ha consentito di trasferire i vari file da locale al server( attraverso
FileZilla)
  - sudo apt-get install pure-ftpd
  - sudo groupadd ftpgroup
  - sudo useradd ftpuser -g ftpgroup -s /sbin/nologin -d /dev/null
  - sudo mkdir /home/pi/FTP
  - sudo chown -R ftpuser:ftpgroup /home/pi/FTP
  - sudo pure-pw useradd upload -u ftpuser -g ftpgroup -d /home/pi/FTP
    –m
  - sudo pure-pw mkdb
Configurazione Router
A questo punto abbiamo fatto l’accesso alle impostazioni del nostro router
andando ad assegnare un indirizzo statico al Raspberry, successivamente ci
siamo spostati sulle impostazioni di NAT effettuando il port forwarding
al fine di assegnare al nostro dispositivo la porta 22 per il protocollo SSH e
la porta 21 per il protocollo FTP e la porta 3700 che andiamo ad utilizzare
come porta della nostra chat , rendendo cosi accessibile dall’esterno il
Raspberry.
Per comunicare dall’esterno verso il router abbiamo definito un dominio
sfruttando il servizio DynDns che ci consente di connetterci al router senza
dover utilizzare il classico indirizzo IP fatto da numeri.

                                      4
ClientGUI.py
Utilizzo della libreria grafica Tkinter

Tkinter (Tk-interface) è un wrapper (involucro) per Tk, un sottile strato di
software orientato agli oggetti fondato su di esso. È la GUI di default di
Python, Graphical User Interface (Interfaccia Grafica per l'Utente), ed è
integrata in Python fin dalle sue origini. Ha notevoli doti di semplicità e
portabilità, ottimi widget.
Come canvas per la grafica strutturata, e text per l'editing avanzato del
testo; ed è ben documentato sia in linea che in pubblicazioni cartacee.
Anche se le interfacce ottenute hanno l'aspetto un po' datato, resta
un'ottima scelta per costruire rapidamente interfacce semplici e portabili.
La programmazione di GUI è esattamente analoga ad ogni altro tipo di
programmazione: sequenze di istruzioni, cicli, fasi condizionali e moduli.
La differenza principale consiste nel fatto che nella programmazione di
GUI normalmente viene usato un Toolkit (Insieme di attrezzi) ed occorre
quindi seguire il modello di programmazione previsto da chi ha prodotto il
toolkit. Ogni toolkit ha una sua API, Application Programmer's Interface
(una libreria di funzioni specifiche) ed un proprio insieme di regole per la
programmazione che il programmatore deve imparare e seguire. Poichè
imparare un nuovo toolkit è generalmente più complicato che imparare un
nuovo linguaggio di programmazione, è meglio sceglierne uno che
funziona per vari linguaggi. Tk, tra l'altro, funziona per Tcl, Perl, Python,
Ruby e Lisp.
Le applicazioni GUI sono quasi sempre di tipo ad eventi. Ogni programma
ad eventi è strutturato come un ciclo che raccoglie gli eventi e li processa.
Gli eventi possono essere generati dal sistema operativo, come accade nel
caso di praticamente tutti i programmi di tipo GUI. Oppure può essere il
programma stesso che va in cerca degli eventi, come accade nei sistemi di
controllo embedded, tipo quelli usati nelle macchine fotografiche.

                                      5
Dai seguenti screenshoot acquisiti dal file clientGUI.py si può evincere di
come abbiamo il modulo tkinter per gestire la grafica. La funzione
window.after() consente di lanciare la funzione up dopo un tot di tempo,
mentre la funzione window.mainloop consente di tenere aperta la finestra
della chat. L’oggetto frame ci consente di creare un contenitore all’interno
della finestra principale. La funzione .pack() ci consente la disposizione
degli oggetti all’interno della finestra.

                                      6
Serverchat.py
Il file serverchat.py è il server della nostra chat e ci consente lo
smistamento dei messaggi in arrivo e in uscita fra le diverse stanze e i vari
user all’interno di esse.

In questo screenshoot del file serverchat.py possiamo notare la gestione di
nuovi utenti che prendono parte alla chat, per evitare di rendere il codice
più smart abbiamo deciso di utilizzare un altro file composto da diverse
funzioni volte a gestire le stanze e gli utenti.

                                      7
ClientServerChat.py
In questo file abbiamo diverse classi contenenti diverse finzioni che ci
consentono la gestione delle stanze e degli utenti.
Come si può notare dal seguente screen abbiamo deciso di concentrare in
questo file diverse funzione sia per la creazioni delle socket
(create_socket), sia soprattutto per la gestione delle stanze, cercando cosi
di evitare l’ingrombro e la confusione del file server e del file client

                                      8
Socket TCP Multiclient
Per sviluppare il nostro progetto abbiamo adottato l’uso di socket bastate
sul protocollo TCP che consentissero di gestire più Client. La motivazione
fondamentale per la quale non abbiamo utilizzato una socket basata su
UDP è che socket di questo tipo possono modificare la sequenza ordinata
di pacchetti inviati.
Per la creazione della socket per comunicare con il server usiamo la
funzione socket(), nella quale sono specificati l’Address Family e
SOCK_STREAM per definire un canale di trasmissione bidirezionale,
sequenziale e affidabile.
Durante la creazione della connessione avviene la seguente sequenza di
operazioni:
1. (lato passivo) Il server esegue l'apertura passiva del socket, attraverso le
funzioni socket, bind e listen;
2. (lato attivo) Il client richiede l'inizio della connessione (apertura attiva)
usando la funzione connect;
3. (lato passivo) Il server accetta la connessione tramite la funzione accept
e la sposta su un nuovo socket;
4. (lato passivo e attivo) Invio e ricezione dei dati.
La funzione setsockopt permette di forgiare le caratteristiche della socket e
tramite la funzione connect inizia la comunicazione.

Il server gestisce vari client della chat attraverso la selezione. La funzione select
monitora tutti i socket client e il socket master per attività leggibili. Se uno
qualsiasi dei socket client è leggibile, significa che uno dei client di chat ha
inviato un messaggio

                                          9
A lato server sono fondamentali la funzione bind per assegnare alla socket
l’indirizzo IP. Una che la socket è stata creata e gli è stata assegnata una
porta, il server per completare la procedura di apertura esegue la funzione
listen che consente di settare la lunghezza per le richieste di connessione

Infine tramite la funzione accept il server accetta la connessione andando a
postare quindi la connessione su un nuovo utente.

Una volta completata questa procedura inizia l’invio e la trasmissione dei
dati tramite le funzioni send e receive.

                                     10
Puoi anche leggere