Door
Rolf Jungbacker
op 26-01-2017 11:03
gewijzigd op 26-01-2017 11:08
2.977 views
Goedendag,
Ik heb een script om een TCP commando te versturen naar een apparaat om een functie uit te voeren. Bij 1 apparaat werkt dit script, bij 2 andere apparaten moet ik een "welkomst bericht" omzeilen.
Dit heb ik gedaan door 2 keer een commando eerst te versturen waarop ik in het script netjes antwoord krijg op de pagina. Daarna haal ik via post een variable commando op, welke dan gestuurd zou moeten worden. Als ik hem in het begin van het scrip echo, weergeeft hij hem netjes. Maar bij het script wordt hij niet uitgevoerd.
Zou iemand kunnen zeggen waar de fout in het script zit?
<?php
$host = "IP";
$port = POORT;
$message = "$_POST[ID]";
$askall = "all=?\r\n";
echo "Message To server: ".$message;
echo "<br><br>";
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
socket_connect($socket, $host, $port) or die("Could not connect to server\n");
// send string to server
socket_write($socket, $askall, strlen($askall)) or die("Could not send data to server\n");
// send string to server
socket_write($socket, $askall, strlen($askall)) or die("Could not send data to server\n");
sleep(1);
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
sleep(1);
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
echo "Reply From Server : ".$result;
// close socket
socket_close($socket);
?>
Je communiceert dus met een apparaat via sockets. Is er geen documentatie over het te gebruiken protocol? Heb je ook geen (web)service waarmee deze lowlevel zut is verpakt in een meer hanteerbare vorm?
Google anders eens op "cp650 tcp commands" of iets soortgelijks (iets met PHP?). Dit levert je dan dingen op als een handleiding.
Het apparaat is het probleem niet, via een client, via de server van de films(ja het is voor een bioscoop) werkt alles. De commando's werken daar ook mee, alleen niet via de post functie. Helaas. Het probleem is dus dat de gegevens die in de php file staan gewoon worden doorgestuurd. De actie vanaf een html pagina dmv een button met post wordt wel netjes ge-echo't op de php pagina, maar niet gebruikt in het script.
Maar, heb je al mijn structuur ingebouwd om te kijken of er daadwerkelijk ge-POST is? Ik kan me niet bedenken waarom een POST-waarde opeens zou verdwijnen. Misschien dat \r\n gestript worden en de waarde foutief op de server binnenkomt?
Uhm, je moet niet letterlijk "\r\n" sturen (een backslash, de letter "r", nog een backslash en de letter "n"), maar de controle-codes voor een normale regelovergang.
Of nog beter, je verstuurt via je formulier alleen de instructie ("format_button=4") en plakt hier in je PHP-code een regelovergang aan vast.
EDIT of een nog verdere abstractie zodat je niet letterlijk rauwe instructies aan het invullen bent maar met dropdowns werkt enzo zodat altijd geldige opties en waarden worden verstuurd.
Maak van $message bijvoorbeeld:
<?php
// $_POST['ID'] should only contain <option>=<value> - nothing less, nothing more
$message = $_POST['ID'].chr(13).chr(10); // attach carriage return and linefeed to cp650 command
?>
Maar, heb je al mijn structuur ingebouwd om te kijken of er daadwerkelijk ge-POST is? Ik kan me niet bedenken waarom een POST-waarde opeens zou verdwijnen. Misschien dat \r\n gestript worden en de waarde foutief op de server binnenkomt?
Sorry vergeten te vermelden, als ik dat toevoeg dat krijg ik een 500 fout.
<code>
<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
echo "Message To server: ".$message;
echo "<br><br>";
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
socket_connect($socket, $host, $port) or die("Could not connect to server\n");
// send string to server
socket_write($socket, $askall, strlen($askall)) or die("Could not send data to server\n");
sleep(1);
// send string to server
socket_write($socket, $askall, strlen($askall)) or die("Could not send data to server\n");
sleep(1);
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
sleep(1);
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
sleep(1);
echo "Reply From Server : ".$result;
// close socket
socket_close($socket);
BLA BLA kan je er niet zomaar plaatsen. Echo het dan op zijn minst.
En de code-tags werken met blok-haken i.p.v. vissehaakjes. ;)
Thomas van den Heuvel op 26/01/2017 13:32:58
Uhm, je moet niet letterlijk "\r\n" sturen (een backslash, de letter "r", nog een backslash en de letter "n"), maar de controle-codes voor een normale regelovergang.
Hmm.. die is even nieuw voor mij.
Maar wat zou er mis kunnen gaan anders? Het komt op dezelfde output neer, lijkt me?
Ik snap het, al zou je het echo'en met double-quotes zou je die tekens weer niet zien. Bij single-quotes weer wel.
Maar het is inderdaad een goede pitfall om over na te denken. ;-)