Ho la assoluta necessità di far dialogare un Arduino via Ethernet Shield con uno script PHP che gira su server Apache.
Sostanzialmente quando si apre una data pagina PHP essa si deve connettere via Socket TCP all'Arduino, mandare un comando (richiesta informazioni) e catturare ciò che Arduino risponde sulla socket stessa (risposta informazioni). Ho fatto ovviamente molti test...apro la connessione con fsockopen, scrivo il comando con fwrite e finchè non feof, allora fread x leggere ciò che arriva dalla socket.
Questo non và...mi crea un sacco di problemi:
a volte la connessione và (si apre, leggo, ricevo risposta), ma se poi riprovo (ricarico la pagina) la socket non si apre più e, trascorso il tempo di timeout, la fsockopen restituisce un errore "risposta non corretta da parte dell'host"...passati qualche minuto rifunziona una volta, max due
a volte la lettura dei dati (while !feof => fread) si blocca...cioè proprio la fread non risponde e blocca lo script fino al timeout
Sembra quasi che la lettura dei dati impalli in qualche modo la gestione socket di PHP.
Tra l'altro confermo che in qualsiasi momento l'Arduino risponde in quanto, se mi ci connetto via TELNET, esso è sempre reperibile e a domanda risponde sempre in modo corretto.
VI PREGO AIUTATEMEEEEEEEEEEEEE!!!!!! Ne và della mia salute mentale...
Puoi utilizzare un timeout del socket che sia inferiore a quello del timeout dello script PHP, oppure modificare il timeout dello script con la funzione set_time_limit .
Se pubblichi il codice e' piu' facile vedere cosa non va.
In realtà NI...cioè nel senso che le socket in PHP funzionano benissimo: con la stessa versione di PHP, APACHE, SISTEMA OPERATIVO ho sviluppato e in produzione un client SMTP che si interfaccia direttamente con le socket sui server SMTP di Aruba x spedire Email...tale client è in funzione da 5 anni e non ha mai avuto un errore e, per altro, la comunicazione è molto + complessa di quella che devo fare in questo caso.
Tra l'altro a volte, con PHP-Arduino, la comunicazione funziona anche 2/3 volte...se avevo problemi di SocketClose già dalla 2° volta non avrebbe mai funzionato...invece a volte funziona! E cmq ho controllato.
Nemmeno su Arduino il problema c'è...xkè se la connessione la stabilisco con TELNET...la posso aprire e chiudere tutte le volte che voglio e risponde sempre correttamente.
Quello di Arduino non ce l'ho a disposizione...cmq apre una socket sulla porta 6301, ascolta, quando riceve una riga vuota, invia dei dati...è semplicissimo...e poi, ripeto, funziona con TELNET e pure se apro la comunicazione con un browser (Es. Chrome).
bè nessuno vieta a browser e telnet di usare opzioni per le socket differenti da quelle che usa il PHP.
comuqnue usa l'ultimo codice che ci hai postato e aggiungi i codici di errore, tra l'altro senza codice arduino... Sicuro che arduino prima di chiudere la comunicazione attenda qualse ms per essere sicuro di aver inviato tutti i dati?
Il codice Arduino è semplicissimo...l'ho ricavato dall'esempio "Web Server"...in realtà è esattamente quello, cambiando il numero della porta!
Certo che PHP può "funzionare" diversamente da telnet/browser, ma insomma dovrebbe essere più o meno uno standard quello delle socket TCP. Inoltre ho verificato sul server (WinXP) che non restano connessione ESTABILISHED ne' PENDING tra l'IP del nodo (.177) e localhost sulla porta scelta (6301).
L'errore che dà PHP è "Risposta errata da parte dell'host" o qualcosa del genere...e lo dà solo dopo che la precedente "chiamata" è andata in qualche modo male (ripeto a volte può essere la 2° volta a volte la 3° è capitato, forse una volta soltanto, che ha risposto OK pure 3/4 volte e si è bloccato alla 4°/5°).
magari è il protocollo implementato nel wiznet che non consente ottimizzazioni spinte che usa il PHP, che comunque sarebbe strano se non un bug, ci mancerebbe.
dovresti ottenere il numero di errore, con quell'errore non trovo nulla su google. un'altra opzione è sniffare le cominicazioni con snort o similia, in modo da capire cosa succede veramente
Il tempo di timeout è + che sufficiente...in realtà se la connessione avviene, avviene in pochi millisecondi...10 secondi sono + che tanti...
...per quanto riguarda la length della fread impostata a 128 byte: ho provato con un buffer + grande e + piccolo (fino a 1 byte x volta) e cmq il problema persiste! Tra l'altro il numero di byte che Arduino mi manda sta circa intorno a 100 byte x questi test che sto facendo...a regime saranno pochi byte (<10).