3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte -...

8

Transcript of 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte -...

Page 1: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem
Page 2: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE68

RECS 101: UN WEB SERVEREMBEDDED PER APPLICAZIONIDI CONTROLLOREMOTO TRAMITE TCP/IP

RECS 101: UN WEB SERVEREMBEDDED PER APPLICAZIONIDI CONTROLLOREMOTO TRAMITE TCP/IP

di Cristian Randieri [email protected]

PROTOCOLLO DI COMUNICAZIO-NE IMPLEMENTATO IN RECS 101RECS 101 effettua il controllo dellesue porte digitali mediante un inter-faccia basata sui socket di Internet.Per ottenere il controllo remoto delleporte di I/O attraverso Internet, ènecessario che l’interfaccia che gesti-sce i socket venga implementata nelPC dell’utente che intende collegarsia RECS 101 attraverso il protocolloTCP/IP.La potenzialità di RECS 101 consistenel fatto che tale interfaccia può esse-re implementata indifferentementemediante un’ Applet Java (che vieneeseguita all’interno del Web Browserche si collega al dispositivo RECS 101)o un’applicazione C/Java che utilizzi isocket di Internet (figura 1).Ovviamente per fare ciò occorre pro-gettarle adeguatamente aderendoallo standard fissato dalle regole dellasuite di protocolli TCP/IP. Tali interfac-ce si occuperanno quindi di inviare ericevere i comandi per il controllodelle porte di I/O attraverso l’indirizzo

IP impostato su RECS 101 e la relativaporta fissata alla 6001.RECS 101 sioccuperà dell’interpretazione deicomandi di controllo ricevuti o tra-smessi dal dispositivo elettronico dacontrollare ad esso connesso.I comandi di controllo si suddividonoin due categorie che identificano dueoperazioni diverse:

Monitor Stato I/OTramite quest’operazione è possibileavere informazioni inerenti lo stato ditutte le linee di I/O contenute nelledue porte a 16 bit di RECS 101. Icomandi relativi a quest’operazionesono essenzialmente due:

• I/O Get Command: È il comandomediante il quale l’interfaccia socketinterroga RECS 101 sullo stato delleproprie porte.

• I/O Get Command Responce: È ilcomando di risposta mediante ilquale RECS 101 comunica all’inter-faccia socket lo stato delle sue portedi I/O.

Controllo dell’OutputQuesto tipo di operazione, gestitaunicamente dal comando Output SetCommand è utilizzata dall’interfacciasocket per settare i valori della portad’Output di RECS 101. La tabella 1riassume i comandi relativi alla comu-

In questa terza parte della presentazione del dispositivo RECS 101 vengono affrontatii seguenti argomenti: il protocollo di comunicazione implementato in RECS 101 edesempi di metodologie per la progettazione di applicazioni personalizzate mediantel’implementazione di socket Internet in C e in Java.

AUTOMAZIONE

terza parte

Figura 1: Possibili scenari d’implementazione dell’interfaccia di comunicazione socket di RECS 101

Page 3: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE 69

nicazione e i tipi di messaggi che ven-gono scambiati tra l’interfaccia socketed il dispositivo RECS 101.

Monitor dello stato di I/OLo stato della porta di I/O di RECS 101è controllato mediante comandi gesti-ti tramite l’interfaccia socket che prov-vede a far dialogare il PC utente conRECS 101.Più esattamente il comando che il PCutente deve inviare per ricevere da partedi RECS 101 lo stato delle porte di I/O èlo “0x75”, che si compone di un byte.Quando RECS 101 riceverà talecomando provvederà a comunicare lostato delle porte di I/O utilizzando 4byte come riportato in tabella 2.Appare evidente che lo stato delleporte di I/O dipenderà dalla logicaimplementata dall’utilizzatore di RECS101. Per esempio, supponendo che ilcircuito da interfacciare a RECS 101 siastato progettato per lavorare secondola tecnica “Active LOW” ciò equivale adire che un ipotetico diodo Led colle-gato ad un’uscita della porta di Output

sia acceso quando a quest’ultima vieneinviato uno zero logico. Se adesso con-sideriamo il caso in cui i bit 0,2,4 e 10della porta di Output siano nello statologico alto e i bit 1,3 e 5 della porta diInput siano anch’essi nello stato logicoalto, RECS 101 alla ricezione delcomando “0x75” risponderà comedescritto nella tabella 3.A questo punto l’interfaccia socket traRECS 101 ed il PC utente si occuperàdell’interpretazione di questo valorevisualizzandolo sul PC utente.

Anche se i dati relativi allo stato delleporte 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à inter-pretare solamente i primi 4 bytes delpacchetto ricevuto.Ciò è dovuto al fatto che, come dettoin precedenza, la trasmissione di que-ste informazioni avviene mediante isocket che operano tramite il protocol-lo TCP/IP che a sua volta opera sullostandard Ethernet.Poiché lo standard Ethernet imponeuna lunghezza minima del pacchettodi 64 bytes (inclusi i gli headers IP eTCP) [1], e considerando il fatto chenel caso in cui venga generato un pac-chetto la cui lunghezza minima è infe-riore ai 64 bytes questi viene scartato,bisogna arrivare alla conclusione cheanche se RECS ne avrebbe di bisognosolamente 4 si è costretti ad usarne16,di conseguenza, l’utente dovrà inter-pretare solamente i primi 4 bytes delpacchetto ricevuto (tabella 4).

Controllo dei comandi di OutputQuesto tipo di comando viene utilizza-to in tutti quei casi in cui si vuole modi-ficare il valore di un bit della porta diOutput di RECS 101 senza che vengagenerato un messaggio di conferma.La tabella 5 riporta il formato del rela-tivo comando “0x76” che si componedi 4 bytes di cui il primo contiene ilcomando vero e proprio e gli altri duerappresentano il nuovo stato che laporta d’Output dovrà assumere.Per esempio, supponiamo il caso in cuisi voglia modificare lo stato della portad’Output di RECS 101 settando allostato logico “alto” i bit 0,1,2 e 3lasciando tutti gli altri nello stato logi-co “basso”. Allora poiché il corrispon-

AUTOMAZIONE

Tipo di operazione Comando Direzione

PC Utente RECS 101

Monitor Stato I/O I/O Get Command

I/O Get Command Response

Controllo dell’Output Output Set Command

Tabella 1: Comandi relativi alla comunicazione e i tipi di messaggi che vengono scambiati tra l’interfacciasocket ed il dispositivo RECS 101

Figura 2: Schema funzionale per la gestione di un dispositivo elettronico tramite RECS 101

Page 4: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE70

Tabella 2: Controllo dello stato delle porte di I/O di RECS 101

Tabella 3: Esempio di codifica dello stato della porta di I/O

Byte 1 Byte 2 Byte 3 Byte 4

MSB LSB MSB LSB

Stato della porta di Input Stato della porta di Output

dente valore in esadecimale è 0x000F,occorrerà inviare a RECS 101 il valoreesadecimale 76:00:0F come mostratonella tabella 6.

COMUNICARE CON RECS 101:L’INTERFACCIA SOCKET IN CSi riporta, di seguito, un esempio dicodice sorgente scritto nel linguaggioC, il quale rappresenta l’implementa-zione di un’interfaccia socket basatasulle API dei socket di Berkely. I fram-menti di codice riportati di seguito, sioccupano di gestire rispettivamente il“Monitor Stato I/O “ e il “Controllodell’Output” descritti precedentemen-te.Prendendo spunto da questi esempil’utente oltre a capire i meccanismi difunzionamento descritti potrà esserecapace di costruire una propria inter-faccia personalizzata che funzioneràcome applicazione, ovvero permetteràdi gestire RECS 101 attraverso il proto-collo TCP/IP ma senza il supporto diun Web Browser.Un’applicazione di questo tipo pote-

rebbe essere utili per tutte quelle esi-genze di protezione e di riservatezzache escludano l’utilizzo di unatale interfaccia.Come primo esempio si riporta la pro-cedura IOMonitor che si occupa dimonitorare lo stato delle porte di Inpute di Output di RECS 101.Per poter gestire tale operazioneoccorre per prima cosa definire duebuffer rispettivamente commandBufche conterrà il codice relativo alcomando da inviare a RECS 101 eResponseBuf che conterrà il valoreletto nella porta di I/O. Occorrerà inol-tre definire delle variabili di ausilioquali:

• commandLen: è un intero che con-tiene la lunghezza del comando rela-tivo a commandBuf.

• lenReceived: intero che conterrà lalunghezza del buffer di ricezioneResponseBuf.

• i: variabile intera da utilizzare per icicli iterativi.

Definite le variabili occorre inizializzareil Socket TCP mediante la chiamata allaprocedura TCPSocketInit() che perbrevità non viene riportata. Si passaquindi ad inizializzare il buffer che con-terà il comando utilizzando la costanteIOGet, che definita altrove, è uguale a0x75 che rappresenta il codice esade-cimale del comando Monitor StatoI/O.A questo punto utilizzando l’istruzionesendto s’invia l’istruzione MonitorStato I/O a RECS 101, inviando comeparametri il valore del buffer e altreinformazioni riguardanti l’indirizzo IPdi RECS 101.Poiché la funzione sendto restituisceun valore che è uguale a -1 in casod’errore, al verificarsi di quest’eventosarà visualizzato un opportuno mes-saggio d’errore indicante un problemariscontrato durante la comunicazionecon il dispositivo.Inviato il comando Monitor Stato I/Obisogna predisporre l’interfaccia socketa ricevere le informazioni che scaturi-scono dall’interrogazione fatta.Per prima cosa bisogna allocare i bufferdi ricezione ResponseBuf, dopodichémediante l’istruzione recvfrom (che è lacorrispondente dell’istruzione sendtonel caso della ricezione) si riceveranno

AUTOMAZIONE

Tipo Numero di Byte

1 2 3 4

Comando per monitorare lo stato delle porte di I/O 0x75

Risposta contenete lo stato delle porte di I/O Stato della porta di Input Stato della porta di Output

2 bytes 2 bytes 60 bytes

Stato della porta di Input Stato della porta d’Output Dati non utilizzati

Tabella 4: Formato del pacchetto ricevuto dall’interfaccia socket.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1 1 1 1 1 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0

1111 | 1011 | 1110 | 1010 = 0xFBEA 0000 | 0000 | 0010 | 1010 = 0x002A

Stato della porta di Input Stato della porta di Output

Page 5: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE 71

le informazioni relative allo stato dellaporta di I/O di RECS 101. Poiché l’istru-zione recvform restituisce un valoreuguale a -1, in caso d’errore, è possibi-le implementare delle istruzioni cheavvertano nel caso in cui ci siano statidegli errori di comunicazione.Supponendo che non ci sono statierrori durante la comunicazione, si puòpassare alla visualizzazione dello statodelle porte di I/O mediante la letturadel buffer di ricezione Response Buf.La procedura può terminare chiudendoil Socket TCP e rilasciando le locazioni dimemoria allocate per la gestione deibuffer (vedi listato 1) Il secondo esem-pio che si riporta serve a variare lo statodella porta di Otuput di RECS 101.In particolare si riporta come esempiola procedura per modificare un solo bitdella porta di Output che una voltaselezionato verrà portato a livello logi-co alto. Per tale scopo adopereremo laprocedura SetOutput(). Come nelcaso precedente iniziamo con ledichiarazioni delle variabili locali:

• commandBuf: è un array di carat-teri che conterrà i tre byte checompongono il comando OutputSet Command.

• commandLen: è un intero checontiene la lunghezza in byte del-

l’istruzione Output Set Command.• outbit: è un intero inizializzato al

valore zero che conterrà la posi-zione del bit della porta di Outputche si vuole modificare.

• outdata: è un intero inizializzatoal valore 0x0001 che viene utiliz-zato come maschera per la modi-fica del singolo bit che compone

la parola relativa alla porta diOutput.

La prima operazione da svolgere èquella di richiedere quale bit all’in-terno della parole che compone laporta di Output si vuole modificare.

Tale valore è quindi memorizzatonella variabile outbit. Richiamiamola procedura IOMonitor() per legge-re lo stato della porta di I/O cheverrà memorizzato all’interno del-l’array IOStatus.Da notare che IOStatus [2] conterràla parte MSB della porta di Output eIOStatus [3] conterrà la parte LSB.

AUTOMAZIONE

Tabella 5: Formato del commando di controllo della porta di Output

Tipo Numero di Bytes

Comando di controllo della porta d’Output 1 2 3

0x76 Stato della porta di Output

Tabella 6: Esempio di modifica dello stato della porta d’uscita di RECS 101

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

0000|0000|0010|1111 = 0x000F

Stato della porta d’output

Comando di controllo della porta d’Output MSB Porta Output LSB Porta Output

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

0x76 0x00 0x0F

Figura 5: Esempio che illustra l’algoritmo per settare a livello logico “alto” il 5° bit della porta di Output di RECS 101

Page 6: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE72

A questo punto occorre ristabilire unaconnessione con RECS 101 pertantoreinizializziamo il Socket tramite laprocedura TCPSocketInit(). Poiché inC quando si definisce una variabile ditipo int questa viene allocata all’inter-no di una cella di memoria di 16 bitsia IOStatus [2] che IOStatus [3] saran-no contenuti in due celle da 16 bit.Occorre quindi fare in modo che que-ste siano compattate come unicovalore a 16 bit, tale operazione vienesvolta eseguendo l’operazione logicasui bit di IOStatus [2] e IOStauts [3]:

outdata=(Shift di 8 posizioni versosinistra di IOStatus[2]) OR (IOStatus[3])

Quanto appena detto viene espleta-to da un unica istruzione riportatanel listato:

outdata|=((IOStatus[2]<<8) |IOStatus[3]);

Essendo il nostro obiettivo portare alivello logico alto solamente il bit sele-zionato tramite la variabile outbit, l’o-perazione necessaria da fare è quelladi utilizzare la variabile outdata prece-dentemente inizializzata ad 1 e farlashiftare (a livello di bit) di tante posi-zioni verso la sinistra rispetto al valoredi outdata, in questo modo il bit postoinizialmente uguale ad i in outdata siposizionerà alla relativa posizionelasciando tutti gli altri bit uguali a zero.Quanto detto si riassume nellaseguente pseudo istruzione:

outdata= outdata OR (1 Shift di out-bit posizioni verso sinistra)

Che si traduce nella seguente istru-zione C:

outdata |= (int) (1 << outbit);A questo punto la variabile outdataconterrà il nuovo valore dello statodella porta di Out con il bit seleziona-to portato a livello logico alto. Occorre

AUTOMAZIONE

LISTATO 1//-------------------------------------------// RECS 101: Esempio di programmazione di// un interfaccia socket in C// Procedura IOMonitor// By Intellisystem Technologies // http://www.intellisystem.it //-------------------------------------------void IOMonitor(){char commandBuf, *ResponseBuf ;int commandLen, lenReceived ;int i ;

// Inizializzazione del Socket TCP TCPSocketInit() ;

// Esegui I comandi TCPcommandBuf = IOGet ;commandLen = 1 ;

// Invia I comandi a RECS 101err = sendto (sock,&commandBuf,commandLen,0,

(struct sockaddr*)&clientAddr,sizeof(clientAddr));if (err == -1){perror("\n Errore nell’invio dei dati !! \n");exit (1);

}

// Allocazione di un buffer per I pacchetti // in ingresso, 1 pacchetto = 16 bytesResponseBuf = calloc(0x10, sizeof(char)) ;

// Ricezione dei pacchetti entrantilenReceived = recvfrom (sock,ResponseBuf,0x10,0,

(struct sockaddr*)&clientAddr,&clientLen);if (lenReceived < 0){perror("\n Errore nella ricezione dei dati??? \n") ;exit(0) ;

}

// Visualizza la dimensione dei pacchetti entrantiprintf("\n%d N. di bytes ricevuti -> \n", lenReceived);

// Memorizza lo stato delle porte di I/O // per usi futuri nell’array IOStatusfor (i=0; i<4; i++)

IOStatus[i] = ResponseBuf[i];

// Visualizza lo stato delle porte di I/O printf("\n\n* Stato delle porte di I/O di RECS 101 *\n") ;printf("Porta di Input : %x:%x\t\t Porta di Output : %x:%x",

IOStatus[0], IOStatus[1], IOStatus[2], IOStatus[3]) ;printf("***** Intellisystem Technologies *****\n") ;

// Rilascia le allocazioni di memoria allocate per il bufferfree(ResponseBuf) ;

// Chiude il Socket TCPTCPSocketClose() ;

}

Page 7: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

AUTOMAZIONE 73

adesso prepararsi per eseguire il com-mando Output Set Command. Perfare ciò dobbiamo riempire il buffercommandBuf di tre byte rispettiva-mente, uno per il codice istruzione0x76 e i rimanenti che conterranno laparte MSB e LSB del nuovo stato dellaporta di Output. Adoperando leseguenti istruzioni:

IOStatus[2]=(outdata&0xff00)>> 8;IOStatus[3] = (outdata & 0x00ff) ;

Facciamo in modo che IOStatus [2]contenga la parte MSB del nuovostato della porta di Output, il ché siottiene eseguendo la seguente ope-razione logica sui bit di outdata:

IOStatus[2]= Shift di 8 posizioni verso destra(outdata AND 11111111|00000000)

Per il secondo caso sarà sufficienteeseguire solamente la seguente ope-razione logica sui bit di outdata:

IOStatus[3]= outdata AND11111111|00000000

Riempito il buffer che conterrà ilcomando da inviare a RECS 101, nonci rimane che adoperare l’istruzionesendto per rendere tale comando ope-rativo.Si ricorda che tale istruzione restituisceun valore che nel caso sia -1 indica chel’informazione non è stata trasmessacorrettamente.Per concludere, l’ultima operazione dafare è quella di chiudere il socketmediante la chiamata alla proceduraTCPSocketClose.(vedi listato 2)

Per maggiore chiarezza la figura 5riporta un esempio pratico di quantodescritto precedentemente, pertantosi supporrà quanto segue:

• Lo stato della porta di Output diRECS 101 è uguale a00000000|10001001.

• Si vuole portare a livello logico “alto”

AUTOMAZIONE

LISTATO 2

//-------------------------------------------// RECS 101: Esempio di programmazione di// un interfaccia socket in C// Procedura SetOutput// By Intellisystem Technologies // http://www.intellisystem.it //-------------------------------------------void SetOutput (){char commandBuf[3] ;int commandLen ;int outbit=0, outdata=0x0000 ;int err ;

// Richiede quale bit si vuole portare a livello logico// alto della porta di Outputprintf(" Prego selezionare il bit della porta d’Output di cui si vuole invertire lo stato logico “alto”(0-15) :");scanf("%d", &outbit) ;

// Legge lo stato corrente delle porte di I/OIOMonitor() ;

// Re-Initializza il Socket TCP TCPSocketInit() ;

// Determina il nuovo valore della porta d’Output a partire// dallo stato attuale delle usciteoutdata = ((IOStatus[2]<<8) | IOStatus[3]) ;outdata |= (int) (1 << outbit);// Or operation with currentle selected Bit// Memorizza il nuovo stato della porta di OutputIOStatus[2] = (outdata & 0xff00)>> 8 ;IOStatus[3] = (outdata & 0x00ff) ;

// Costruisci il buffer che conterrà Il comando// Output Set Command// 1) Command ID IOSet=0x76commandBuf[0] = IOSet ;

// 2) Output status setcommandBuf[1] = (BYTE) ((outdata & 0xff00) >> 8) ;commandBuf[2] = (BYTE) (outdata & 0x00ff) ;commandLen = 3 ;

// Invia I comandi a RECS 101err = sendto (sock,&commandBuf,commandLen,0,

(struct sockaddr*)&clientAddr,sizeof(clientAddr)) ;if (err == -1 ){perror("\n Errore nell’invio dei dati !! \n");exit (1);

}

// Chiude il Socket TCPTCPSocketClose() ;

}

Page 8: 3 RECS 101: UN WEB SERVER EMBEDDED PER APPLICAZIONI DI CONTROLLO REMOTO TRAMITE TCP/IP Terza parte - Fare Elettronica n. 216 - Giugno 2003 - Anno 19 - Cristian Randieri - Intellisystem

[1]Introduzione allo stack TCP/IP,IntellisystemTechnologie,http://www.intellisystem.it/ download.htm

[2]Netid Managed Services,Information technology,Northwestern Technology,http://gradeswww.acns.nwu.edu/ist/snap/doc/snif-fing.html.

[3]Internet spoofing referencepage, http:// www.brd.ie /paper/ sslpaper / hyper-lin.html.

AUTOMAZIONE74

il quinto bit della porta di Output apartire dalla destra.

COMUNICARE CON RECS 101:L’INTERFACCIA SOCKET INJAVACome detto in precedenza per supera-re tutte le limitazioni dovute allagestione di RECS 101 mediante unsoftware applicativo la soluzione pro-posta da Intellisystem Technologiesutilizza la tecnologia Java che prevedela creazione di un’Applet di controllo,gestita mediante un interfaccia brow-ser. Come ben noto, le Applet sono deiprogrammi autonomi, scritti in Java,eseguibili mediante un comune brow-ser. La potenzialità di un software scrit-to in Java, consente di essere totalmen-te indipendenti dalla piattaforma HWsu cui si esegue l’applicazione. Senzaentrare troppo nei dettagli della pro-grammazione in Java riportiamo diseguito un frammento di codice Javariguardante un esempio d’implemen-tazione dell’interfaccia socket basatasu Applet che permette la ricezione etrasmissione di degnali di I/O, attraver-so il protocollo TCP. Il lettore più atten-to può paragonare i codici seguenticon quelli scritti in C ed evidenziarequindi le analogie in termini di funzio-nalità. (listato 3)

AUTOMAZIONE

LISTATO 3

//------------------------------------------// RECS 101: Esempio di programmazione di un interfaccia// socket in Java// Procedura readIOport// By Intellisystem Technologies//------------------------------------------

public int readIOport() {Socket socketTCP = null;int tmp = 0;int inputData = 0;byte rxData[] = new byte[16];byte data[] = {COMMAND_GET};

try {socketTCP=new Socket(InetAddress.getByName(m_host), m_port);socketTCP.setTcpNoDelay(true);socketTCP.getOutputStream().write(data, 0, data.length);instream=new DataInputStream(socketTCP.getInputStream());tmp = instream.read(rxData, 0, rxData.length);if (tmp != -1) {inputData = (int) (rxData[2] << 8 | (rxData[3] & 0x00ff));inputData &= 0xffff;

}socketTCP.close();instream.close();

}catch (Exception e) {System.out.println("Err : " + e);

}return inputData;

}

//-------------------------------------------// Procedura writeOutputPort//-------------------------------------------

public void writeOutputPort(int outdata) {

Socket socketTCP = null;byte[] data = new byte[4];data[0] = COMMAND_SET;data[1] = (byte) ((outdata >> 8) & 0x000000ff);data[2] = (byte) (outdata & 0x000000ff);// Initialize sockettry {socketTCP=new Socket(InetAddress.getByName(m_host), m_port);socketTCP.setTcpNoDelay(trujhe);socketTCP.getOutputStream().write(data, 0, data.length);socketTCP.close();

}catch (Exception e) {System.out.println("Err: " + e);

}} Electronic shop 16

BIBLIOGRAFIA