O aplicație REST în practică

In acest articol am văzut cum este posibil într-un mod extrem de simplu de a implementa aplicații de tip cloud cu sistemele noastre SlimLine e Netsyst folosind arhitectura REST. Acum să vedem cât de simplu este să creăm un site web care să vă permită istorizarea datelor într-o bază de date MySQL și să le afișăm în tabel sau în formă grafică. Am inclus un sistem în dulapul nostru de date Netsyst care monitorizează consumul cu ajutorul unui analizor de rețea SDM120. Datele achiziționate sunt afișate pe afișajul produsului și trimise prin REST către un server din cloud.

Programul care utilizează FB-urile pentru gestionarea contorului Eastron SDM120 efectuează achiziționarea datelor de consum într-un program FBD simplu, care, susținut de variabilele globale, este afișat pe ecran și trimis prin REST către serverul cloud.

Scriptul PHP de pe serverul cloud primește datele în POST și îl stochează într-o bază de date, o pagină de consultare htm vă permite să vizualizați datele primite pe un tablou de bord. Biblioteca open source este utilizată pentru afișarea graficului Chart.js care vă permite să creați grafică în HTML5, iată modul în care este prezentată tablou de bord.

Exemplu de program

Cum se utilizează exemplele.
Proiectul este furnizat RESTLogger (Descărcați întregul proiect) cu programul demonstrativ care gestionează tabloul de bord vizibil în exemplu. Proiectul este alcătuit din diferite programe, lista celor mai semnificative care ilustrează modul în care funcționează este listată mai jos.

RESTLogger: Client care rulează pe un sistem SlimLine care achiziționează date de la un contor de energie Eastron și le trimite în REST către programul server.

RESTSvc: Script partea server executat pe un sistem LAMP care introduce datele primite de la programul client în baza de date MySQL.

AjaxSvc: Scriptul lateral al serverului executat pe același sistem LAMP unde este executat RESTSvc, returnează datele din baza de date MySQL pentru a afișa tabloul de bord cu date actualizate în timp real.

RESLogger (Ptp145)
PROGRAM RESTLogger
VAR
    DSCmd : BOOL; (* Debug send command *)
    i : UDINT; (* Auxiliary variable *)
    Fp : eFILEP; (* File pointer *)
    REST : RESTClient_v3; (* REST service client *)
    HTTP : HTTPClient_v2; (* HTTP client *)
    JDecode : JSONDecode_v2; (* JSON decode *)
    JEncode : JSONEncode_v1; (* JSON encode *)
    PageFile : STRING[ 32 ] := 'D:/Page.html'; (* Page file *)
    RESTRequest : STRING[ 128 ]; (* REST request *)
    FIFO : FIFOFile_v1; (* FIFO on file *)
    FIFOIDx : ARRAY[0..1] OF UDINT; (* FIFO indexes *)
    FIFOFile : STRING[ 32 ] := 'D:/REST.bin'; (* FIFO file *)
    UTCDateTime : UDINT; (* UTC Date/Time *)
END_VAR

// *****************************************************************************
// PROGRAM "RESTLogger"
// *****************************************************************************
// Eseguo gestione servizio REST sul web.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // ESEGUO INIZIALIZZAZIONI
    // -------------------------------------------------------------------------
    // Eseguo inizializzazione variabili.

    IF (SysFirstLoop) THEN

        // Wear leveling, se i due indici sono uguali eseguo cancellazione
        // file così viene ricreato in una nuova posizione sul disco.

        IF (SysGetFileLen(ADR(FIFOFile)) <> -1) THEN
            IF (FIFOIDx[0] = FIFOIDx[1]) THEN i:=SysFileRemove(ADR(FIFOFile)); FIFOIDx[0]:=0; FIFOIDx[1]:=0; END_IF;
        END_IF;

        // Configurazione REST client.

        REST.SpyOn:=TRUE; //Spy On

        REST.FIFOFile:=ADR(FIFO); //FIFO on file
        REST.FIFOFilename:=ADR(FIFOFile); //Path and name of FIFO file
        REST.FIFOSize:=1000; //FIFO file size
        REST.FIFOIDx:=ADR(FIFOIDx); //FIFO indexes
        
        REST.HostAddress:=ADR('192.168.1.15'); //Host address server REST
        REST.HostName:=REST.HostAddress; //Host name server REST
        REST.Page:=ADR('/RESTLogger/RESTSvc.php'); //Pagina server REST
        REST.HostPort:=80; //Porta server REST
        
        REST.HTTPClient:=ADR(HTTP); //HTTP Client
        REST.HBitTime:=15; //Heartbeat time (S)
        REST.BLength:=512; //REST Request/Answer buffers length
    END_IF;

    // -------------------------------------------------------------------------
    // GESTIONE SERVIZIO REST
    // -------------------------------------------------------------------------
    // Eseguo gestione servizio REST.

    REST(Enable:=TRUE); //Eseguo gestione servizio REST

    // Se errore copio risposta su file per visualizzarla da browser.

    IF (REST.SvcError AND (REST.PBuffer <> NULL)) THEN
         i:=SysFileRemove(ADR(PageFile)); // Cancello file pagina
        Fp:=SysFfopen(ADR(PageFile), ADR('a')); // File pointer
        IF (Fp <> NULL) THEN
            i:=Sysfwrite(REST.PBuffer, TO_INT(Sysstrlen(REST.PBuffer)), 1, Fp);
            i:=Sysfclose(Fp); // Eseguo chiusura file
        END_IF;
    END_IF;

    // -------------------------------------------------------------------------
    // ACQUISIZIONE VALORE VARIABILI IN READ
    // -------------------------------------------------------------------------

//    IF (REST.SvcOk) THEN
//        JDecode(Object:=REST.PBuffer, Name:=ADR('RVariable'), VType:=UDINT_TYPE, VAddress:=ADR(RVariable), VSize:=SIZEOF(RVariable));
//    END_IF;

    // -------------------------------------------------------------------------
    // INVIO VALORI AL SERVER CLOUD
    // -------------------------------------------------------------------------
    // Eseguo temporizzazione invio.
    
    IF (SysGetUTCDateTime(TRUE) <> UTCDateTime) THEN
        UTCDateTime:=SysGetUTCDateTime(TRUE); //UTC Date/Time
        IF ((MOD(UTCDateTime, 60) = 0) OR (DSCmd)) THEN
            DSCmd:=FALSE; //Debug send command

            // Eseguo compilazione dati da inviare al server in JSON.

            i:=Sysmemset(ADR(RESTRequest), 0, SIZEOF(RESTRequest)); //REST request
            JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('Frequency'), VType:=REAL_TYPE, VAddress:=ADR(Frequency));
            JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('Voltage'), VType:=REAL_TYPE, VAddress:=ADR(Voltage));
            JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('AcPower'), VType:=REAL_TYPE, VAddress:=ADR(AcPower));
            JEncode(Object:=ADR(RESTRequest), OSize:=SIZEOF(RESTRequest), Name:=ADR('PwFactor'), VType:=REAL_TYPE, VAddress:=ADR(PwFactor));
            FIFO(In:=TRUE, Dp:=ADR(RESTRequest), Dls:=LEN(RESTRequest)); //Write record on FIFO
        END_IF;
    END_IF;

// [End of file]
RESTSvc.php (Ptp145)
AjaxSvc.php (Ptp145)
A fost util acest articol?