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);
?>

Reply is:
Message To server:
format_button=4\r\n

Reply From Server :
---===[ Welcome to the CP650. ]===---
error
fader_level=35 format_button=7 format_list=11, 4, 5, 10, 11, 65, 61, 75 global_delays=63, 0, 0, 0, 0, 0, 0, 0 mute=0 preset_fader_level=50, 40, 40, 40, 40, 45, 40, 35 projector=1 user_formats=65, 61, 75

Hier moet dus als laatste binnen komen format_button=4\r\n wat niet gebeurd, de button wordt ook niet gewijzigd.

Wie kan mij vertellen waar ik de fout in ga?
Thomas van den Heuvel op 26/01/2017 13:12:22

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.

Het betreft dus een Dolby CP650 voor de cinema ;)

En als je de waarde uit de POST['ID'] (dus: format_button=4\r\n) eens hard-coded meestuurt. Dan doet hij het wel?
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
?>
- Ariën - op 26/01/2017 13:31:28

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") {

$host = "";
$port = ;
$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");
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);

} else {
BLABLA
}
?>
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?
Message To server:
format_button=4[color=#ff0000]\r\n[/color]

Dit commando heeft het verkeerde formaat, zie mijn vorige reactie.

@Ariën, nee, de topicstarter verstuurt letterlijk de tekst \r\n in plaats van een regelovergang.

4\r\n is geen getal, daarom krijg je ook de respons "error".
- Ariën - op 26/01/2017 13:37:33

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. ;)

Aha, naja sorry! zal het er zo weer inplaatsen.

Maar ik heb de $message aangepast en hij werkt!!

Dit had ik zelf niet kunnen vinden, bedankt!
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. ;-)

Reageren