Vai al contenuto

Decodifica allarmi da richiesta HTTP

Home Forum Programmazione IEC 61131 (LogicLab) Decodifica allarmi da richiesta HTTP

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #80490
    Anonimo
    Inattivo

    Avrei bisogno di una conferma, mi hanno chiesto se è possibile tramite una richiesta GET HTTP inviata da una telecamera esempio:

    http://10.1.50.251:18000/api/v1/nc/inputs/81/alarm

    Attivare una uscita a relè per comandare degli allarmi su di una centralina di allarme.

    Premesso che le telecamere dovrebbero essere più di 40, pensavo di utilizzare la funzione  HTTPServer che rimane sempre in ascolto e poi andare a decodificare la richiesta che arriva.

    E’ possibile?

    #80494
    Sergio Bertana
    Amministratore del forum

    Si certo il FB HTTPServer è stato pensato proprio per poter gestire richieste HTTP sia in GET che in POST, ecco il programma HTTPCamera, un esempio pronto all’uso.

    PROGRAM HTTPCamera
    VAR
        CameraNr : UDINT; (* Numero telecamera *)
        APtr : @STRING; (* Auxiliary pointer *)
        TxData : STRING[ 128 ]; (* Tx data *)
        TxHeader : STRING[ 128 ]; (* Tx header buffer *)
        HTTPSv : HTTPServer_v2; (* HTTP server *)
    END_VAR
    
    // *****************************************************************************
    // PROGRAM "HTTPCamera"
    // *****************************************************************************
    // Gestione uscite allarme su richiesta GET da telecamera, la richiesta è:
    // "http://xxx.xxx.xxx.xxx:2000/api/v1/nc/inputs/81/alarm"
    // -----------------------------------------------------------------------------
    
        // -------------------------------------------------------------------------
        // INIZIALIZZAZIONI
        // -------------------------------------------------------------------------
        // Eseguo inizializzazioni.
    
        IF (SysFirstLoop) THEN
            HTTPSv.Enable:=TRUE; //Server enable
            HTTPSv.SpyOn:=TRUE; //Spy active
            HTTPSv.Port:=2000; //TCP Port
            HTTPSv.AConnections:=2; //Accepted connections
            HTTPSv.HTTPBSize:=1024; //HTTP buffer size
            HTTPSv.HPath:=ADR('C:/'); //Home path (Cortex M7)
            HTTPSv.PDefault:=ADR('Home.html'); //Default page
            HTTPSv.Timeout:=2.0; //Execution timeout (S)
            HTTPSv.Header:=eNULL;
            HTTPSv.CORSHeader:=eNULL;
            HTTPSv.pTxData:=ADR(TxData); //Pointer to Tx data
        END_IF;
    
        // -------------------------------------------------------------------------
        // HTTP SERVER
        // -------------------------------------------------------------------------
        // Gestione server ed attesa ricezione richiesta GET.
    
        HTTPSv(); //HTTP server
        HTTPSv.RAck:=FALSE; //Request acknowledge
        HTTPSv.RNAck:=FALSE; //Request not acknowledge
        IF NOT(HTTPSv.RRcvd) THEN RETURN; END_IF;
        HTTPSv.StatusCode:=eNULL; //Status code
        HTTPSv.TxDSize:=0; //Data to send size
    
        // -------------------------------------------------------------------------
        // ARRIVO SU RICHIESTA PAGINA
        // -------------------------------------------------------------------------
        // Spionaggio pagina richiesta per debug.
        // Spionaggio dati ricevuti con richiesta, (Non dovrebbero essercene).
    
        eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Requested page'), HTTPSv.pPage));
        eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Received data'), HTTPSv.pRxData));
    
        // Cerco percorso pagina fino al numero telecamera per verificare se pagina
        // corretta. In caso contrario ritorno HTTP status=404.
    
        APtr:=SysStrFind(HTTPSv.pPage, ADR('api/v1/nc/inputs/'), FIND_GET_END);
        IF (APtr = eNULL) THEN 
            HTTPSv.StatusCode:=ADR('HTTP/1.1 404 Not Found$r$n');
            HTTPSv.RNAck:=TRUE; //Request not acknowledge
            RETURN;
        END_IF;
    
        // Rilevo il numero di telecamera se errato ritorno HTTP status=400.
    
        IF NOT(SysVsscanf(APtr, ADR('%d'), UDINT_TYPE, ADR(CameraNr))) THEN
            HTTPSv.StatusCode:=ADR('HTTP/1.1 400 Bad request$r$n');
            HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('%s'), STRING_TYPE, ADR('Wrong camera number')));
            HTTPSv.RAck:=TRUE; //Request acknowledge
            RETURN;
        END_IF;
    
        // Se non presente testo "alarm" ritorno HTTP status=400.
    
        APtr:=SysStrFind(APtr, ADR('/alarm'), FIND_GET_END);
        IF (APtr = eNULL) THEN 
            HTTPSv.StatusCode:=ADR('HTTP/1.1 400 Bad request$r$n');
            HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('Alarm not found in camera %d message'), UDINT_TYPE, ADR(CameraNr)));
            HTTPSv.RAck:=TRUE; //Request acknowledge
            RETURN;
        END_IF;
    
        // Messaggio corretto, posso attivare l'uscita relativa al numero di camera.
        // La gestione delle uscite và realizzata in un programma ladder separato.
    
        HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('Camera %d on alarm'), UDINT_TYPE, ADR(CameraNr)));
        HTTPSv.RAck:=TRUE; //Request acknowledge
    
    // [End of file]
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.