Eine REST-Anwendung in der Praxis

In dieser Artikel Wir haben gesehen, wie es möglich ist, Cloud-Anwendungen mit unseren Systemen auf einfachste Weise zu implementieren SlimLine e Netsyst unter Verwendung der REST-Architektur. Lassen Sie uns nun sehen, wie einfach es ist, eine Website zu erstellen, mit der Sie Daten in einer MySQL-Datenbank historisieren und in Tabellen- oder Grafikform anzeigen können. Wir haben ein System in unseren Rechenzentrumsschrank aufgenommen Netsyst die den Verbrauch mit einem SDM120-Netzwerkanalysator überwacht. Die erfassten Daten werden auf dem Produktdisplay angezeigt und per REST an einen Server in der Cloud gesendet.

Das Programm, das die FBs zur Verwaltung des Zählers verwendet Eastron SDM120 Die Erfassung der Verbrauchsdaten erfolgt in einem einfachen FBS-Programm, das von globalen Variablen unterstützt auf dem Display angezeigt und über REST an den Cloud-Server gesendet wird.

Das PHP-Skript auf dem Cloud-Server empfängt die Daten in POST und speichert sie in einer Datenbank, eine HTM-Seite der Konsultation ermöglicht es Ihnen, die auf einem Dashboard empfangenen Daten anzuzeigen. Die Open-Source-Bibliothek wird verwendet, um das Diagramm anzuzeigen Chart.js mit dem Sie Grafiken in HTML5 erstellen können, hier ist, wie es dargestellt wird Armaturenbrett.

Beispielprogramm

Verwendung der Beispiele.
Das Projekt wird zur Verfügung gestellt RESTLogger (Laden Sie das gesamte Projekt herunter) mit dem Demonstrationsprogramm, das das im Beispiel sichtbare Dashboard verwaltet. Das Projekt besteht aus verschiedenen Programmen. Die Liste der wichtigsten Programme, die die Funktionsweise veranschaulichen, ist unten aufgeführt.

RESTLogger: Client, der auf einem System ausgeführt wird SlimLine Dieser erfasst Daten von einem Eastron-Energiezähler und sendet sie in REST an das Serverprogramm.

RESTSvc: Serverseitiges Skript, das auf einem LAMP-System ausgeführt wird und die vom Client-Programm empfangenen Daten in die MySQL-Datenbank einfügt.

AjaxSvc: Das serverseitige Skript, das auf demselben LAMP-System ausgeführt wird, auf dem RESTSvc ausgeführt wird, gibt die Daten aus der MySQL-Datenbank zurück, um das Dashboard mit den aktualisierten Daten in Echtzeit anzuzeigen.

RESTLogger (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)
War dieser Artikel hilfreich?