Decodifica allarmi da richiesta HTTP
Home › Forum › Programmazione IEC 61131 (LogicLab) › Decodifica allarmi da richiesta HTTP
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 1 mese, 1 settimana fa da
Sergio Bertana.
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
-
AutorePost
-
Marzo 12, 2025 alle 3:38 pm #80490
Anonimo
InattivoAvrei 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?
Marzo 12, 2025 alle 3:43 pm #80494Sergio Bertana
Amministratore del forumSi 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]
-
AutorePost
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
- Devi essere connesso per rispondere a questo topic.