Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    Socket: lettura risposta da dispositivo

    Ciao,

    ho un dispositivo (una scheda I/O con 8 relè e 8 ingressi digitali) con a bordo una scheda di rete.

    Devo creare una connessione con il dispositivo per poter leggere lo stato degli ingressi (aperto/chiuso).

    Premesso che non ho capito la differenza tra fsockopen e stream_socket_client (sul manuale dice che sono simili ma la seconda ha maggiori opzioni) ho utilizzato quest'ultima in questo modo:

    Codice PHP:
            // Variabili
            
    $remoteSocket    "tcp://10.1.105.220:3000";
            
    $timeout        30;
            
            
    // Apre la connessione
            
    $handle stream_socket_client($remoteSocket$errorString$errorNumber$timeout);
            
            
    // Setta la connessione in non-blocking mode
            
    stream_set_blocking($handle,0);
            
            if (!
    is_resource($handle)) {
            
                echo 
    "ERRORE: $errorString ($errorNumber)
    "
    ;
                
    //$this->view->connessione = "ERRORE: $errorString ($errorNumber)
    ";
            }
             
            // Connessione riuscita
            else {
            
                echo "
    CONNESSIONE OK";
                
                // Stringa da inviare
               
    $string = "\x01\x30\x30\x02\x59\x03\x59\x0D";
                
                // Scrive la stinga
                fwrite(
    $handle$string);
                
                // Attende 200ms per essere sicuro di avere la risposta completa
                usleep(200000);
                
                // Legge la risposta
                
    $response = fgets($handle);

                // Chiude la connessione
                fclose(
    $handle);
                
                // Stampa la risposta
                echo var_dump(
    $response);
            } 
    Intanto da notare che devo settare il flusso in NON-BLOCKING mode altrimenti quando vado a leggere il risultato si blocca in attesa.
    Se qualcuno mi spiega cosa significa NON-BLOCKING (ho cercato di capire cosa voglia dire e quale sia la differenza ma non mi è per niente chiaro).

    A parte questo la domanda è: ora che ho la risposta (in formato esadecimale) come faccio a leggerne il contenuto?
    Come va gestito una risposta in questo caso?

    In pratica conosco la risposta che mi devo aspettare. Ad esempio in questo caso:

    SOH 0 0 ACK bcc CR

    Quello che mi serve è sapere se il risultato è ACK oppure un NAK.

    Inoltre non capisco il motivo per cui se (come da esempi su PHP) faccio così:

    Codice PHP:
    while (!feof($handle)) {
       echo 
    fgets($handle);

    Per essere sicuro di leggere tutto il flusso mi si blocca in attesa.

    Grazie
    ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Questa ad esempio (è la risposta visualizza facendo un bin2hex($response) ):

    01303006070d

    che corrisponde a :

    SOH <indirizzo nibble alto> <indirizzo nibble basso> ACK <bcc ovvero il checksum calcolato> CR

    Il bcc viene calcolato con un XOR di tutti i dati precedenti partendo da SOH.

    Quello che voglio capire è ad esempio in questo caso se confrontare la stringa di risposta completa oppure prendere solo il risultato, ovvero:

    stringa completa:
    Codice PHP:
    if (bin2hex($response) == '01303006070d') {
        echo 
    'ok';
    } else {
        echo 
    'ko';

    oppure verificare che all'interno del pacchetto ci sia il CR ad esempio e pescare la risposta.

    Calcola che la riposta non sarà sempre fissa. Ad esempio per leggere un ingresso la risposta mi darà quale ingresso e lo stato (un byte per l'ingresso e uno per lo stato dell'uscita).

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Giusto per completare la logica di questo caso vi scrivo come ho letto io una risposta da lettura stato del dispositivo.
    In questo caso il dispositivo risponde con una stringa che contiene dopo un certo comando (in questo caso il carattere G) la codifica in ASCII di un byte.
    Quello che interessa ovviamente sono i singoli stati dei bit (0=contatto aperto, 1=contatto chiuso).

    Il codice è questo, ovviamente se qualcuno ha idee migliori ben vengano:

    Codice PHP:
    // Posizione del comando
    $commandPosition strpos($responseMessage'G');
                    
    // Seleziona il byte dello stato degli input
    $inputStatus substr($responseMessage$commandPosition 12);
                    
    // Converte dalla codifica in ASCII del byte a binario per verificare i singoli bit
    $binaryResponse base_convert($inputStatus162);
                    
    // Aggiunge gli eventuali zeri al byte
    $byteReponse str_pad($binaryResponse8"0"STR_PAD_LEFT);
                    
    // Inverte la stringa per associare la giusta chiave dell'array al numero di bit
    $byteReponseReversed strrev($byteReponse);
                    
    // Splitta il risultato in array
    $bitResponse str_split($byteReponseReversed); 
    Avrò così in risposta una array con chiave=numero del bit e valore=stato del bit.

    Ad esempio una risposta F0 corrisponde a 11110000 ovvero:
    bit 7 = 1
    bit 6 = 1
    bit 5 = 1
    bit 4 = 1
    bit 3 = 0
    bit 2 = 0
    bit 1 = 0
    bit 0 = 0

    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.