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