HI Leute
Ich bastle mir gerade ein eigenes Messgerät mit dem guten Raspi und jetzt bin ich an nem Punkt angelangt wo ich auf zusätzliche Hilfe angewiesen bin.
Zum Hintergrund:
Das gute Stück soll irgendwann Vierpole messen und die MEsskurven dann irgendwie grafisch aufbereiten. Da ich Platformunabhängig bleiben möchte und das Messergebniss gegebenfalls auf dem Smartphone im Warmen (Antennenmessung) ansehen möchte kam ich sofort zu der Lösung irgendwas mit Webinterface. Da die Daten, aber relativ schnell aktualisiert werden sollen, bin ich auf den Websocket gekommen um mir die MEssdaten vom Rasp auf das Endgerät zu streamen.
Nun komme ich auf den Punkt meines Problems.
Ich habe es bereits zusammengebracht, eine server.php zu schreiben welche ich dann in der shell mit php -q C:/xampp/htdocs/rasp/server.php starte.
Der Client ladet dann quasi eine index.html mit einem JavaScript CodeSchnipsel, der die Verbindung dann aufbaut.
Nun schaffe ich es ja schon über das Handshake, was schon ein kleiner brocken war. Jetzt kommt aber der Hund: Sobald ich vom Server eine Nachricht schicken möchte, kommt am Client nichts an.
Hier sind die relevanten Codeteile:
Server.php
<?php
// set some variables
$host = "192.168.1.101";
$port = 5000;
$zeile ="";
//Create TCP/IP sream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//reuseable port
// socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
//bind socket to specified host
socket_bind($socket, 0, $port);
//listen to port
socket_listen($socket);
//create & add listning socket to the list
$clients = array($socket);
echo "waiting for Client\n";
//start endless loop, so that our script doesn't stop
while (true)
{
// Accept new conection
$socket_new = socket_accept($socket);
$header = socket_read($socket_new, 1024); //read data sent by the socket
perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake
socket_getpeername($socket_new, $ip);
echo "Client = $ip \n";
// Hier muss zunächst die chart.txt geöffnet werden
$pChart = fopen("C:/xampp/htdocs/rasp/chart.txt", "r");
// Dann aus ihr auslesen auch wenns nur mal eine Zeile ist
$zeile = fgets($pChart);
//das '\n' am Ende der Zeile entfernen
$zeile = substr($zeile, 0, -1);
echo "$zeile";
socket_write($socket_new, $zeile, strlen($zeile));
// Bei einem der Recherc he Links stand, dass nur durch nachträgliches Senden von \r und \n der Client erst auf die Nachrichten reagiert. Link: http://php.net/manual/de/function.socket-write.php
socket_write ($socket_new, "\r\n", strlen ("\r\n"));
// Textfile schließen
fclose($pChart);
$bytes = @socket_recv($s, $buffer, 2048, 0);
echo $bytes;
}
// close socket
socket_close($socket);
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
$headers = array();
$lines = preg_split("/\r\n/", $receved_header);
foreach($lines as $line)
{
$line = chop($line);
if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
{
$headers[$matches[1]] = $matches[2];
}
}
$secKey = $headers['Sec-WebSocket-Key'];
$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
//hand shaking header
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"WebSocket-Origin: $host\r\n" .
"WebSocket-Location: ws://$host:$port/rasp/server.php\r\n".
"Sec-WebSocket-Accept:$secAccept\r\n\r\n";
socket_write($client_conn,$upgrade,strlen($upgrade));
echo "Handshake done!\n";
}
?>
Alles anzeigen
Und hier noch die index.html mit dem Ausschnitt aus dem JavaScript-Code:
<script type="text/javascript">
var connection = new WebSocket('ws://192.168.1.101:5000/rasp/server.php');
//If the conection is set, display it on to the screen
connection.onopen = function(ev)
{
// connection is open
// alert("Connection opened"); //notify user
//$('#placeholder').html('Connection opend');
socket.send("Ich bin drin !");
};
connection.onerror = function (error)
{
alert('WebSocket Error ' + error.data);
};
connection.onmessage = function(msg)
{
alert("We have a Message");
//$('#placeholder').html(msg);
//document.getElementById("placeholder").innerHTML = msg.data;
};
</script>
Alles anzeigen
Ich habe mir alle möglichen Dinge ausgeben lassen, hab an der Formatierung des zu sendenden Strings gefeilt aber da geht nichts.