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?
Niet verwonderlijk, je maakt er een string van -een stukje tekst dus-, in plaats van een variabele.

$message = $_POST['ID'];


En let er ook op dat je eerst met deze structuur controleert of er wel ge-POST is:

<?php
if ($_SERVER['REQUEST_METHOD']=="POST") {
	// voer hier alles uit
} else {
	// geef hier eventueel een foutmelding voor als er niet ge-POST is.
} 
?>
Ik heb het aangepast, maar helaas. Als ik na de socket send weer een commando stuur die in het bestand zelf wordt aangehaald komt die wel gewoon binnen met reply. Het zit dus ergens in het POST verhaal, maar ik vind het niet. Is het niet mogelijk om de POST binnen te halen en deze in een cache te zetten ofzo tot het einde van het script?

Anders rest mij maar 1 ding, voor elk commando en apart script maken, helaas werkt me volume slider dan niet welke het belangrijkste is.
Ik neem aan dat jouw script een POST-request ontvangt van een ander?

De POST is overigens al bruikbaar in het hele script. De vraag is eigenlijk of de POST wel de juiste gegevens binnenkrijgt die je wilt gebruiken voor je verwerking.

Kan je dit niet loggen in een textbestand? In $_POST zit de hele array met je POST-informatie, en die kan je handmatig ook in beeld gooien met:

<?php
echo "<pre>".print_r($_POST,true)."</pre>";
?>
Hiermee krijg ik netjes terug:

Array
(
[ID] => format_button=4\r\n
)

De eerste echo in het bestand wil dit ook tonen, de socket alleen verstuurd het commando niet.
Je krijgt blijkbaar van de server dus een error terug. Zou het niet iets met de server dan te maken hebben?
Die moet hij dan toch tonen in de read? Hij weergeeft alle commando's die ik stuur (al stuur ik er 10) behalve de gene van de POST.
Kan je op de server niet loggen wat je precies binnenkrijgt i.p.v. de POST? Want die moet gewoon werken.
Of je roept het script niet als POST op.
Ik zou niet weten hoe dat moet... helaas...

Hoe werkt het loggen en ophalen uit een tekstbestand dan? Er moet natuurlijk platte tekst via de socket verstuurd worden, misschien dat de post functie hier iets aan veranderd waardoor het niet werkt.
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.
Rolf Jungbacker op 26/01/2017 13:09:11

Ik zou niet weten hoe dat moet... helaas...

Hoe werkt het loggen en ophalen uit een tekstbestand dan? Er moet natuurlijk platte tekst via de socket verstuurd worden, misschien dat de post functie hier iets aan veranderd waardoor het niet werkt.

Misschien is het handig te vertellen wat voor server het precies is, waarmee je connect? Of is dat maatwerk? Voor zover ik zie ligt het echt niet aan de POST-functie. Die moet gewoon werken, mits het bestaat. Met mijn code kan je een foutmelding afdwingen als je onverhoopt jouw script niet benadert met een POST-request.

Reageren