Hallo!
bin grade an einem Projekt dran wo ich an einen Dimmer auf ESP8266 Basis
(Arduino Framework) über eine PHP Website mit TCP Sockets ein Bytearray
senden will.
Mit VB.NET klappt das schon sehr gut, allerdings ist mein PHP Wissen
extrem eingerostet (zuletzt mit PHP4 gearbeitet).
Im Wesentlichen hab ich ein Commandbyte, z.B. 0x20 und dann z.B. 12 Bit
PWM Werte die unter VB.NET als unsigned 16 Bit Integer abgebildet, per
Bitshifting in zwei einzelne Bytes zerlegt und dann ins Bytearray
gepackt und versendet werden.
Genau hier scheitert es bei PHP bei mir. Habe schon die pack() Funktion
gefunden und konnte auch schon einzelne Bytes versenden (sind auch
richtig angekommen). Sobald es jedoch darum ging, unsigned 16 Bit
Integer und unsigned 8 Bit Integer auf einmal zu versenden, also mit
einem pack() in eine Variable zu speichern um diese dann zu verschicken,
kam nur Müll an.
Habe es mit Little und Big Endian probiert.
Bin einfach überfordert und konnte trotz stundenlanger Recherche und
Kopfzerbrechen nicht zu einer Lösung finden.
Für manche Dinge bin ich wohl einfach zu blöd bzw. verstehe sie erst,
wenn ich die Lösung vor den Augen habe (sprich: wenn es mir jemand
vorgekaut hat).
Bitte um Nachsicht diesbezüglich, habe mir echt schon die Doku u.a. von
pack, unpack, ... reingezogen und etliche Threads auf stackoverflow
umgegraben, verstehe es trotzdem nicht.
Danke für eure Hinweise!
Lucas N. schrieb:> Im Wesentlichen hab ich ein Commandbyte, z.B. 0x20 und dann z.B. 12 Bit> PWM Werte die unter VB.NET als unsigned 16 Bit Integer abgebildet, per> Bitshifting in zwei einzelne Bytes zerlegt und dann ins Bytearray> gepackt und versendet werden.
Das kannst Du genauso auch in PHP machen. Am besten zeigst Du mal den
funktionierenden VB-Code.
Danach muss man dann die Antwort lesen. In dem ESP-Beispiel-Code wird
nur ein Byte (nämlich 0xF0) zurückgegeben, im VB-Code sehe ich
irgendwelche möglichen Werte mit mit Datenlänge 9.
Du kannst ja mal selbst schauen, lesen der Antwort geht mit:
1
$maxlen = 9; // oder ein anderer Wert
2
$result = socket_read ($socket, $maxlen);
Notfalls machst Du auch eine Schleife über Read jedes einzelnen
Zeichens:
Frank M. schrieb:> $packet = pack("CSSSSSSSS", 0x20, $ch1, $ch2, $ch3, $ch4, $ch5, $ch6,> $ch7, $ch8);
"CSSSS..." war die ausschlaggebende Information, vielen Dank! Könnte mir
auf den Kopf greifen, das ist ja eh ähnlich wie printf in C.
> Danach muss man dann die Antwort lesen. In dem ESP-Beispiel-Code wird> nur ein Byte (nämlich 0xF0) zurückgegeben, im VB-Code sehe ich> irgendwelche möglichen Werte mit mit Datenlänge 9.
Die Länge der Antwort hängt vom Kommando ab. Manche Kommandos bekommen
nur 0xF0 zurück (einfaches ACK), manche bekommen eine komplette Antwort
inkl. Daten retour.
> Du kannst ja mal selbst schauen, lesen der Antwort geht mit:$maxlen = 9;> // oder ein anderer Wert> $result = socket_read ($socket, $maxlen);> Notfalls machst Du auch eine Schleife über Read jedes einzelnen> Zeichens:$result = socket_read ($socket, 1);>> Googlen nach "socket_read php" hilft weiter.
Danke, hast mir jedenfalls schon sehr weitergeholfen. Da hätte ich
wieder mal echt selbst draufkommen können.
Mein Code hat, bis auf das von dir gelieferte "CSSSSSSSS" so ausgesehen,
habe das mit fsockopen statt mit socket_create und socket_connect
gemacht. Wo liegt denn da der Unterschied? Habe irgendwo gelesen, dass
fsockopen viel langsamer sein soll, kann ich aber irgendwie nicht ganz
glauben...