RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP – 3° Parte
FE Giugno 2003 - RECS 101 - Intellisystem Technologies

RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP – 3° Parte

In questa terza parte della presentazione del dispositivo RECS 101 vengono affrontati i seguenti argomenti: il protocollo di comunicazione implementato in RECS 101 ed esempi di metodologie per la progettazione di applicazioni personalizzate mediante l’implementazione di socket Internet in C e in Java.

PROTOCOLLO DI COMUNICAZIONE IMPLEMENTATO IN RECS 101 

RECS 101 effettua il controllo delle sue porte digitali mediante un interfaccia basata sui socket di Internet. Per ottenere il controllo remoto delle porte di I/O attraverso Internet, è necessario che l’interfaccia che gestisce i socket venga implementata nel PC dell’utente che intende collegarsi a RECS 101 attraverso il protocollo TCP/IP. La potenzialità di RECS 101 consiste nel fatto che tale interfaccia può essere implementata indifferentemente mediante un’Applet Java (che viene eseguita all’interno del Web Browser che si collega al dispositivo RECS 101) o un’applicazione C/Java che utilizzi i socket di Internet (figura 1). Ovviamente per fare ciò occorre progettarle adeguatamente aderendo allo standard fissato dalle regole della suite di protocolli TCP/IP. Tali interfacce si occuperanno quindi di inviare e ricevere i comandi per il controllo delle porte di I/O attraverso l’indirizzo IP impostato su RECS 101 e la relativa porta fissata alla 6001.RECS 101 si occuperà dell’interpretazione dei comandi di controllo ricevuti o trasmessi dal dispositivo elettronico da controllare ad esso connesso. I comandi di controllo si suddividono in due categorie che identificano due operazioni diverse: Monitor Stato I/O Tramite quest’operazione è possibile avere informazioni inerenti lo stato di tutte le linee di I/O contenute nelle due porte a 16 bit di RECS 101.

I comandi relativi a quest’operazione sono essenzialmente due:

• I/O Get Command: È il comando mediante il quale l’interfaccia socket interroga RECS 101 sullo stato delle proprie porte.

• I/O Get Command Responce: È il comando di risposta mediante il quale RECS 101 comunica all’interfaccia socket lo stato delle sue porte di I/O. Controllo dell’Output Questo tipo di operazione, gestita unicamente dal comando Output Set Command è utilizzata dall’interfaccia socket per settare i valori della porta d’Output di RECS 101. La tabella 1 riassume i comandi relativi alla comu nicazione e i tipi di messaggi che vengono scambiati tra l’interfaccia socket ed il dispositivo RECS 101. Monitor dello stato di I/O Lo stato della porta di I/O di RECS 101 è controllato mediante comandi gestiti tramite l’interfaccia socket che provvede a far dialogare il PC utente con RECS 101. Più esattamente il comando che il PC utente deve inviare per ricevere da parte di RECS 101 lo stato delle porte di I/O è lo “0x75”, che si compone di un byte. Quando RECS 101 riceverà tale comando provvederà a comunicare lo stato delle porte di I/O utilizzando 4 byte come riportato in tabella 2. Appare evidente che lo stato delle porte di I/O dipenderà dalla logica implementata dall’utilizzatore di RECS 101. Per esempio, supponendo che il circuito da interfacciare a RECS 101 sia stato progettato per lavorare secondo la tecnica “Active LOW” ciò equivale a dire che un ipotetico diodo Led collegato ad un’uscita della porta di Output sia acceso quando a quest’ultima viene inviato uno zero logico. Se adesso consideriamo il caso in cui i bit 0,2,4 e 10 della porta di Output siano nello stato logico alto e i bit 1,3 e 5 della porta di Input siano anch’essi nello stato logico alto, RECS 101 alla ricezione del comando “0x75” risponderà come descritto nella tabella 3. A questo punto l’interfaccia socket tra RECS 101 ed il PC utente si occuperà dell’interpretazione di questo valore visualizzandolo sul PC utente. Anche se i dati relativi allo stato delle porte di I/O sono contenuti in 4 byte, RECS 101 invierà all’interfaccia socket Figura 3: Comandi di controllo di RECS 101 Figura 4: Comando di controllo della porta di Output di RECS 101 una parola di 16 bytes. Di conseguenza l’utente dovrà interpretare solamente i primi 4 bytes del pacchetto ricevuto. Ciò è dovuto al fatto che, come detto in precedenza, la trasmissione di queste informazioni avviene mediante i socket che operano tramite il protocollo TCP/IP che a sua volta opera sullo standard Ethernet. Poiché lo standard Ethernet impone una lunghezza minima del pacchetto di 64 bytes (inclusi i gli headers IP e TCP) [1], e considerando il fatto che nel caso in cui venga generato un pacchetto la cui lunghezza minima è inferiore ai 64 bytes questi viene scartato, bisogna arrivare alla conclusione che anche se RECS ne avrebbe di bisogno solamente 4 si è costretti ad usarne16, di conseguenza, l’utente dovrà interpretare solamente i primi 4 bytes del pacchetto ricevuto (tabella 4). Controllo dei comandi di Output Questo tipo di comando viene utilizzato in tutti quei casi in cui si vuole modificare il valore di un bit della porta di Output di RECS 101 senza che venga generato un messaggio di conferma. La tabella 5 riporta il formato del relativo comando “0x76” che si compone di 4 bytes di cui il primo contiene il comando vero e proprio e gli altri due rappresentano il nuovo stato che la porta d’Output dovrà assumere. Per esempio, supponiamo il caso in cui si voglia modificare lo stato della porta d’Output di RECS 101 settando allo stato logico “alto” i bit 0,1,2 e 3 lasciando tutti gli altri nello stato logico “basso”. Allora poiché il corrispon dente valore in esadecimale è 0x000F, occorrerà inviare a RECS 101 il valore esadecimale 76:00:0F come mostrato nella tabella 6.

COMUNICARE CON RECS 101: L’INTERFACCIA SOCKET IN C

Si riporta, di seguito, un esempio di codice sorgente scritto nel linguaggio C, il quale rappresenta l’implementazione di un’interfaccia socket basata sulle API dei socket di Berkely. I frammenti di codice riportati di seguito, si occupano di gestire rispettivamente il “Monitor Stato I/O “ e il “Controllo dell’Output” descritti precedentemente. Prendendo spunto da questi esempi l’utente oltre a capire i meccanismi di funzionamento descritti potrà essere capace di costruire una propria interfaccia personalizzata che funzionerà come applicazione, ovvero permetterà di gestire RECS 101 attraverso il protocollo TCP/IP ma senza il supporto di un Web Browser. Un’applicazione di questo tipo poterebbe essere utili per tutte quelle esigenze di protezione e di riservatezza che escludano l’utilizzo di una tale interfaccia. Come primo esempio si riporta la procedura IOMonitor che si occupa di monitorare lo stato delle porte di Input e di Output di RECS 101. Per poter gestire tale operazione occorre per prima cosa definire due buffer rispettivamente commandBuf che conterrà il codice relativo al comando da inviare a RECS 101 e ResponseBuf che conterrà il valore letto nella porta di I/O.

Occorrerà inoltre definire delle variabili di ausilio quali:

• commandLen: è un intero che contiene la lunghezza del comando relativo a commandBuf.

• lenReceived: intero che conterrà la lunghezza del buffer di ricezione ResponseBuf.

• i: variabile intera da utilizzare per i cicli iterativi. Definite le variabili occorre inizializzare il Socket TCP mediante la chiamata alla procedura TCPSocketInit() che per brevità non viene riportata. Si passa quindi ad inizializzare il buffer che conterà il comando utilizzando la costante IOGet, che definita altrove, è uguale a 0x75 che rappresenta il codice esadecimale del comando Monitor Stato I/O. A questo punto utilizzando l’istruzione sendto s’invia l’istruzione Monitor Stato I/O a RECS 101, inviando come parametri il valore del buffer e altre informazioni riguardanti l’indirizzo IP di RECS 101. Poiché la funzione sendto restituisce un valore che è uguale a -1 in caso d’errore, al verificarsi di quest’evento sarà visualizzato un opportuno messaggio d’errore indicante un problema riscontrato durante la comunicazione con il dispositivo. Inviato il comando Monitor Stato I/O bisogna predisporre l’interfaccia socket a ricevere le informazioni che scaturiscono dall’interrogazione fatta. Per prima cosa bisogna allocare i buffer di ricezione ResponseBuf, dopodiché mediante l’istruzione recvfrom (che è la corrispondente dell’istruzione sendto nel caso della ricezione) si riceveranno le informazioni relative allo stato della porta di I/O di RECS 101. Poiché l’istruzione recvform restituisce un valore uguale a -1, in caso d’errore, è possibile implementare delle istruzioni che avvertano nel caso in cui ci siano stati degli errori di comunicazione. Supponendo che non ci sono stati errori durante la comunicazione, si può passare alla visualizzazione dello stato delle porte di I/O mediante la lettura del buffer di ricezione Response Buf. La procedura può terminare chiudendo il Socket TCP e rilasciando le locazioni di memoria allocate per la gestione dei buffer (vedi listato 1) Il secondo esempio che si riporta serve a variare lo stato della porta di Otuput di RECS 101. In particolare si riporta come esempio la procedura per modificare un solo bit della porta di Output che una volta selezionato verrà portato a livello logico alto. Per tale scopo adopereremo la procedura SetOutput().

Come nel caso precedente iniziamo con le dichiarazioni delle variabili locali:

• commandBuf: è un array di caratteri che conterrà i tre byte che compongono il comando Output Set Command.

• commandLen: è un intero che contiene la lunghezza in byte dell’istruzione Output Set Command.

• outbit: è un intero inizializzato al valore zero che conterrà la posizione del bit della porta di Output che si vuole modificare.

• outdata: è un intero inizializzato al valore 0x0001 che viene utilizzato come maschera per la modifica del singolo bit che compone la parola relativa alla porta di Output. La prima operazione da svolgere è quella di richiedere quale bit all’interno della parole che compone la porta di Output si vuole modificare. Tale valore è quindi memorizzato nella variabile outbit. Richiamiamo la procedura IOMonitor() per leggere lo stato della porta di I/O che verrà memorizzato all’interno dell’array IOStatus. Da notare che IOStatus [2] conterrà la parte MSB della porta di Output e IOStatus [3] conterrà la parte LSB. A questo punto occorre ristabilire una connessione con RECS 101 pertanto reinizializziamo il Socket tramite la procedura TCPSocketInit(). Poiché in C quando si definisce una variabile di tipo int questa viene allocata all’interno di una cella di memoria di 16 bit sia IOStatus [2] che IOStatus [3] saranno contenuti in due celle da 16 bit. Occorre quindi fare in modo che queste siano compattate come unico valore a 16 bit, tale operazione viene svolta eseguendo l’operazione logica sui bit di IOStatus [2] e IOStauts [3]: outdata=(Shift di 8 posizioni verso sinistra di IOStatus[2]) OR (IOStatus [3]) Quanto appena detto viene espletato da un unica istruzione riportata nel listato: outdata|=((IOStatus[2]<<8) | IOStatus[3]); Essendo il nostro obiettivo portare a livello logico alto solamente il bit selezionato tramite la variabile outbit, l’operazione necessaria da fare è quella di utilizzare la variabile outdata precedentemente inizializzata ad 1 e farla shiftare (a livello di bit) di tante posizioni verso la sinistra rispetto al valore di outdata, in questo modo il bit posto inizialmente uguale ad i in outdata si posizionerà alla relativa posizione lasciando tutti gli altri bit uguali a zero. Quanto detto si riassume nella seguente pseudo istruzione: outdata= outdata OR (1 Shift di outbit posizioni verso sinistra) Che si traduce nella seguente istruzione C: outdata |= (int) (1 << outbit); A questo punto la variabile outdata conterrà il nuovo valore dello stato della porta di Out con il bit selezionato portato a livello logico alto. Occorre adesso prepararsi per eseguire il commando Output Set Command. Per fare ciò dobbiamo riempire il buffer commandBuf di tre byte rispettivamente, uno per il codice istruzione 0x76 e i rimanenti che conterranno la parte MSB e LSB del nuovo stato della porta di Output. Adoperando le seguenti istruzioni: IOStatus[2]=(outdata&0xff00)>> 8; IOStatus[3] = (outdata & 0x00ff) ; Facciamo in modo che IOStatus [2] contenga la parte MSB del nuovo stato della porta di Output, il ché si ottiene eseguendo la seguente operazione logica sui bit di outdata: IOStatus[2]= Shift di 8 posizioni verso destra (outdata AND 11111111|00000000) Per il secondo caso sarà sufficiente eseguire solamente la seguente operazione logica sui bit di outdata: IOStatus[3]= outdata AND 11111111|00000000 Riempito il buffer che conterrà il comando da inviare a RECS 101, non ci rimane che adoperare l’istruzione sendto per rendere tale comando operativo. Si ricorda che tale istruzione restituisce un valore che nel caso sia -1 indica che l’informazione non è stata trasmessa correttamente. Per concludere, l’ultima operazione da fare è quella di chiudere il socket mediante la chiamata alla procedura TCPSocketClose.(vedi listato 2) Per maggiore chiarezza la figura 5 riporta un esempio pratico di quanto descritto precedentemente, pertanto si supporrà quanto segue: • Lo stato della porta di Output di RECS 101 è uguale a 00000000|10001001. • Si vuole portare a livello logico “alto” il quinto bit della porta di Output a partire dalla destra.

COMUNICARE CON RECS 101: L’INTERFACCIA SOCKET IN JAVA

Come detto in precedenza per superare tutte le limitazioni dovute alla gestione di RECS 101 mediante un software applicativo la soluzione proposta da Intellisystem Technologies utilizza la tecnologia Java che prevede la creazione di un’Applet di controllo, gestita mediante un interfaccia browser. Come ben noto, le Applet sono dei programmi autonomi, scritti in Java, eseguibili mediante un comune browser. La potenzialità di un software scritto in Java, consente di essere totalmente indipendenti dalla piattaforma HW su cui si esegue l’applicazione. Senza entrare troppo nei dettagli della programmazione in Java riportiamo di seguito un frammento di codice Java riguardante un esempio d’implementazione dell’interfaccia socket basata su Applet che permette la ricezione e trasmissione di degnali di I/O, attraverso il protocollo TCP. Il lettore più attento può paragonare i codici seguenti con quelli scritti in C ed evidenziare quindi le analogie in termini di funzionalità. (listato 3)

_________

A cura di Cristian Randieri. Articolo pubblicato sulla rivista Fare Elettronica N. 216 – Giugno 2003. 

Per scaricare l’articolo pubblicato sulla rivista, seguire il link riportato di seguito http://www.intellisystem.it/portfolio/fe-giugno-2003-recs-101-3-parte/

 _____________

Link consigliati per la lettura completa di tutti gli articoli

RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP – 1° Parte  

RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP – 2° Parte

RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP – 4° parte 

Cristian is a brilliant intelligent and great proactivity person and an effective communicator and visionary. He has built a strong (and deserved) reputation as someone with vision, diligence and honor. Cristian is not a simple engineer but he is a real Scientist. His knowledge is not restricted to the area it covers, but its impressive passion for all the technical topics led him to acquire great skills even in areas far from his original studies. Cristian is able to address and solve complex technical problems with excellent results. He is a valuable writer with great scientific background formed with more that 15 years of active research on experimental Nuclear Physics performed in the most famous international research laboratories such as CERN, ESRN, INF. He write about HI-Tech solutions topics and advanced research study applied to industry. He have more than 150 scientific & technical publications. He is also a technical and famous writer in Italy due to his interviews released on the most famous Industrial Italian magazine.

You must belogged in to post a comment.

Intellisystem Technologies